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 を呼び出す際に問題があるのでしょうか?

何か提案はありますか?

グリーツとthx

4

1 に答える 1

3

Target匿名クラスであってはなりません。リクエストが完了するまでにGCされる可能性が最も高いPicassoWeakReferenceを保持します。Target

Javadoc はそれを明確に述べています。

代わりにView実装Targetを作成し、それをターゲットとして使用するか、ターゲット インスタンスへの参照を保持します。

またPicasso、ディスク キャッシュも自動的に処理します。アセットをアプリに同梱していない限り、アセットをダウンロードしてからPicassoディスク/メモリ キャッシュを管理することをお勧めします。

于 2014-04-15T17:51:48.263 に答える