2017-10-18 59 views
-2

假設你有一個具有兩個活動的應用程序:活動A(發射)與發射活動B.的事項活動B的代碼按鈕:活動泄露

final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(....); 
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
    { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) 
     { 
     } 
    }); 
} 

活動B加載一些位圖爲其界面。它不會恢復其退出時的舊的默認未捕獲異常處理程序。做A-> B-> A-> B ...導致內存不足異常,因爲活動B被泄漏。爲什麼活動B會泄露?

回答

0

在我看來,這是錯誤的架構。對於鏈式搜索,您應該只有每個Activity的單個實例。您應通過調用startActivity()並在您使用的Intent中設置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT來在不同的Activity實例之間切換。還要在Intent中添加要顯示爲「額外」的數據。

爲了能夠使用後退按鈕通過鏈條向後(不管它有多長),每個Activity應該管理包含它需要每當用戶備份到它重新創建頁面的數據堆棧。在onCreate()onNewIntent()中,數據(來自「額外」)應該壓入堆棧並顯示。然後,您可以覆蓋onBackPressed(),並通過撥打startActivity()並在您使用的Intent中設置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT並返回到之前的Activity。您還在Intent中添加了一個「額外」,表示用戶想要「返回」。在onBackPressed()中,您還應該丟棄掉Activity剩下的數據堆棧中的頂部元素。這將確保當用戶回到Activity時堆棧正確。

onNewIntent()如果用戶剛剛備份到Activity,您只顯示已經在管理數據堆棧頂部的數據。

通過這種方式,您只有一個每個Activity的實例,用戶可以整天連接整個活動集,並且BACK按鈕始終有效,您不必擔心內存不足。

嘗試使用taskAffinityIntent標誌或類似標誌來完成此操作將不起作用。不要浪費你的時間。這也是糟糕的編程風格。

我希望這很清楚。 和內存異常使用
添加清單

的Android> V3

<application 
    .... 
     android:largeHeap="true"> 
相關問題