2011-08-08 56 views
2

可能重複:
OutOfMemory Exception when handling imagesAndroid的 - 的AsyncTask與位圖的工作 - 的OutOfMemoryError

我有一個的AsyncTask內的位圖的創作,這是這樣的:

private WeakReference<Bitmap> myBitmap; 
private WeakReference<Bitmap> endResultBitmap; 
private ImageView imv; 

...

private class SendBitmap extends AsyncTask<Integer, Void, Bitmap> { 

public SendBitmap(Bitmap bitmap) { 
    myBitmap = new WeakReference<Bitmap>(bitmap); 
} 

@Override 
protected Bitmap doInBackground(Integer... params) { 
    Bitmap bm = null; 
    bm = getBitmapFromNet(params[0]); 

    return bm; 
} 

然後我想創建上接收到的位圖會出現兩次(旁邊另外一個)位圖

protected void onPostExecute(Bitmap result) { 
    endResultBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(result.getWidth() * 2, result.getHeight(), result.getConf())); 

    Canvas canvas = new Canvas(endResultBitmap.get()); 
    canvas.drawBitmap(result, 0, 0, null); 
    canvas.drawBitmap(result, result.getWidth(), 0, null); 

    imv.setImageBitmap(endResultBitmap); 
} 

然後我有我的onCancelled()方法:

@Override 
protected void onCancelled(Bitmap result) { 
    if(endResultBitmap!=null) { 
    endResultBitmap.recycle(); 
    endResultBitmap = null; 
    } 
} 

事情如果我執行這個AsyncTask幾次,堆會瘋狂增長。 我執行的AsyncTask當按下一個按鈕,但一開始我做的事:

public void onClicked(View v) { 

    if(asyncTaskInstance != null) 
    asyncTaskInstance.cancel(); 

    asynctaskInstance.execute(2); 
} 

但同樣,堆成長,如瘋了,在某些時候它會與OutOfMemoryError錯誤崩潰。

有什麼想法?我的任務設計有錯嗎?

+0

什麼是你的位圖(result.height()??)的維度? – Shash316

+0

〜2000 - 我需要更好的quallity :( –

+0

什麼是** imv **?你在哪裏存儲你加載的位圖?ContentProvider?內存? – user802421

回答

1

Android對應用程序有一定的內存限制(如果我沒有記錯的話,爲16 MB),並且該圖像在未壓縮格式下太大。在this question中有一些有趣的討論。

爲了解決它,有僅AFAIK兩種方式:
1.減小圖像的大小,以消耗更少的存儲器
2.加載在使用NDK本地代碼的圖像。

對1:我不知道你到底在做什麼,也不知道這是否真的是一個可行的選擇。如果是這樣,您可能需要從網上下載圖像文件,並使用BitmapFactory類打開它。有一些靜態函數需要一個BitmapFactory.Options對象。使用此Options對象中的inSampleSize可以在加載時將圖像大小減小一定的因子(inSampleSize應該是2的冪)。

到2 .:上面提到的內存限制不適用於本機代碼。所以你可以載入圖像並以本地方式顯示。我沒有這方面的經驗,我只知道這是可能的,但是使用谷歌搜索應該會得出一些結果。

+0

我無法調整大小,因爲我需要從網絡獲得的質量。 –

+0

如上所述,如果您只能從網上下載一個固定質量,請從網上下載整個圖像並將其保存在緩存目錄中。從那裏,通過減小大小的BitmapFactory將其加載到內存中以規避限制。 – 2011-08-08 13:52:04

+0

我會嘗試。僅供參考,現在如果我點擊按鈕10次,它將啓動10個不同的AsyncTasks,並且在某些時候會拋出「爲14313056字節分配增加堆(碎片大小)到221.454MB」消息,並在此之後拋出OutOfMemoryException。 –