2012-02-06 54 views
0

我的平板電腦應用程序必須顯示一個非常大的圖像(2500x6000),並允許用戶平移,放大&了。由於它無法放入內存中,因此我已將其分解爲多個tile並根據需要加載這些內存。我遇到的問題是,無論何時卸載或替換位圖,都會導致垃圾收集,從而使我的應用程序明顯停頓。我想知道是否有人想出瞭解決這個問題的巧妙方法?我使用BitmapFactory.decodeResource創建了我的位圖。我試着替換相同的位圖,但垃圾收集仍在運行(假設它轉儲舊的位圖並用新的位圖替換它)。試圖顯示大圖像作爲瓷磚沒有打嗝

謝謝!

回答

1

找出答案!在API11 + BitmapFactory.Options中有一個名爲inBitmap的屬性,它將在加載內容時重用位圖。我已經實現它:

mBg[i] = Bitmap.createBitmap(800, 1232, Bitmap.Config.RGB_565); 
mBgOptions[i] = new BitmapFactory.Options(); 
mBgOptions[i].inBitmap = mBg[i]; 
mBgOptions[i].inPreferredConfig = Bitmap.Config.RGB_565; 
mBgOptions[i].inMutable = true; 
mBgOptions[i].inSampleSize = 1; 

垃圾收集器不再運行,暫停已被刪除。 作爲f.y.i,必須設置inSampleSize或者它不起作用。

0

如果你是針對Android 3.0的,然後這個答案可以幫助:

前的Android 3.0,你可以建立自己的平鋪圖像的HTML頁面,讓內置的瀏覽器處理圖像的加載和卸載。在這裏,我的回答有一些更多的細節:

任何人有任何其他辦法?

+0

加載瓷磚不是真的問題......除了垃圾收集位,我不認爲其他方法會改變這一點。 我可能會嘗試瀏覽器的方法,但我不認爲網絡視圖會真正爲我們試圖獲得的行爲工作。 – anakin78z 2012-02-06 18:06:11

0

你使用的是android:largeHeap =「true」嗎?這可能會降低地理信息系統的頻率。此外,鑑於您正在定位平板電腦,因此您可以安全地假定您正在處理併發垃圾收集器。所以如果它有更多,更小的內存塊要收集,即更小的瓷磚,它將會工作得最好。

+0

感謝您的信息。我沒有使用android:largeHeap =「true」...我必須考慮這一點。我也會嘗試使用更小的塊。 – anakin78z 2012-02-06 19:41:35

0

我用這個容易integerate世界地圖應用程序的來源:

https://github.com/johnnylambada/WorldMap

這將使用世界地圖的海量影像,並使用緩存來顯示地圖。

爲了整合,我只複製了所有的java文件(5我猜),並在我的佈局文件中使用了surfaceView。然後,我瀏覽了ImageViewerActivity.java的小型OnCreate()方法,並在我的活動中使用了代碼(根據我個人的使用情況稍作修改)。