2011-02-10 61 views
6

我有一個活動,當用戶按下並完成()該活動時可能有線程正在運行。那時候那些線程會發生什麼?他們都會嘗試完成,除非我在onDestroy()中打斷它們?活動的線程和視圖在被銷燬時會發生什麼?

例如,下面的代碼是不安全的,因爲如果活動在線程之前完成,我的視圖和遊標可能會被銷燬?

我問的原因是,在完成尚未成功調試的活動時,我偶爾會發生崩潰,因爲它們在調試模式下很少發生,永遠不會發生。我從此開始檢查我的視圖對象是否在執行runOnUIThread()中的任何操作之前爲空。不知道這是否是最乾淨的解決方案,或者如果這是問題。

new Thread()(
public void run(){ 
    crunchOnSomethingForAwhile(mCursor); 
    MyActivity.this.runOnUIThread(new Runnable(){ 
     public void run(){ 
      mTextView.setText("thread complete"); 
      mCursor.close(); 
     } 
    } 
} 
).start(); 
+0

當這些崩潰發生時,LogCat會說什麼? – alexanderblom 2011-02-10 17:36:58

+0

他們只在我離開我的電腦時才發生,所以我沒有連接到LogCat。也許我錯過了一些非常基本的東西,但是當我嘗試在Windows控制檯中稍後轉儲我的日誌時,我只能在控制檯窗口中看到最後幾頁值得記錄的日誌 - 我想它已經沒有空間了。需要弄清楚如何將文件作爲文件轉儲到我的電腦。 – Tenfour04 2011-02-11 17:34:10

回答

1

有人在另一個線程上發佈了一個答案,onDestroy將所有視圖引用設置爲null,最後將活動引用爲null。所以我認爲最好的做法是中斷onDestroy中的所有正在運行的線程,或者至少捕獲任何runInUIThread方法中的NullPointerExceptions。

1

我會看看使用AsyncTask,而不是一個簡單的Thread。它有一些支持在另一個線程中工作,然後在UI線程上完成某些工作。

也就是說,有很多討論如何在活動結束時處理AsyncTask的問題。你應該做什麼取決於任務在做什麼。如果它僅適用於該活動,那麼您可以取消onPause中的任務(假設它不僅僅是輪換更改)。

否則,有各種策略可以保持跨活動的AsyncTasks。看到這個question的一些想法。這commonsware blog也有一個跨屏幕旋轉保持AsyncTask的例子。

相關問題