2015-12-02 215 views
0

我正在開發具有服務類的Android應用程序。我服務課,我必須開始一個線程。它工作正常。但我需要停止線程。我曾與Android:停止線程

mThread.destroy(); 
mThread.stop(); 

使用,但都被棄用,我已經使用

mThread.interrupt(); 

,但它仍然無法正常工作。

代碼

public void Receivepatientattributes(byte[] readBuf, int len) { 

    if (readBuf[8] == 6){ 

       pktcount++; 

       byte pkmsb = readBuf[11]; 
       byte pklsb = readBuf[10]; 
       int pkresult = (pkmsb << 8) | ((int)pklsb & (0x00FF)); 

       System.out.println("Packet : "+pktcount+" : "+pkresult); 
       if(pkresult == pktcount){      

        for(int i = 0, j = 14; i < len ; i++, j++) { 
         queue.add(readBuf[j]); 
        } 
        if(mThread.getState() == Thread.State.NEW) { 
         mThread.start(); 
         System.out.println("Start Thread "); 

        } else { 
         System.out.println("No Thread Found"); 
        } 

       } else { 
        displayToast("Packet Count Error"); 
       } 
     } 
    } 
} 
class CommunicationThread implements Runnable { 

    @Override 
    public void run() { 

     do{ 
      if(queue.getFirst() == (byte)0x80) { 
       System.out.println("absolu1 " + queue.getFirst()); 
       getabs_data(); 

      } 
     } while (queue.size() > 132); 

     if(mThread.getState() == Thread.State.RUNNABLE) { 
      mThread.interrupt(); 
     } 
    } 
} 
+0

http://www.ibm.com/developerworks/library/j-jtp05236/是一個很好的文章WRT正確中斷線程。 – zapl

回答

0

嘗試用

你的循環中。

+0

「試試這個」並不是很有幫助,因爲它沒有解釋什麼是錯的,或者如何在另一種情況下解決它。 –

0

Java沒有提供任何方法來安全地停止一個線程,它僅提供中斷

可以發送攔截到一個線程但這並不意味着要殺死一個線程只有當目標線程能夠響應此攔截時,它才能自行停止。

例如,目標有一個循環來檢查是否中斷。或者,如果目標線程調用了一些可中斷的阻塞函數,則可以檢查catch塊中的中斷並停止該線程。

有關Java併發性的信息,請閱讀本書《Java Concurrency in Practice》

0

Thread對象是由系統,可以對其進行修改您的應用程序之外的控制。出於這個原因,您需要在中斷它之前鎖定線程的訪問權限,方法是將訪問權限放入同步塊中。

ublic class PhotoManager { 
public static void cancelAll() { 
    /* 
    * Creates an array of Runnables that's the same size as the 
    * thread pool work queue 
    */ 
    Runnable[] runnableArray = new Runnable[mDecodeWorkQueue.size()]; 
    // Populates the array with the Runnables in the queue 
    mDecodeWorkQueue.toArray(runnableArray); 
    // Stores the array length in order to iterate over the array 
    int len = runnableArray.length; 
    /* 
    * Iterates over the array of Runnables and interrupts each one's Thread. 
    */ 
    synchronized (sInstance) { 
     // Iterates over the array of tasks 
     for (int runnableIndex = 0; runnableIndex < len; runnableIndex++) { 
      // Gets the current thread 
      Thread thread = runnableArray[taskArrayIndex].mThread; 
      // if the Thread exists, post an interrupt to it 
      if (null != thread) { 
       thread.interrupt(); 
      } 
     } 
    } 
} 
... 

}

供進一步參考使用該link

0

CommunicationThread,有一個do ... while循環。編輯這個循環中加入isInterrupted()到環路的病情稍有:

do{ 
     if(queue.getFirst() == (byte)0x80) { 
      System.out.println("absolu1 " + queue.getFirst()); 
      getabs_data(); 

     } 
    } while (mThread.isInterrupted() && queue.size() > 132); 
0

這不是在Android中使用線程是一個好主意。因爲它不是線程安全的。相反,請使用AsyncTask,這是爲此目的而提供的android sdk。 僅供參考,用於取消的AsyncTask你應該叫:

myAsyncTask.cancel(true); 
+1

不真實/過於簡單。 'AsyncTask'本身不過是使用普通的''Thread''的更好的方法。當你實現他們的模式時,他們是首選的:從主線程中分離出來的任務需要報告回主線程。 'AsyncTask'爲主線程和後臺線程之間的來回提供了一個很好的抽象。他們不添加任何魔法線程安全。 – zapl