Picasso でディスク キャッシュを使用するにはどうすればいいですか? 質問する

Picasso でディスク キャッシュを使用するにはどうすればいいですか? 質問する

Android アプリで画像を表示するために Picasso を使用しています:

/**
* load image.This is within a activity so this context is activity
*/
public void loadImage (){
    Picasso picasso = Picasso.with(this); 
    picasso.setDebugging(true);
    picasso.load(quiz.getImageUrl()).into(quizImage);
}

デバッグを有効にすると、常に赤と緑が表示されます。しかし、黄色は表示されません。

次回同じ画像をロードするときにインターネットが利用できない場合、画像はロードされません。

質問:

  1. ローカルディスクキャッシュはありませんか?
  2. 同じイメージを複数回使用するので、ディスク キャッシュを有効にするにはどうすればよいでしょうか。
  3. Android マニフェスト ファイルにディスク権限を追加する必要がありますか?

ベストアンサー1

これが私がやったことです。うまくいきました。

まず、アプリ モジュールの Gradle ビルド ファイルに OkHttp を追加します。

compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'

次にクラスを拡張しますApplication

import android.app.Application;

import com.jakewharton.picasso.OkHttp3Downloader;
import com.squareup.picasso.Picasso;

public class Global extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Picasso.Builder builder = new Picasso.Builder(this);
        builder.downloader(new OkHttp3Downloader(this,Integer.MAX_VALUE));
        Picasso built = builder.build();
        built.setIndicatorsEnabled(true);
        built.setLoggingEnabled(true);
        Picasso.setSingletonInstance(built);

    }
}

次のようにマニフェスト ファイルに追加します。

<application
        android:name=".Global"
        .. >

</application>

これからは通常どおり Picasso を使用します。変更はありません。

編集:

キャッシュされた画像のみを使用する場合は、次のようにライブラリを呼び出します。networkPolicyを追加しないと、画像が表示されない完全にオフラインで開始キャッシュされていても以下のコードは問題を解決します。

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

編集#2

上記のコードの問題は、キャッシュをクリアすると、Picasso がキャッシュ内でオフラインで検索し続け、失敗する点です。次のコード例では、ローカル キャッシュを調べ、オフラインで見つからない場合はオンラインになり、キャッシュを補充します。

Picasso.with(getActivity())
.load(imageUrl)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(imageView, new Callback() {
    @Override
    public void onSuccess() {

    }

    @Override
    public void onError() {
        //Try again online if cache failed
        Picasso.with(getActivity())
                .load(posts.get(position).getImageUrl())
                .error(R.drawable.header)
                .into(imageView, new Callback() {
            @Override
            public void onSuccess() {

            }

            @Override
            public void onError() {
                Log.v("Picasso","Could not fetch image");
            }
        });
    }
});

おすすめ記事