如何在Android上停止线程?

时间:2014-04-12 12:48:51

标签: android multithreading

我有一个函数parseData,它接收url的Vector并将它们提供给DataParser。 DataParser从URL获取数据并解析它。问题是用户可能会在先前的解析完成之前请求解析新的URL。在那种情况下,先前的数据变得不可靠,但线程继续工作。由于在一个请求中可能存在大量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,我可以检查标志和中断循环,但在我看来很粗鲁。

还有其他方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:0)

您可以使用interrupt()方法:

thread.interrupt();
顺便说一句,检查某些旗帜并不是那么粗鲁和糟糕的风格。但不要忘记将此标志声明为volatile

答案 1 :(得分:0)

您需要定期检查工作线程中的标志。如果要停止工作线程,请设置该标志。

答案 2 :(得分:0)

每次执行解析操作时都可以不断检查布尔标志,如果此标志变为true,则停止解析。

从另一个主题,您可以将此标志的值设置为&#34;取消&#34;解析。

这是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,它会为你取消。

答案 3 :(得分:0)

这种事情在异步任务中完成,而不是直线程。有一个取消方法给他们和一个被取消的功能,可以告诉你停止。