【问题标题】:Set image downloaded (with interceptor) using Picasso使用毕加索设置下载的图像(带有拦截器)
【发布时间】:2016-03-05 04:03:00
【问题描述】:

this 回答之后,我正在尝试使用毕加索在 ListView 中延迟加载图像。这是我的代码:

public class PicassoInterceptor implements Interceptor {

private String param1;
private String param2;
private String param3;
private int param4;
private String param5;

public PicassoInterceptor(String param1, String param2, String param3, int param4, String param5) {
    this.param1 = param1;
    this.param2 = param2;
    this.param3 = param3;
    this.param4 = param4;
    this.param5 = param5;
}

@Override
public Response intercept(Chain chain) throws IOException {
    final MediaType JSON
            = MediaType.parse("application/json; charset=utf-8");
    Map<String, String> map = new HashMap<String, String>();
    map.put("param1", param1);
    map.put("param2", param2);
    map.put("param3", param3);
    map.put("param4", String.valueOf(param4));
    String requestJsonBody = new Gson().toJson(map);
    RequestBody body = RequestBody.create(JSON, requestJsonBody);
    final Request original = chain.request();
    final Request.Builder requestBuilder = original.newBuilder()
            .url(param5)
            .post(body);
    return chain.proceed(requestBuilder.build());
}
}

适配器,在 getView 方法中:

OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.interceptors().add(new PicassoInterceptor(param1, param2,param3,param4, param5));

    OkHttpDownloader downloader = new OkHttpDownloader(okHttpClient);
    Picasso picasso = new Picasso.Builder(context).downloader(downloader).build();

现在,如果我理解正确,图像已下载。但是,如何在图像视图中设置呢?

编辑:

图像是在 BASE64 中接收的。

【问题讨论】:

  • 不是我想要的方式,不得不要求服务器人员将方法从 POST 更改为 GET,并构建 URL。那样,是有效的,但没有设法使它与 POST 一起工作。

标签: android lazy-loading picasso


【解决方案1】:

用途:

picasso.load(param5).fit().into(imageView);

你给 load() 函数的 url 并不重要——因为你在拦截器中覆盖了它。但我仍然会给出一个合法的 - 以避免出现问题。

或者你可以这样编辑你的拦截器:Picasso load image with HTTP post

【讨论】:

  • 而 photoUri 是...?我没有 URI。
  • 毕加索是用来加载图片的,所以你必须有一张你想加载的图片。 “加载”函数可以获取文件、Uri、URL 或资源 ID。你要加载什么图片?
  • 我知道毕加索的用途。问题是,我需要使用 POST 请求下载图像,这就是我使用拦截器的原因,因为“默认”用法是使用 GET 请求。由于 URL 将始终相同(因为它是一个发布请求),因此您的方式将行不通。
  • 啊,你没有写到 URL 不会改变。所以它总是相同的 URL,你通过改变请求的正文得到不同的图像?
  • 它是一个post请求,URL是一样的,params在body里面。那就是构造函数中的参数是for。服务器获取这些参数,并返回正确的图像。
【解决方案2】:

只需添加into() 方法并传递ImageView:

Picasso picasso = new Picasso.Builder(context).into(imageView).downloader(downloader).build();

【讨论】:

  • 那行不通。无法调用您编写它的方法。
  • 你需要创建一个构造函数,只需在这个类 PicassoInterceptor 中传递一个 imageView
  • 但是我不能调用你放置它的方法......另外,这段代码在 ListView 的适配器中,而不是拦截器中。
猜你喜欢
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2016-07-17
  • 2017-06-15
  • 2019-07-31
  • 1970-01-01
  • 2014-09-26
相关资源
最近更新 更多