Предварительная загрузка изображений в память/диск с помощью Android Picasso

Можно ли загружать изображения с помощью 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!

Ответы

Ответ 1

Как говорит dnkoutso, вы просто используете:

выборки()

который встроен в Пикассо! Пожалуйста, пропустите комментарий dnkoutso.


PS Я предполагаю, что вы спрашиваете, "как мне сделать изображения PRE-LOAD Picasso?"

Обратите внимание, что Пикассо абсолютно и полностью полностью обрабатывает все кеширование изображений - без каких-либо дополнительных усилий от вас - это цель Пикассо и почему вы его используете - это смысл существования Пикассо. Поэтому вам не нужно беспокоиться об этом.

Опять же, если вы говорите предварительная загрузка или скажите "разминка" , тогда сделайте то, что сказал dnkoutso.

(Кстати, все это просто сводится к: "как хорошие вещи выглядят в длинных списках изображений". Мы действительно обнаружили, что Picasso просто так гладко, вам даже не нужно беспокоиться, как правило, о фазе разминки в большинстве приложений. Действительно, даже такие критические концепции, как это....

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

Примечание. Эта знаменитая статья http://www.programmingmobile.com/2012/03/buttery-smooth-list-scrolling-in.html исчезла из Интернета.

... действительно, Picasso настолько прост в использовании, вам, на самом деле, редко приходится беспокоиться о "старомодной" обработке ListView. Короче говоря, вам очень редко приходится беспокоиться о "разминке", мы нашли. Надеюсь, это поможет.)

Ответ 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() {

    }
});