簡體   English   中英

如何在Android上停止線程?

[英]How to stop the thread on Android?

我有一個函數parseData,它接收URL的Vector並將它們提供給DataParser。 DataParser從URL獲取數據並進行解析。 問題在於用戶可能會在先前的解析完成之前請求新的URL進行解析。 在那種情況下,先前的數據變得無關緊要,但是線程繼續工作。 由於一個請求中可能包含許多網址,並且解析每個網址都需要花費時間,因此在5-6次連續請求之后,電話啟動會非常緩慢。

這是代碼片段。

public void parseData(final String key, final Vector<String> data)
{
    this.key = key;
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            DataParser dp = new DataParser(key);
            dp.setData(data);
            dp.startParse();
        }
    });
    thread.start();
}

我認為解決方案可能是在DataParser中保留額外的標志。 由於它在周期內請求url,因此我可以檢查標志和中斷周期,但是對我來說似乎很粗魯。

還有其他方法可以解決此問題嗎?

您可以使用interrupt()方法:

thread.interrupt();

順便說一句,檢查某些標志並不是那么粗魯和糟糕的風格。 但是不要忘記將此類標志聲明為volatile

您需要定期檢查工作線程中的標志。 如果要停止工作線程,則設置該標志。

您可以在每次執行解析操作時不斷檢查布爾值標志,並在該標志變為true時停止解析。

您可以從另一個線程建立此標志的值,以“取消”解析。

這是AsyncTasks用於取消在doInBackground()中完成的工作的技術。

class DataParser {
   private boolean volatile mIsCancelled = false;

   public void startParsingAsync() {
       new Thread(new Runnable(
                 public void run() {
                      parse();
                 } 
       )).start();
   }

   private void parse() {
          while(!isCancelled()) {
              parseNextNode();
          }
   }

   private synchronized void isCancelled() {
        return mIsCancelled();
   }

   public synchronized void cancel() {
       mIsCancelled = true;
   }

   private void parseNextNode() {
     .....
   }

一旦數據變得無關緊要,則可以從另一個線程調用cancel()方法。

請注意,您必須同步對標志的訪問,因為將從不同線程訪問該標志。

此代碼未經測試,因此可能甚至無法編譯...

這是理論,但是對於實際使用,您應該使用AsyncTask,它為您提供取消功能。

這種事情在異步任務而不是直接線程中做得很好。 有一個取消方法,它們是一個被取消的功能,可以告訴您停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM