2012-08-04 143 views
2

我有一個Activity在onStart()方法中創建線程。 線程用於通過TCP讀取網絡數據,並在while循環內具有阻塞網絡讀取方法,該方法檢查每個增量上的布爾變量。活動時Android停止線程在銷燬時的活動

我的問題是,當使用後退鍵銷燬活動時,我將布爾循環控制變量的值設置爲false,但線程無法完成,因爲它卡在阻塞網絡方法中。

public class MyActivity extends Activity implements Runnable 
{ 
    Thread thread; 
    boolean loopControl; 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
    } 
    protected void onStart() 
    { 
     super.onStart(); 
     loopControl=true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public void run() 
    { 
     while(loopControl) 
     { 
      directories = (Vector<String>) TCPFunctions.inputStream.readObject(); 
     } 
    } 

    protected void onDestroy() 
    { 
     super.onDestroy(); 
     loopcontrol = false; 
    } 
} 

我怎麼完成這樣的線程,因爲我希望它,因爲它在這個活動再次啓動造成了一個問題。

其實每次活動開始它的時候有一些數據從您的onDestroy()方法的服務器

回答

0

閱讀嘗試

thread.interrupt(); 
thread=null; 
+0

沒有幫助,舊的線程仍然運行,並且在活動在銷燬後再次啓動時再次創建新線程。當活動再次啓動時,它會從服務器獲取一些實際上由舊線程讀取的初始化數據,並將新線程留空(檢查我的文章的最後一行,只是更新) – Anjanu 2012-08-04 21:18:24

+0

@Anjanu嘗試在一個實現Runnable除了MainActivity之外的其他類。 – kalz 2012-08-04 21:36:49

+0

確定將嘗試並在以後報告 – Anjanu 2012-08-04 21:49:47

0

我仍然是一種新的Android處,但我會給它一個鏡頭:

你確定你的onDestroy()方法被調用?也許你只是退出使用Home或後退按鈕您的應用程序,並在這些情況下的onDestroy()方法不一定會因爲顯示此頁上的圖中的全稱爲: Activity Lifecycle - Pausing

也許你想線程停止其工作時,應用程序成爲「隱藏」,並把這個的onStop()代替:

loopcontrol = false; 
thread.interrupt(); 
thread=null; 

如果是這樣的話,還的onCreate()不一定會叫,當您返回/重新啓動應用程序,所以也許線程啓動應該在onResume()?

0

你想達到什麼目的?

在這種情況下,從其中一個Activity回調方法啓動後臺線程可能不是一個好主意。活動可能會被破壞並從頭開始重新創建(例如,這是旋轉手機時的默認行爲),在這種情況下,您將失去線程...

更好的方法是創建Service ...但那裏在這裏有很多關於活動/服務/其他事情的TCP通信的問題/答案。

+0

確定將嘗試服務...實際上在處理UDP套接字時,我處於類似的情況......我在那裏設置了一個2秒的套接字超時......所以阻塞語句每隔2秒就拋出一個異常,並且它將Catch塊稱爲整個函數再次遞歸地得到一個機會來檢查循環控制變量的值......但是這樣使用異常處理是公平的......只是問 – Anjanu 2012-08-05 09:26:48