有时Picasso不会从内存缓存中加载图像

Sha*_*sal 1 android picasso

 private class CustomAdapter extends CursorAdapter {

@Override
public void bindView(View view, Context context, Cursor cursor) {
    if (view != null) {

        String url = cursor.getString(CONTENT_URL_COLUMN);
        ViewHolder viewHolder = (ViewHolder) view.getTag();
        final ImageView imageView = viewHolder.mImageViewIcon;
        final TextView textView = viewHolder.mTextViewName;

            Picasso.with(context).load(url).into(new Target() {

                @Override
                public void onBitmapLoaded(Bitmap arg0, LoadedFrom arg1) {
                    imageView.setImageBitmap(arg0);
                    imageView.setVisibility(View.VISIBLE);
                    textView.setVisibility(View.GONE);
                }

                @Override
                public void onBitmapFailed(Drawable arg0) {
                    imageView.setVisibility(View.GONE);
                    textView.setVisibility(View.VISIBLE);
                }
             });
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

如果已经下载了图像列表,则在快速滚动列表时, 调用onBitmapLoaded()方法并从内存缓存加载图像.但有时onBitmapFailed()调用.为什么?

Jak*_*ton 7

Target被垃圾收集,因为什么都没有引用它.毕加索使用WeakReference时持有ImageViews或Targets.

但是,您根本不需要使用Target.只需使用回调.intoImageView直接传递即可.

Picasso.with(context).load(url).into(imageView, new Callback() {
  @Override public void onSuccess() {
    imageView.setVisibility(VISIBLE);
    textView.setVisibility(GONE);
  }

  @Override public void onError() {
    imageView.setVisibility(GONE);
    textView.setVisibility(VISIBLE);
  }
});
Run Code Online (Sandbox Code Playgroud)