android - 使用 OkHTTP 的 Picasso 无法加载其 URL 中包含竖线字符 ("|") 的图像

android - Picasso with OkHTTP can not load images containing vertical bar character ( "|" ) in their URL

我在项目中使用 Picasso 和 MapBox。只要 MapBox 的依赖项中有 OkHTTP,我就不得不使用 OkHTTP。 但是当我将 OkHTTP 添加到 gradle 依赖项时,Picasso 无法加载在其 URL.

中包含竖线字符 ("|") 的图像

没有 OkHTTP:

Picasso.with(context).load("http://example.com/image.jpg").into(imageView); //OK Picasso.with(context).load("http://example.com/image.jpg|100:100").into(imageView); //OK

使用 OkHTTP:

Picasso.with(context).load("http://example.com/image.jpg").into(imageView); //09-01 19:07:35.280 24916-24916/com.test D/Picasso﹕ Main errored [R6]+287ms

Picasso.with(context).load("http://example.com/image.jpg|100:100").into(imageView); //OK

所以,我的问题是:如果另一个库需要 OkHTTP,如何避免将 OkHTTP 与 Picasso 一起使用,或者如何解决此问题并继续使用 OkHTTP?

试试 OkHttp 2.5.0。它支持包含 | 字符的 URL。

我已经通过在 MyApplication.onCreate() 方法中添加下一个代码解决了这个问题:

    Picasso picasso = new Picasso.Builder(getApplicationContext())
            .requestTransformer(new Picasso.RequestTransformer() {
                @Override
                public Request transformRequest(Request request) {
                    Uri oldImageUri = request.uri;
                    Uri newImageUri = oldImageUri.buildUpon().query(oldImageUri.getEncodedQuery()).build();
                    return request.buildUpon().setUri(newImageUri).build();
                }
            }).build();
    picasso.setLoggingEnabled(true);
    Picasso.setSingletonInstance(picasso);

我刚开始使用OkHttp的时候遇到了同样的问题。问题似乎是必须对竖线字符进行编码。只需用编码值 (%7C) 替换它,它应该可以正常工作。在您的情况下,url 变为:

http://example.com/image.jpg%7C100:100