Как кэшировать 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

Другие вопросы по тегам