Picasso在自定义View中的逻辑并发问题

时间:2016-08-29 04:54:42

标签: android multithreading picasso

我正在创建一个自定义View,用于显示Picasso框架加载的Bitmap图片。要成功初始化,我需要位图和视图测量。我正在努力使用线程,因为我无法预测哪个线程会提前完成。

该视图在其构造函数中以自定义Target启动Picasso。它会在onSizeChanged中保存视图的宽度和大小。

public class FigureView extends View {

public FigureView(Context context) {
    super(context);
    target = new LoadPictureTarget();
    Picasso.with(getContext()).load(R.drawable.amalka).into(target);
}

protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    tilesRect.set(0, 0, w, h);
}

目标设置位图并计算调整大小的图片尺寸以适合视图的可用空间:

class LoadPictureTarget implements Target {
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        baseBitmap = bitmap;
        origPictureRect = new Rect(0, 0, baseBitmap.getWidth(), baseBitmap.getHeight());
        scaledPictureRect = Misc.centerHorizontally(tilesRect.width(), tilesRect.height(), baseBitmap.getWidth(), baseBitmap.getHeight());            invalidate();
    }

    public void onBitmapFailed(Drawable errorDrawable) { }

    public void onPrepareLoad(Drawable placeHolderDrawable) {  }
}

问题是有时onBitmapLoaded的调用时间早于onSizeChanged。但并非总是如此,所以我也无法在那里进行新的维度计算。现在我把它移到了onPaint(),但这不是一个解决方案,因为我需要在我有位图和可用空间尺寸后执行密集位图操作。

当我需要视图大小时,使用Picasso实现自定义视图的正确方法是什么?

0 个答案:

没有答案