2016-10-28 10 views
1

こんにちは、イメージをローダーしてWebからイメージを読み込み、電話でキャッシングすると、電話で にSDカード(外部メモリ)イメージがロードされません。それを修正 ここでは、LRUキャッシュとセットアップへの非常に簡単に使用することがあります画像ローダクラスコードイメージローダーがイメージをロードしていません

public class ImageLoader { 

    final int stub_id = R.drawable.ic_thumbnail; 
    MemoryCache memoryCache = new MemoryCache(); 
    FileCache fileCache; 
    ExecutorService executorService; 
    private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>()); 

    public ImageLoader(Context context) { 
    fileCache = new FileCache(context); 
    executorService = Executors.newFixedThreadPool(5); 
    } 

    public void DisplayImage(String url, ImageView imageView) { 
    imageViews.put(imageView, url); 
    Bitmap bitmap = memoryCache.get(url); 
    if (bitmap != null) 
    imageView.setImageBitmap(bitmap); 
    else { 
    queuePhoto(url, imageView); 
    imageView.setImageResource(stub_id); 
    } 
    } 

    private void queuePhoto(String url, ImageView imageView) { 
    PhotoToLoad p = new PhotoToLoad(url, imageView); 
    executorService.submit(new PhotosLoader(p)); 
    } 

    private Bitmap getBitmap(String url) { 
    File f = fileCache.getFile(url); 

    //from SD cache 
    Bitmap b = decodeFile(f); 
    if (b != null) 
    return b; 

    //from web 
    try { 
    Bitmap bitmap = null; 
    URL imageUrl = new URL(url); 
    HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection(); 
    conn.setConnectTimeout(30000); 
    conn.setReadTimeout(30000); 
    conn.setInstanceFollowRedirects(true); 
    InputStream is = conn.getInputStream(); 
    OutputStream os = new FileOutputStream(f); 
    Utils.CopyStream(is, os); 
    os.close(); 
    bitmap = decodeFile(f); 
    return bitmap; 
    } catch (Exception ex) { 
    ex.printStackTrace(); 
    return null; 
    } 
    } 

    //decodes image and scales it to reduce memory consumption 
    private Bitmap decodeFile(File f) { 
    try { 
    //decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

    //Find the correct scale value. It should be the power of 2. 
    final int REQUIRED_SIZE = 150; 
    int width_tmp = o.outWidth, height_tmp = o.outHeight; 
    int scale = 1; 
    while (true) { 
    if (width_tmp/2 < REQUIRED_SIZE || height_tmp/2 < REQUIRED_SIZE) 
    break; 
    width_tmp /= 2; 
    height_tmp /= 2; 
    scale *= 2; 
    } 

    //decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) { 
    } 
    return null; 
    } 

    boolean imageViewReused(PhotoToLoad photoToLoad) { 
    String tag = imageViews.get(photoToLoad.imageView); 
    if (tag == null || !tag.equals(photoToLoad.url)) 
    return true; 
    return false; 
    } 

    public void clearCache() { 
    memoryCache.clear(); 
    fileCache.clear(); 
    } 

    //Task for the queue 
    private class PhotoToLoad { 
    public String url; 
    public ImageView imageView; 

    public PhotoToLoad(String u, ImageView i) { 
    url = u; 
    imageView = i; 
    } 
    } 

    class PhotosLoader implements Runnable { 
    PhotoToLoad photoToLoad; 

    PhotosLoader(PhotoToLoad photoToLoad) { 
    this.photoToLoad = photoToLoad; 
    } 

    public void run() { 
    if (imageViewReused(photoToLoad)) 
    return; 
    Bitmap bmp = getBitmap(photoToLoad.url); 
    memoryCache.put(photoToLoad.url, bmp); 
    if (imageViewReused(photoToLoad)) 
    return; 
    BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad); 
    Activity a = (Activity) photoToLoad.imageView.getContext(); 
    a.runOnUiThread(bd); 
    } 
    } 

    //Used to display bitmap in the UI thread 
    class BitmapDisplayer implements Runnable { 
    Bitmap bitmap; 
    PhotoToLoad photoToLoad; 

    public BitmapDisplayer(Bitmap b, PhotoToLoad p) { 
    bitmap = b; 
    photoToLoad = p; 
    } 

    public void run() { 
    if (imageViewReused(photoToLoad)) 
    return; 
    if (bitmap != null) { 
    photoToLoad.imageView.setImageBitmap(bitmap); 

    }//else 
    // photoToLoad.imageView.setImageResource(stub_id); 
    } 
    } 

    } 

答えて

2

です。

final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024); 

// Use 1/8th of the available memory for this memory cache. 
final int cacheSize = maxMemory/8; 

mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { 
    @Override 
    protected int sizeOf(String key, Bitmap bitmap) { 
     // The cache size will be measured in kilobytes rather than number of items. 
     return bitmap.getByteCount()/1024; 
    } 
}; 
public void addBitmapToMemoryCache(String key, Bitmap bitmap) { 
    if (getBitmapFromMemCache(key) == null) { 
     mMemoryCache.put(key, bitmap); 
    } 
} 

public Bitmap getBitmapFromMemCache(String key) { 
    return mMemoryCache.get(key); 
} 

リファレンス - https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

私は強いピカソのような画像ライブラリのいずれかを使用することをお勧めまたは滑空やバレーボールの代わりに、独自のものを書くようなネットワーク・ライブラリは、私はLRUキャッシュを使用ボレーを持っているし、うまく動作します。

+0

ありがとうございますが、私は新しいライブラリを使用していない私のコードを編集したい –

関連する問題