2

私は Facebook で Fresco ライブラリを使用しようとしています。

ドキュメントから、画像のキャッシュはImagePipelineSimpleDraweeView. Fresco が私の URI から画像をフェッチしても、DiskCache や他のキャッシュ内の画像がそれに置き換えられないというマイナーな問題があるだけで、物事が完全に機能していることがよくわかります。

キャッシュをクリアした後、アプリを初めて実行したときに画像が表示され、 aRequestListenerと a のControllerListener両方が成功したため、コードが画像をフェッチすることに前向きです。

これが私の現在の設定です:

// Setting the collaborator image.
GenericDraweeHierarchy collaboratorPicHierarchy =
    genericDraweeHierarchyBuilder
         .setPlaceholderImage(
             getInitialsAsDrawable(
                 collaborator.getUser().getInitials()
             )
         )
         .setRoundingParams(new RoundingParams()
             .setRoundAsCircle(true)
         )
         .build();
    holder.collaborator.setHierarchy(collaboratorPicHierarchy);
    holder.collaborator.setImageURI(
        Uri.parse(AltEngine.formURL("user/getProfilePic/") +
            accessToken + "/" +
            collaborator.getUser().getUuid()
        )
);

このコードはすべて Adapter 内にあり、Fresco を初期化した Adapter のコンストラクター内にあります。

imagePipelineConfig = ImagePipelineConfig.newBuilder(this.context)
    .build();
Fresco.initialize(this.context, imagePipelineConfig);

StackOverflow で多くの検索を行った後、次のスニペットを使用できることがわかりました。

Fresco.getImagePipelineFactory().getMainDiskStorageCache().remove(new SimpleCacheKey(uri.toString()));
Fresco.getImagePipelineFactory().getSmallImageDiskStorageCache().remove(new SimpleCacheKey(uri.toString()));

に関連付けたインスタンスでそれonRequestSuccessを試しましたが、リフレッシュするたびにプレースホルダーが表示されてしまいました。これは悪いことです。ImageRequestSimpleDraweeViewListView

私が見つけた次の解決策は、ここAndroid - How to get image file from Fresco disk cache? からでした。これは、Fresco が DiskCache を無効にするために独自のものを実装する必要があるかもしれないことを示唆していたDiskCacheConfigので、SO の質問で見つけたコードで DiskCache を構成しようとしました。

DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder().setBaseDirectoryPath(this.context.getCacheDir())
    .setBaseDirectoryName("v1")
    .setMaxCacheSize(100 * ByteConstants.MB)
    .setMaxCacheSizeOnLowDiskSpace(10 * ByteConstants.MB)
    .setMaxCacheSizeOnVeryLowDiskSpace(5 * ByteConstants.MB)
    .setVersion(1)
    .build();
imagePipelineConfig = ImagePipelineConfig.newBuilder(this.context)
    .setMainDiskCacheConfig(diskCacheConfig)
    .build();
Fresco.initialize(this.context, imagePipelineConfig);

それでもキャッシュはネットワークからの画像によって更新されません。

ここで何がうまくいかなかったのかわかりません。私はフレスコを完全に間違っているかもしれません。どのように私はここで立ち往生しており、続行する方法についての手がかりがありません. 私はドキュメントを数回確認しましたが、運が悪かったため、重要なことを見逃している可能性があります。適切な方向に向けてください。

4

1 に答える 1

1

これは基本的に、 https ://github.com/facebook/fresco/issues/124 で尋ねられた質問と同じです。

実際、上に貼り付けた 2 行のディスク キャッシュからの削除については、ほぼ正しい考えでした。適切な場所でそれらを呼び出すだけです。onRequestSuccessダウンロードしたばかりの画像に影響を与えるため、適切な場所ではありません。

新しいエントリのリクエストを送信する前に、古いエントリをキャッシュから削除したい場合。Fresco がディスク上で画像を見つけた場合、ネットワーク リクエストを送信することさえしません。

于 2015-06-28T23:17:09.503 に答える