我有一个函数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,我可以检查标志和中断循环,但在我看来很粗鲁。
还有其他方法可以解决这个问题吗?
答案 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)
这种事情在异步任务中完成,而不是直线程。有一个取消方法给他们和一个被取消的功能,可以告诉你停止。