如果我做了这样的事情:
public class MyFragment extends Fragment
{
private GetDataTask mGDT;
//onCreate() and onCreateView() are implied here
public void runTasks()
{
new TaskOne().execute();
new TaskTwo().execute();
new TaskThree().execute();
}
public class GetDataTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... params)
{
runTasks();
}
}
@Override
public void onResume()
{
super.onResume();
mGDT = new GetDataTask();
mGDT.execute();
}
@Override
public void onDestroy()
{
super.onDestroy();
mGDT.cancel(true);
}
}
在mGDT.cancel(true)
中调用onDestroy()
会结束在runTasks()
中运行的各个AsyncTasks吗?实现这样的目标的最佳方法是什么?我有多个机器人将从网络上收集数据,我希望每个机器人都有自己的线程,如果片段或活动被销毁,我需要能够取消所有这些机器人。我是Android编程和多线程的新手,所以我不熟悉这种多线程的最佳方法。
答案 0 :(得分:1)
这很复杂。cancel()
会中断正在运行的线程(将运行doInBackgroundImpl()
的线程)。如果外部任务的doInBackgroundImpl()
尚未运行,则它将无法运行。但是,如果它已经运行或正在运行,它将继续运行,除非您明确查找中断的标志,
@Override
protected Void doInBackground(Void... params)
{
if (!Thread.isInterrupted()) {
runTasks();
}
}
当然,如果线程的代码执行已经通过条件中断检查,那么它将调用runTasks()
。
现在,如果runTasks()
执行execute(),则取消外部任务不会影响内部任务的执行。执行完成后,它们将被置于AsyncTask
的执行程序队列中,并在上一个任务完成时执行(如果队列为空,则立即执行)。
外卖,
1)每个执行的任务都是独立的。没有subthread或类似的东西的概念。您必须明确取消每项任务。一个任务由另一个任务启动的事实与cancel()
的语义无关。
2)你根本无法阻止线程冷。这就是为什么{1}}自Java 1.2以后被弃用的原因。您所能做的就是将其标记为中断,然后希望您在线程中使用的代码尊重Thread.stop()
,或者编写您自己的代码以尊重它。
在您的情况下,如果您的目标是在取消父任务时取消所有子任务,您可以执行类似的操作,
isInterrupted()