2012-07-18 51 views
0

我已經通過調用finish()摧毀了我的活動,但活動中的線程仍然運行後摧毀活動,並導致應用程序崩潰.. 我該如何處理?線程在破壞活動後運行? 請提供一些幫助?線程仍然runnng後摧毀活動

class DBThread extends Thread { 

    @Override 
    public void run() { 
     while (finish) { 
      Cursor cursor = null; 

      Cursor mCursor = lrDB.selectUserDetails(mUser_Id); 
      if (mCursor.getCount() > 0) { 
       mCursor.moveToNext(); 
       String Name = mCursor .getString(0); 
       String userName = mCursor .getInt(1); 
       String password = mCursor .getString(3); 

      } 
      mCursor.close(); 

     } 
    } 
} 
+0

您可能需要使用'ExecutorService'代替'Thread',這是更好的。它有一個'shutdown'和awaitTermination方法 – 2012-07-18 07:56:13

+0

線程繼續運行,因爲它是它自己的一個小進程 – 2012-07-18 08:02:07

回答

2

首先糾正你的線程:

class DBThread extends Thread { 
    @Override 
    public void run() { 
     while (!isInterrupted()) { 
      Cursor mCursor = lrDB.selectUserDetails(mUser_Id); 
      if (mCursor.getCount() > 0) { 
       mCursor.moveToNext(); 
       String Name = mCursor .getString(0); 
       String userName = mCursor .getInt(1); 
       String password = mCursor .getString(3); 

      } 
      mCursor.close(); 
     } 
    } 
} 

其次,關閉線程gracefuly做這樣的事情,在活動:

@Override 
public void onDestroy() { 
    if (yourThread!=null) { 
     yourThread.interrupt(); // request to terminate thread in regular way 
     yourThread.join(500); // wait until thread ends or timeout after 0.5 second 
     if (yourThread.isAlive()) { 
      // this is needed only when something is wrong with thread, for example hangs in ininitive loop or waits to long for lock to be released by other thread. 
      Log.e(TAG, "Serious problem with thread!"); 
      yourThread.stop(); 
     } 
    } 
    super.onDrestroy(); 
} 

注意Thread.destroy()已被棄用,將無法正常工作。

+0

Thread.stop()也被棄用了。所以避免了這個循環,它已經工作了。非常感謝你的幫助。 – user987362 2012-07-19 05:10:56

+0

Thread.stop()yes它已被棄用它可以制動虛擬機的狀態,所以它應該只用作最後的手段,這是我的代碼做了什麼,這就是爲什麼我的代碼記錄一個錯誤。 – 2012-07-19 08:31:52

0

你可以在onStop或onDestroy方法中處理這種情況。在onDestroy方法中斷線程。

+0

沒有爲我工作。即使應用程序崩潰 – user987362 2012-07-18 08:25:20

1

Thread停止,當它退出run方法運行。所以,如果你有一個像

public void run() { 
    while(condition) { 
    // exec 
    } 
} 

remeber模式設置conditionfalse,爲了讓線程完成其執行onDrestroy()呼叫yourThreadInstance.stopThread();

+0

我已經做到了,但線程運行..如果activity在線程中間被銷燬執行會做什麼? – user987362 2012-07-18 08:23:29

+0

可以提供運行中的退出點。只是在離開活動時重新設置退出條件。如果它不工作,意味着該問題與別的 – Blackbelt 2012-07-18 08:25:57

+0

仍然存在問題:( – user987362 2012-07-18 08:53:14

1

添加以下里面

class DBThread extends Thread { 

private boolean finish = true;  

public void stopThread() { 
    finish = false; 
} 

@Override 
public void run() { 
    while (finish) { 
     Cursor cursor = null; 

     Cursor mCursor = lrDB.selectUserDetails(mUser_Id); 
     if (mCursor.getCount() > 0) { 
      mCursor.moveToNext(); 
      String Name = mCursor .getString(0); 
      String userName = mCursor .getInt(1); 
      String password = mCursor .getString(3); 

     } 
     mCursor.close(); 

    } 
} 
} 

的代碼:

@Override 
    protected void onDestroy() { 
     thread.stop(); 
     thread.destroy(); 
     super.onDestroy(); 
    } 
0
@Override  
protected void onStop() { 
     thread.stop(); 
      super.onDestroy(); 
} 


@Override  
protected void onPouse() { 
     thread.stop(); 
     super.onDestroy(); 
} 
0

可以調用運行的線程的中斷功能和線程上驗證,如果你使用的isInterrupted()函數,並相應地繼續中斷。