1

我在 Listadapter 的 getView 上从缓存中加载图像时遇到了一个大问题。对于图像加载,我们使用的是 Picasso,在那里我构建了一个从缓存加载图像的结构,如果没有可用的图像,那么应该从在线 URI 加载图像。

(这是一个方法,在我getView的适配器中调用)

 @Override
protected void loadImages(final VehicleResultListItem inCurrentItem) {

    // Try to load async the images from local path

    Picasso.with(mContext)
           .load(new File(mContext.getExternalFilesDir(null),
                          inCurrentItem.getVehicleId()))
           .placeholder(inCurrentItem.getServiceType().getPlaceholderId())
           .noFade()
           .into(new Target() {
               @Override
               public void onBitmapLoaded(final Bitmap bitmap,
                                          final Picasso.LoadedFrom from) {
                   mThumbnailImgView.setImageBitmap(bitmap);
               }

               @Override
               public void onBitmapFailed(final Drawable errorDrawable) {
                   // If the local-path-loading fails, try to grab the images online.
                   Picasso.with(mContext)
                          .load(inCurrentItem.getImageURIs().get(0).getImageUriSizeM())
                          .placeholder(inCurrentItem.getServiceType().getPlaceholderId())
                          .into(new Target() {
                              @Override
                              public void onBitmapLoaded(final Bitmap bitmap,
                                                         final Picasso.LoadedFrom from) {
                                  // On succesfully online-loading of the images, store and show them
                                  mThumbnailImgView.setImageBitmap(bitmap);
                                  saveToInternalSorage(bitmap, inCurrentItem);
                              }

                              @Override
                              public void onBitmapFailed(final Drawable errorDrawable) {
                                  // NO interaction
                              }

                              @Override
                              public void onPrepareLoad(final Drawable placeHolderDrawable) {
                                  // No interaction
                              }
                          });
               }

               @Override
               public void onPrepareLoad(final Drawable placeHolderDrawable) {
                   mThumbnailImgView.setImageDrawable(placeHolderDrawable);
               }
           });
}

问题是,图像加载正确,但图像加载后 imageView 没有更新。在 OnImageLoaded 中,我不在 UI 线程中,因此它不会更新视图。所以我尝试了任何东西:

看起来线程变得混乱或类似的东西。

在 Picasso-Target 中调用 Picasso 可能有问题?

你有什么建议吗?

问候和谢谢

4

1 回答 1

3

Target不能是匿名类。Picasso保持一个 WeakReferenceTarget很可能在请求完成时得到 gc'ed。

Javadoc 清楚地说明了这一点。

改为使用您的View工具并将其用作目标或保留对目标实例的引用。Target

还会Picasso自动为您处理磁盘缓存,除非您已将资产与您的应用程序一起提供,否则我建议您只需下载它们,然后让Picasso您为您管理磁盘/内存缓存。

于 2014-04-15T17:51:48.263 回答