2017-04-05 21 views
0

在我的應用程序中,有一些活動使用高分辨率PNG進行圖形化處理。我有OutOfMemoryError錯誤,並通過將android:largeHeap="true"添加到我的清單文件來修復它。爲什麼ativity仍然使用稱爲finish()的RAM?

聯想的Vibe P1(3GB RAM合計) enter image description here

在存儲器監視器,第二activiy增加100+的RAM MB和不降低altought稱爲finish()函數它。以下是開始第三個活動的代碼:

public void start_game(View v){ 
    header.setText("Loading..."); 
    Intent i = new Intent(this,game.class); 
    i.putExtra("episode",Integer.parseInt(v.getTag().toString())); 
    i.putExtra("online",false); 
    startActivity(i); 
    finish(); 
} 

如何從UI和RAM中完全刪除活動?

+0

第一件事'android:largeHeap =「true」'只是一個繃帶,並不是OOM的真正答案,因爲它沒有真正解決實際的OOM問題,這是代碼的不好實現。第二個'finish()'不會立即釋放該活動中的所有內容,線程可能仍然保存該活動引用並消耗內存。 :) – Enzokie

回答

0

在存儲監視器中按'垃圾車'圖標。
這會強制垃圾回收器運行並清理可以釋放的內存。
系統將在需要時自行執行此操作,並在活動結束後的將來某個時間點執行此操作,但不一定在此之後。

如果運行gc不會釋放內存,那麼仍然存在對數據的引用。它可以在例如靜態變量或單例對象中。你將不得不對代碼進行更多的分析以找出可能的原因。

0

對於API級別11及以上版本,您可以嘗試此操作來清除歷史堆棧,並查看是否會使以前的活動釋放RAM。

Intent i = new Intent(this,game.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

而對於API => 10,你可以使用IntentCompact(見本)類,像

IntentCompat.FLAG_ACTIVITY_CLEAR_TASK 

因此可以支持預API級別11爲好。

相關問題