2009-06-20 75 views
4

移動應用程序向用戶提供從遠程下載電子郵件附件的選項。與遠程服務器連接並下載內容在單獨的線程中執行。向用戶顯示取消命令。赫瑞史密斯我提供了僞代碼。當用戶觸發取消命令時停止線程

new Thread(new Runnable() 
    public void run(){ 
    try{ 
    //open connection to remote server 
    //get data input stream 
    //create byte array of length attachment size 
    //show modeless dialog with the message "Downloading..." 
    for(int i=0;i<attachmentSize;i++){ 
     //set the progress indicator of the modeless dialog based upon for iteration 
     //read the byte from input stream and store it in byte array 
    } 
     //open file connection outputstream and store the downloaded content as a file in mobile file system 
     //show dialog with the message "attachment successfully downloaded" 
     } 
     catch(IOException ioe) { } 
     catch(Exception ex) { } 
    } 
).start(); 

現在我正在向具有進度指示器的對話框添加取消命令。當用戶點擊手機中的「取消」命令時,可通過調用dispose()方法來處理非模態對話框。我如何突然停止通過流式傳輸獲取電子郵件附件的線程? 請幫我解決這個問題。

回答

0

我不是這方面的專家,所以把我的建議與一粒鹽,因爲我的經驗是非常有限的Java線程。

您無法停止正在運行的線程。您可以儘快退出。因此,您可以做的是例如在輔助線程中定期測試共享標誌。當主線程設置它以響應取消點擊時,輔助線程返回。

2

您可以突然停止它 - 但它帶來了更多的麻煩,它是值得的。

這樣做的典型方法是有它的Runnable的檢查標誌:

public class ClassHoldingRunnable { 

    private volatile boolean stopRequested = false; 

    public void executeAsync() { 

     Runnable r= new Runnable() { 

      public void run() { 

       while (!stopRequested) { 
        // do work 
       } 
      } 
     } 

     new Thread(r).start(); 
    } 

    public void cancel() { 
     stopRequested = true; 
    } 
} 

的幾個注意事項:

  • 這對stopRequested標誌是無論是重要volatile或有其他可見性保證(​​,Lock,Atomic),因爲它正在被多個線程訪問;
  • 如果最終用戶對響應式圖形用戶界面非常重要,那麼您應該經常檢查stopRequested;
0

我的經驗更多的是C#,但是這可能仍然適用......

我不認爲這是找到的只是某種方式「殺死線程」任何比你更是一個好主意只需刪除一個對象並跳過它的析構函數。

你可以告訴線程通過中斷自殺。然後,您可以使用該線程的中斷標誌作爲指示符,或者如果您有睡眠/等待,您可以捕獲一箇中斷的異常,並在捕獲該異常時正常關閉(在finally塊中)。這應該或多或少地提供您要查找的內容。

1

有幾種方法可以中斷從Connection讀取的線程。

  • 你可能通過循環到InputStream.read單個呼叫讀取遠程數據,因此可以重用一個單一的,比較小,字節[]對象。您可以在每次迭代之前檢查一個布爾成員變量。你並不需要圍繞該布爾值進行同步,因爲它只能在線程構建後更改一次值。

  • 關閉Connection意味着當下一次嘗試訪問它時,線程將拋出IOException。適當的JavaME實現將不會生成Connection。即使另一個線程正在從Connection的InputStream中讀取,close()也會阻塞。

相關問題