2012-01-23 34 views
0

錯誤任何人都可以幫助如何處理位圖超過虛擬機buget錯誤。其實我已經在列表視圖中顯示更多圖像。它工作正常,並重復啓動活動後拋出位圖錯誤,任何答案都非常感謝。如何處理位圖大小超過android

回答

1

public enum BitmapLoading { INSTANCE;

private final Map<String, SoftReference<Bitmap>> cache; 
private final ExecutorService pool; 
private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>()); 
private Bitmap placeholder; 

BitmapLoading() { 
    cache = new HashMap<String, SoftReference<Bitmap>>(); 
    pool = Executors.newFixedThreadPool(5); 
} 

public void setPlaceholder(Bitmap bmp) { 
    try { 
     placeholder = bmp; 
    } catch (OutOfMemoryError e) { 
     placeholder.recycle(); 
     bmp.recycle(); 
     placeholder = null; 
     bmp = null; 
    } 
} 

public Bitmap getBitmapFromCache(String url) { 
    if (cache.containsKey(url)) { 
     return cache.get(url).get(); 
    } 
    return null; 
} 

public void queueJob(final String url, final ImageView imageView,final int width, final int height) { 
    /* Create handler in UI thread. */ 
    final Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      String tag = imageViews.get(imageView); 
      if (tag != null && tag.equals(url)) { 
       if (msg.obj != null) { 
        imageView.setImageBitmap((Bitmap) msg.obj); 
       } else { 
        imageView.setImageBitmap(placeholder); 
        Log.d(null, "fail " + url); 
       } 
      } 
     } 
    }; 
    pool.submit(new Runnable() { 
     @Override 
     public void run() { 
      Bitmap bmp = null; 
      try{ 
       bmp = downloadBitmap(url, width, height); 
       Message message = Message.obtain(); 
       message.obj = bmp; 
       handler.sendMessage(message); 
      }catch (OutOfMemoryError e) { 
       bmp.recycle(); 
       bmp = null; 
      } 
     } 
    }); 
} 

public void loadBitmap(final String url, final ImageView imageView,final int width, final int height) { 
    imageViews.put(imageView, url); 
    Bitmap bitmap = null ; 
    try { 
     bitmap = getBitmapFromCache(url); 
     if (bitmap != null) { 
      imageView.setImageBitmap(bitmap); 
     } else { 
      imageView.setImageBitmap(placeholder); 
      queueJob(url, imageView, width, height); 
     } 
    } catch (OutOfMemoryError e) { 
     bitmap.recycle(); 
     bitmap = null; 
     System.gc(); 
    } 
} 

private Bitmap downloadBitmap(String url, int width, int height) { 
    Bitmap bitmap =null; 
    try { 
     bitmap = BitmapFactory.decodeStream((InputStream) new URL(url).getContent()); 
     bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true); 
     cache.put(url, new SoftReference<Bitmap>(bitmap)); 
     return bitmap; 
    }catch (OutOfMemoryError e) { 
     bitmap.recycle(); 
     bitmap = null; 
     System.gc(); 
    } 
    catch (MalformedURLException e) { 
    } catch (IOException e) { 
    } 
    return null; 
} 

}

+0

我認爲這段代碼可能會幫助你 –

0

你必須使用延遲加載的概念來解決這個問題,或者你必須使用軟參考概念與位圖。

+0

好吧,讓我試試看。謝謝senthil – Srinivas

2

這些鏈接可能對您有用。
http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
另外這個鏈接,因爲它顯示了任何人在實現涉及加載圖像的列表/網格時如何承擔簡單但嚴重的錯誤。
How to solve the vm budget memory heap error in lazy loading bitmaps?


另外,正如你所說,當你重複地調用你的活動時會出現dis問題,我懷疑你是在你的適配器的getView方法中初始化的線程中加載圖像。
這是我常見的東西,人們實現,然後遇到類似的問題。
如果這是您的代碼中發生的事情,您需要再次檢查它,因爲這將導致爲getView被調用的所有列表行生成線程。

相關問題