在AsyncTask中调用多个AsyncTasks然后在必要时停止外部任务是否安全?

时间:2016-04-01 23:38:55

标签: java android multithreading android-asynctask

如果我做了这样的事情:

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编程和多线程的新手,所以我不熟悉这种多线程的最佳方法。

1 个答案:

答案 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()