使用Picasso在后台线程上同步加载图像 - 没有.get()

Jac*_*bak 2 android picasso

我有一个自定义视图组(包含加载毕加索的图像),可以在两个地方重用:

  1. 在应用程序中显示给用户(在UI线程上)
  2. 绘制到画布并保存为.jpeg(在后台线程上)

我绘制到画布的代码如下所示:

int measureSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
view.measure(measureSpec, measureSpec);
Bitmap bitmap =
      Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.draw(canvas);
Run Code Online (Sandbox Code Playgroud)

问题是在我将视图绘制到画布之前没有时间加载图像.我试图尽量避免在这里进行耦合,所以我不想添加Picasso回调,因为正在进行绘制的类对它正在绘制的视图一无所知.

我目前正在通过将图像加载代码更改为.get()而不是.load()然后使用来解决此问题imageView.setImageBitmap().不幸的是,这给视图增加了很多复杂性,我真的不喜欢它.

我想做的是向Picasso的RequestCreator传递一个选项,即请求应该在当前线程上同步执行(如果它是主线程则抛出异常).我想知道这对于直接建立毕加索的支持来说是不是太过分了?或者它已经在API中了,我对此无动于衷?

Jac*_*bak 12

这是我的解决方案:

/**
 * Loads the request into an imageview.
 * If called from a background thread, the request will be performed synchronously.
 * @param requestCreator A request creator
 * @param imageView The target imageview
 * @param callback a Picasso callback
 */
public static void into(RequestCreator requestCreator, ImageView imageView, Callback callback) {
  boolean mainThread = Looper.myLooper() == Looper.getMainLooper();
  if (mainThread) {
    requestCreator.into(imageView, callback);
  } else {
    try {
      Bitmap bitmap = requestCreator.get();
      imageView.setImageBitmap(bitmap);
      if (callback != null) {
        callback.onSuccess();
      }
    } catch (IOException e) {
      if (callback != null) {
        callback.onError();
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)