web-dev-qa-db-ja.com

Android Picassoを使用して、画像をメモリ/ディスクにプリロードします

ピカソで画像を表示する前にダウンロードできますか?最初に画像をキャッシュしたいと思います。

サンプルシナリオ:ユーザーがボタンをクリックしてプログレスバーが表示され、画像の読み込みが完了すると、画面に画像が表示されます。

「get」メソッドで画像を読み込もうとしましたが、画像がキャッシュされませんでした。

Thread thread = new Thread()
{
    @Override
    public void run() {
        try {
            Picasso picasso = PicassoOwnCache.with(getApplicationContext());
            RequestCreator picassoRequest;
            for (String imgUrl : imagesUrls) {
                picassoRequest = picasso.load(imgUrl);
                picassoRequest.get();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

thread.start();

これは私のピカソシングルトンクラスです

public class PicassoOwnCache {
    static Picasso singleton = null;
    static Cache cache = null;

    public static Picasso with(int cacheSize, Context context) {
        if (singleton == null) {
            int maxSize = calculateMemoryCacheSize(context);
            cache = new LruCache(cacheSize <= maxSize ? cacheSize : maxSize);
            singleton = new Picasso.Builder(context)
                    .memoryCache(cache)
                    .build();
        }
        return singleton;
    }

    public static Picasso with(Context context) {
        if (singleton == null) {
            cache = new LruCache(calculateMemoryCacheSize(context));
            singleton = new Picasso.Builder(context)
                    .memoryCache(cache)
                    .build();
        }
        return singleton;
    }

    static int calculateMemoryCacheSize(Context context) {
        ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
        boolean largeHeap = (context.getApplicationInfo().flags & FLAG_LARGE_HEAP) != 0;
        int memoryClass = am.getMemoryClass();
        if (largeHeap && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            memoryClass = ActivityManagerHoneycomb.getLargeMemoryClass(am);
        }
        return 1024 * 1024 * memoryClass / 10;//7;
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private static class ActivityManagerHoneycomb {
        static int getLargeMemoryClass(ActivityManager activityManager) {
            return activityManager.getLargeMemoryClass();
        }
    }
}

次に、(キャッシュされた)画像をユーザーに表示します。

Picasso picasso = PicassoOwnCache.with(getApplicationContext());
picasso.setDebugging(true) ;
RequestCreator picassoRequest;
picassoRequest = picasso.load(imgUrl);
picassoRequest
        .placeholder(R.drawable.loading_logo)
        .error(R.drawable.no_internet)
        .fit() // I tries also without fit()
        .into(holder.getImageView());

残念ながら、これは機能しません。 yopurの提案をありがとう!

18
user3032346

Dnkoutsoが言うように、あなたはただ使うだけです:

フェッチ()

これはピカソに組み込まれています! dnkoutsoのコメントに賛成してください。


PSあなたが求めているのは、「ピカソのプリロード画像を作成するにはどうすればよいですか?」だと思います。

ピカソは絶対にそして完全に画像のすべてのキャッシュを完全に処理することに注意してください-あなたからのさらなる努力なしで-それがピカソの目的であり、あなたがそれを使用する理由です-それはの存在理由ですピカソ。したがって、それについて心配する必要はありません。

繰り返しますが、プリロードを話している場合、または "ウォームアップ"と言っている場合は、dnkoutsoが言ったことを正確に実行してください。

(ちなみに、これはすべて「画像の長いリストビューでどのように良いものが見えるか」に帰着します。実際、ピカソは非常にスムーズであることがわかりました。一般的に、心配する必要はありません。ほとんどのアプリのウォームアップフェーズ。実際、このような重要な概念でさえ..。

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

注-この有名な記事 http://www.programmingmobile.com/2012/03/buttery-smooth-list-scrolling-in.html ウェブから消えました..

...本当にピカソはとても使いやすいので、本当に、「昔ながらの」慎重にListViewを処理する必要はほとんどありません。つまり、「ウォームアップ」について心配する必要はほとんどありません。それが役に立てば幸い。)

38
Fattie

表示する前に画像を取得できます。ロードされた後、imageViewにロードできます。 2回目にPicasso#load()を呼び出すと、画像は再度ダウンロードされません。キャッシュから取得されます。

startProgress(); // handle showing progress view somehow
Picasso.with(getActivity()).load(imageUrl).fetch(new Callback() {
    @Override
    public void onSuccess() {
        Picasso.with(getActivity()).load(imageUrl).into(imgViewMedia);
        stopProgress(); // handle stopping progress view somehow
    }

    @Override
    public void onError() {

    }
});
8
sembozdemir