Как кэшировать NetworkImage для использования в другой деятельности, используя залп
У меня есть два взгляда, один из которых является основным, а другой подробно. Я получаю все URL-адреса с сервера и соответственно отображаю растровое изображение на сетке. Когда пользователи нажимают на элемент сетки, я хочу использовать изображение из кэша на главном экране. Однако моя следующая реализация не работает.
Я тестирую следующим образом: во-первых, я отображаю все изображения в сетке и отключаю Интернет, и хотел увидеть кэшированное изображение на деталях. Тем не менее, на детализации изображение не отображается.
Я использую следующий класс Volley Singleton следующим образом:
public class CustomVolleyRequest {
private static CustomVolleyRequest customVolleyRequest;
private static Context context;
private RequestQueue requestQueue;
private ImageLoader imageLoader;
private CustomVolleyRequest(Context context) {
CustomVolleyRequest.context = context;
this.requestQueue = getRequestQueue();
imageLoader = new ImageLoader(requestQueue,
new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap>
cache = new LruCache<>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
public static synchronized CustomVolleyRequest getInstance(Context context) {
if (customVolleyRequest == null) {
customVolleyRequest = new CustomVolleyRequest(context);
}
return customVolleyRequest;
}
public RequestQueue getRequestQueue() {
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(context.getApplicationContext(), 10 * 1024 * 1024);
}
return requestQueue;
}
ImageLoader getImageLoader() {
return imageLoader;
}
}
Основной адаптер деятельности
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
final ViewHolder holder;
if(convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(getContext()).inflate(R.layout.grid_item, parent, false);
}
holder.imageView.setImageUrl(imageRecord.getUrl(), mImageLoader);
}
Детальная активность
String url = getArguments().getString("image_url");
ImageLoader imageLoader = CustomVolleyRequest.getInstance(getContext()).getImageLoader();
mImageView.setImageUrl(url, imageLoader);
1 ответ
Если размер ImageView отличается, реализация по умолчанию для кэширования изображений не будет работать, так как ключ кэшей, передаваемых ImageLoader, включает размер представления:
private static String getCacheKey(String url, int maxWidth, int maxHeight, ScaleType scaleType) {
return "#W" + maxWidth + "#H" + maxHeight + "#S" + scaleType.ordinal() + url;
}
У вас есть 2 основных варианта:
1) Переработайте ImageLoader и, возможно, NetworkImageView, так как он размещает фактическое преобразованное растровое изображение, которое может быть другого размера, и вы можете захотеть вызвать createScaledBitmap()
чтобы приспособить его к виду.
2) убедитесь, что необработанные данные изображения, полученные из сети, кэшируются.
Итак, 1) относительно сложный, потому что вам нужно изменить несколько классов для анализа, выполненного в ImageRequest, и не масштабировать необработанные данные изображения, а выполнять масштабирование после получения и кэширования изображения, в основном в NetworkImageView или позже в ImageLoader.
Если вы выберете 2, вам, вероятно, придется настроить реализацию Volley по умолчанию для сетевого кэша, если ваш сервер не отправляет заголовки кэша или etag. В этом случае вам понадобится небольшое изменение в ImageLoader, для которого вы можете проверить /questions/34272528/android-volley-ne-keshiruet-izobrazheniya/34272538#34272538