gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:07:10 28 4
gpt4 key购买 nike

如果我做了这样的事情:

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);
}
}

onDestroy() 中调用 mGDT.cancel(true) 会结束 runTasks() 中运行的各个 AsyncTask 吗?实现这样的目标的最佳方法是什么?我有多个机器人将从网络收集数据,我希望每个机器人都有自己的线程,并且如果 fragment 或 Activity 被破坏,我需要能够取消所有机器人。我对 Android 编程和多线程不熟悉,所以我不熟悉执行此类多线程的最佳方法。

最佳答案

这很复杂。cancel() 会中断正在运行的线程(将运行 doInBackgroundImpl() 的线程)。如果外部任务的 doInBackgroundImpl() 尚未运行,则它不会运行。但是,如果它已经运行或正在运行,那么除非您显式查找中断标志,否则它将运行,

    @Override
protected Void doInBackground(Void... params)
{
if (!Thread.isInterrupted()) {
runTasks();
}
}

当然,如果线程的代码执行已经通过了条件中断检查,它将调用runTasks()

现在,如果runTasks()执行execute(),取消外部任务不会影响内部任务的执行。一旦它们被执行,它们就会被放置在AsyncTask的执行器队列中,并且将在前一个任务完成时执行(或者如果队列为空则立即执行)。

外卖,

1) 每个执行的任务都是独立的。没有子线程或类似的概念。您必须明确取消每个任务。一个任务由另一任务启动这一事实与 cancel() 的语义无关。

2) 你根本无法冷停止线程。这就是为什么 Thread.stop() 自 Java 1.2 或其他版本以来就被弃用了。您所能做的就是将其标记为中断,然后希望您在线程中使用的代码遵守 isInterrupted(),或者编写自己的代码来遵守它。

就您而言,如果您的目标是在取消父任务时取消所有子任务,您可以执行以下操作:

@Override
public void cancel(boolean interrupt) {
super.cancel(interrupt);
task1.cancel(interrupt);
task2.cancel(interrupt);
...
}

关于java - 在 AsyncTask 中调用多个 AsyncTask,然后在必要时停止外部任务是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36367481/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com