2016-05-08 4 views
0

Я работаю над приложением с большим количеством динамического и изменяющегося контента. Я извлекаю все свои данные с моего сервера, когда приложение загружается. В результате почти каждая активность/фрагмент загружается отдельно, что приведет к тому, что пользователь будет ждать много времени для каждой «страницы» для индивидуальной загрузки.Кэширование изображений и строк с использованием Retrofit, okhttp, picasso

Моя цель - создать одну загрузочную страницу, когда приложение запускается, когда оно будет отвечать за всю загрузку, и будет кэшировать все изображения и информацию (строки) и ti в нужное время. (или, по крайней мере, для большинства из них)

У меня была возможность использовать модифицированные, okhttp и Picasso в качестве одной дополнительной библиотеки, но я знаю, что они могут работать вместе и синхронизироваться, а также кэширование диска через по крайней мере, две из этих библиотек (picasso и okhttp). Я не уверен, что кто-то должен делать какую-то часть и как я могу их синхронизировать.

Буду признателен за каждый совет/руководство, спасибо заранее.

ответ

2

okhttp обеспечивает поддержку заголовков управления кешем. Я реализовал их в приложение, прежде чем предоставить кэш, когда сеть слоеное с помощью this guide так:

int cacheSize = 10 * 1024 * 1024; // 10 MiB 
Cache cache = new Cache(cacheDirectory, cacheSize); 

client = new OkHttpClient.Builder() 
    .cache(cache) 
    .build(); 

Как дооснащения использует okhttp внутри (если вы используете последний, по крайней мере), вы не настройте для него любое кэширование. Просто используйте okhttp клиент только что настроенном:

RestAdapter restAdapter = new RestAdapter.Builder() 
     .setClient(new OkClient(client)) 
     .setServer("http://example.com") 
     ... 
     .build(); 

Пикассо автоматически кэширует изображения с помощью какого-то предельного размера кэша по умолчанию. Вы можете изменить Picasso по умолчанию, и я нашел несколько ответов here и here. Вы можете установить размер кэша в onCreate вашем приложении:

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

Picasso также позволяет предварительным загрузке изображений раньше в жизненном цикле приложения,, если у вас есть время, чтобы начать с (скажем, на экране загрузки) и хотите чтобы ускорить загрузку более поздних частей приложения. Чтобы сделать это, я использовал бы метод fetch от строителя Picasso, чтобы получить изображения, но не вставлять их в любые ImageViews. Вы можете нагуглить тоже, но есть быстрый ответ here который объясняет фон за это:

Picasso.with(getApplicationContext()) 
        .load(url) 
        .fetch(); 

IIRC вы должны убедиться, что вы запрашиваете то же размер и преобразованное изображение, как вы пытаетесь получить позже, потому что Пикассо кэша результат преобразованного изображения, а не необработанное загруженное изображение.

+0

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

+0

Спасибо! похоже, что это именно то, что мне нужно. Я начну читать его сейчас. – Roee

+1

@LukasKnuth право, это было на мой взгляд, когда я писал ответ, поэтому я обновлю его, но на все части вопроса могут ответить разные ответы SO. Это не дубликат, потому что нет другого вопроса, который задает одни и те же вопросы вместе, так что вред в ответе с кучей ссылок SO? Если SO опущен, поэтому ссылки не работают, вы даже не можете получить доступ к этому вопросу в первую очередь ... – roarster

Смежные вопросы