Кэширование картинок для просмотра списка - PullRequest
1 голос
/ 23 сентября 2011

так что у меня есть просмотр списка с изображениями из некоторых URL, я пытался сохранить изображения после загрузки в массив списков растровых изображений, но в итоге в списке на моем устройстве только 2-3 изображения (эмулятор показывает все изображения), поэтому я попытался кэшировать изображения после загрузки, и я использую: `

     for (int i = 0; i < url.length; i++){
            URL urlAdress = new URL(url[i]);
            HttpURLConnection conn = (HttpURLConnection) urlAdress
                    .openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            Bitmap bmImg = BitmapFactory.decodeStream(is);

            // picList.add(bmImg);

            File cacheDir = context.getCacheDir();
            File f = new File(cacheDir, "000" + (i + 1));
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(f);
                bmImg.compress(Bitmap.CompressFormat.JPEG, 80, out);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (out != null)
                        out.close();
                } catch (Exception ex) {
                }
            }
        }

`, чтобы сохранить фотографии в кэш, а затем я использую это для загрузки изображений из кэша в адаптер:

File cacheDir = context.getCacheDir();
    File f = new File(cacheDir, "000" + position);
    Drawable d = Drawable.createFromPath(f.getAbsolutePath());
    holder.icon.setImageDrawable(d);

но я все еще получаю 3-4 фотографии из 9, это проблема памяти?(все фото вместе имеют 300 кб)

Ответы [ 2 ]

0 голосов
/ 24 сентября 2011

обнаружил проблему Bitmap bmImg = BitmapFactory.decodeStream(is); содержит ошибки и пропускает данные на медленных интернет-соединениях, как на реальном устройстве, поэтому я добавил

Bitmap bmImg = BitmapFactory.decodeStream(new FlushedInputStream(is));

и

static class FlushedInputStream extends FilterInputStream {
    public FlushedInputStream(InputStream inputStream) {
        super(inputStream);
    }

    @Override
    public long skip(long n) throws IOException {
        long totalBytesSkipped = 0L;
        while (totalBytesSkipped < n) {
            long bytesSkipped = in.skip(n - totalBytesSkipped);
            if (bytesSkipped == 0L) {
                int b = read();
                if (b < 0) {
                    break; // reached EOF
                } else {
                    bytesSkipped = 1; // read one byte
                }
            }
            totalBytesSkipped += bytesSkipped;
        }
        return totalBytesSkipped;
    }
}
0 голосов
/ 23 сентября 2011

почему вы создаете свое собственное, как это уже сделала Lazy List, см. Ленивая загрузка изображений в ListView

...