web-dev-qa-db-ja.com

オフラインの場合、Picassoを使用してディスクキャッシュから画像を読み込む

これを行うことで、アプリの起動時にさまざまなWebサイトからダウンロードした画像がいくつかあります。

Picasso.with(context).load(image_url).fetch();

ここで、ユーザーがアプリを閉じてオフラインになったとします。アプリが再び起動すると、ピカソは次のように画像を表示します。

Picasso.with(ctx).load(image_url).placeholder(R.drawable.ph).into(imageView);

問題は、一部の画像がディスクキャッシュから読み込まれ(デバッグモードでは黄色の三角形)、他の画像ではピカソがプレースホルダーを表示することです。

どうして?私はすべての画像がディスクキャッシュからロードされることを期待しています。

21
Daniele Vitali

この戦略でこのコードを使用できます。Picassoはキャッシュ内の画像を検索し、失敗した場合にのみネットワーク経由で画像をダウンロードします。

 Picasso.with(context)
                    .load(Uri.parse(getItem(position).getStoryBigThumbUrl()))
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .into(holder.storyBigThumb, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {
                            // Try again online if cache failed
                            Picasso.with(context)
                                    .load(Uri.parse(getItem(position)
                                            .getStoryBigThumbUrl()))
                            .placeholder(R.drawable.user_placeholder)
                            .error(R.drawable.user_placeholder_error)
                                    .into(holder.storyBigThumb);
                        }
                    });
34
Hitesh Sahu

これを行う:

Picasso.with(this)
            .load(url)
            .networkPolicy(NetworkPolicy.OFFLINE)
            .into(imageView);

また、私の以前の答えを確認してください、多分あなたを助けるでしょう: ピカソのキャッシュを無効にする

9
João Machete

このロジックは私のために働いた:

if network is available:
    Picasso.with(context).load(image).into(imageView);
else:
    Picasso.with(context).load(image).networkPolicy(NetworkPolicy.OFFLINE).into(imageView);
6
Jordan Réjaud

OkHttp および Okio はクラスパスに存在しますか? (または依存関係で)デフォルトでPicassoはHttpClientにキャッシングを処理させるため(デフォルトではこれを行いません)

2つのオプションがあります

  • 上記の依存関係を含める(推奨)
  • キャッシュを手動で指定する
4
martyglaubitz

RequestCreatorhere like の個別のインスタンスの作成を回避するには、次のようにします。

 RequestCreator request = mPicasso.load(TextUtils.isEmpty(imageUrl) ? null : imageUrl)
                    .placeholder(R.drawable.ic_default)
                    .error(R.drawable.ic_default)
                    .transform(transformations)
                    .noFade()
                    .centerCrop();
            request
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .into(mImageView, new Callback.EmptyCallback(){
                        @Override
                        public void onError() {
                            super.onError();
                            request.into(mImageView);
                        }
                    });
1
NickUnuchek