我在我的项目中使用 Picasso v2.5.2。它工作正常,但是,在某些情况下,url 中有一个 % 字符,在这种情况下,Picasso 会抛出错误。
String url = "http://dev.api.getmyparking.com:5000/api/v1/Containers/gmp-booking-tickets/download/AVGA3JJ%25UAB.png";
Picasso picasso = new Picasso.Builder(this).listener(new Picasso.Listener() {
@Override
public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
exception.printStackTrace();
}
}).build();
picasso.setLoggingEnabled(true);
picasso.load(url).placeholder(R.drawable.parking_placeholder).error(R.drawable.icn_rupee).into(mIvTicket);
以上代码报错如下:
11-07 17:07:17.383 9531-9531/com.gmpuser.app W/System.err: java.io.IOException: Invalid % sequence: %UA in path at index 91: http://dev.api.getmyparking.com:5000/api/v1/Containers/gmp-booking-tickets/download/AVGA3JJ%UAB.png
11-07 17:07:17.383 9531-10104/com.gmpuser.app D/Picasso: Dispatcher delivered [R0]+1258ms
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.Request.uri(Request.java:64)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:268)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:500)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.UrlConnectionDownloader.load(UrlConnectionDownloader.java:93)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.NetworkRequestHandler.load(NetworkRequestHandler.java:47)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:206)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.lang.Thread.run(Thread.java:818)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411)
编码 URL 似乎是一种解决方案,但是,我使用 Uri.encode 对 url 进行编码,然后将编码后的字符串提供给 Picasso,但效果不佳。
String url = "http://dev.api.getmyparking.com:5000/api/v1/Containers/gmp-booking-tickets/download/AVGA3JJ%25UAB.png";
String urlEncoded = Uri.encode(url);
Picasso picasso = new Picasso.Builder(this).listener(new Picasso.Listener() {
@Override
public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
exception.printStackTrace();
}
}).build();
picasso.setLoggingEnabled(true);
picasso.load(urlEncoded).placeholder(R.drawable.parking_placeholder).error(R.drawable.icn_rupee).into(mIvTicket);
上面的代码报错如下
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: java.lang.IllegalStateException: Unrecognized type of request: Request{http%3A%2F%2Fdev.api.getmyparking.com%3A5000%2Fapi%2Fv1%2FContainers%2Fgmp-booking-tickets%2Fdownload%2FAVGA3JJ%25UAB.png}
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter$2.load(BitmapHunter.java:66)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:206)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.lang.Thread.run(Thread.java:818)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411)
最佳答案
试试这个,
String urlStr = "http://dev.api.getmyparking.com:5000/api/v1/Containers/gmp-booking-tickets/download/AVGA3JJ%25UAB.png";
String url = Uri.parse(urlStr)
.buildUpon()
.build()
.toString();
看我的回答here .
关于java - 无法使用 picasso 加载 url 中包含 % 的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40464771/