@Billy_Milligan

Как загрузить картинку по URL В ListView и сохранить её в кэше?

Как правильно загрузить картинку с сервера и кэшировать её на девайсе. Хочется добиться такого же эффекта как в приложении VK, что бы без подключения к сети можно было подгрузить парочку записей.

public class RecipeListAdapter extends BaseAdapter {

    LayoutInflater inflater;
    ArrayList<Map<String, String>> list;

    public RecipeListAdapter(Context context, ArrayList<Map<String, String>> list) {
        this.list = list;
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        View vi = inflater.inflate(R.layout.recipe_list_item, null);
        ImageView img = (ImageView) vi.findViewById(R.id.wallpaper);
        new LoadImage(img, list.get(position).get("ImageUrl"), list.get(position).get("id")).execute();
        return vi;
    }

    class LoadImage extends AsyncTask<Void, Void, Bitmap> {

        private ImageView iv;
        private String url;
        private String id;
        private boolean inCache = false;

        public LoadImage(ImageView iv, String url, String id) {
            this.iv = iv;
            this.url = url;
            this.id = id;
        }

        @Override
        protected Bitmap doInBackground(Void... Objects) {
            Bitmap bitmap = null;
            
            /*
            //Для примера, не знаю как реализовать
            bitmap = CacheImages.get(id);
            
            //Если есть в кэше то загрузить из него, иначе загрузить с сервера
            if(bitmap != null) {
                inCache = true;
                return bitmap;
            } else {
                //Загрузка картинку по урл
                // ... код для загрузки, не знаю как реализовать ...
                return bitmap;
            }
            */

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            if(result != null && iv != null){
                //Если нет в кэше, то добавить
                
                if(!inCache) {
                    //CacheImage.add(id, result);
                }
                
                iv.setImageBitmap(result);
            }else{
                Log.i("Error", "image not uploaded, url: "+url);
            }
        }
    }
}

Правильно ли я пытаюсь это сделать? И как собственно правильно реализовать загрузку и кэширование?
  • Вопрос задан
  • 4822 просмотра
Решения вопроса 1
gadfi
@gadfi
https://gamega.org
Я подобное реализовал с помощью picaso, проверял есть ли картинка на карете, если нет загружал из сети в imageview, после чего просто картинку из imageview сохранял на карту. Возможно несколько костыльно, но работает хорошо.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Copperfield
Android dude
Используйте готовые имэйдж лоадеры: UIL, picasso, volley etc.
Все они умеют асинхронно подгружать и кешировать изкоробки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы