我正在創建一個查看器應用程序,它調用BitmapRegionDecoder.decodeRegion(Rect, BitmapFactory.Options)
。我從配置各decodeRegion
調用前在過去得到了位圖:有沒有辦法告訴Bitmap是否已經在Android上完全處置?
//this is a function I wrote that gets the rectangle I need
//from the zoom/pan state of a lower-resolution ImageView (page).
//it is bragable.
Rect areaRect = page.getBitmapRegionDecoderRect(areaBitmapRect);
BitmapFactory.Options options = new BitmapFactory.Options();
//area is the ImageView which will get the hi-res bitmap in it.
if(area.getHeight()!=0)
{
//I used Math.round because we are so desperate to save memory!
//The consequent blurring is actually not too bad.
options.inSampleSize = Math.round(((float) areaRect.height())/((float) area.getHeight()));
}
else
{
options.inSampleSize = Math.round(((float) areaRect.height())/((float) page.getHeight()));
}
if(options.inSampleSize==0) options.inSampleSize=1;
if(options.inSampleSize>16) options.inSampleSize=16;
options.inPreferredConfig = Bitmap.Config.RGB_565;
if(areaRect.left<0) areaRect.left = 0;
if(areaRect.right>areaBitmapRect.right) areaRect.right = areaBitmapRect.right;
if(areaRect.top<0) areaRect.top = 0;
if(areaRect.bottom>areaBitmapRect.bottom) areaRect.bottom = areaBitmapRect.bottom;
if(areaBitmap!=null)
{
//recycling our garbage ... or are we?
areaBitmap.recycle();
areaBitmap = null;
try
{
//dirty hack
wait(200);
}
catch(Exception x)
{
//something happened.
}
}
//the all-important call
areaBitmap = areaDecoder.decodeRegion(areaRect, options);
area.setImageBitmap(areaBitmap);
我是有上非常快速的連續的UI事件,我們正在運行的內存事實問題。正如你所看到的,我已經用骯髒的黑客「解決了」這個問題(線程等待200ms,讓Android有一段時間趕上)。
我對此並不滿意,原因很明顯。首先,我的診斷(在我們分配新內存之前垃圾回收沒有完成)是否正確?其次,我試圖把
while(!areaBitmap.isRecycled())
圍繞一個計數器增量recycle()
電話後,計數器停留在零。我看到isRecycled()
這樣做,但我需要像isCompletelyRecycled()
方法。 Android有這樣的東西嗎?第三,如果我無法得到任何答案,是否有一種「可用記憶」方法可以用來判斷我的電話是否會推動我們?我找不到一個。如果Android會說更多的核心可用但對你而言不是很好,那麼我可以將我的等待循環稱爲計劃B,或者最終嘗試一些不太密集的東西。
Ah-so System.gc()可能適用於等待(200)完全相同的原因(即它們觸發延遲)。我提到了爲什麼我無法避免創造新的位圖,儘管我有一些想法讓它不那麼頻繁;文章中的方法正是我所期待的。謝謝! –
我已編輯標題以反映解決方案的特定位圖。謝謝! –