AsyncTask 是一个抽象类,因此您必须扩展它才能向其中添加您的应用特定功能。你实现doInBackground() 方法来做任何需要的工作。 AsyncTask documentation 详细解释了它。我将简要回答您的每个问题。
如果我想将 Asynctask 设为 SyncTask,我该怎么做?
创建异步任务的想法是正确的,但是正如我之前提到的,您必须将异步任务子类化才能真正做一些工作。
这是一个示例(请注意,Void 类型确实有意义,但 documentation 非常详细地介绍了它们)
public class MyTask extends AsyncTask<Void, Void, Void>
{
//This method will run on the back ground thread
@Override
protected Void doInBackground(Void... params)
{
// All the heavy work should be done here e.g.
// loading from network, database etc.
return null;
}
}
然后在您的活动中,您将创建并运行此任务,如下所示:
MyTask myTask = new MyTask();
myTask.execute()
如果我希望 A 在 B 开始之前完成,我应该怎么做?
如文档所述:
在首次引入时,AsyncTask 是在单个
后台线程。从 DONUT 开始,这变成了一个池
允许多个任务并行运行的线程。从...开始
HONEYCOMB,任务在单线程上执行,避免常见
并行执行导致的应用程序错误。
这意味着如果您使用蜂窝或更高版本的异步任务将在单个线程上运行。因此,如果您按该顺序执行,通常 A 应该在 B 之前执行。但我会做这样的事情:启动 A,然后当 A 的 onPostExecute() 被调用时,你知道 A 已经完成,你可以从这个方法开始你的任务 B,以确保 A 在 B 之前完成。
如果我关闭一个 Activity,该 Activity 上的 AsyncTask 调用是否会
销毁?
这个问题的简短回答是否定的。即使活动调用了destroy,异步任务仍将继续运行。但是,如果异步任务与活动生命周期相关联,您需要确保在活动结束时结束任务,否则您将遇到问题。
如果我关闭整个应用程序,AsyncTask 会调用它吗
应用程序被销毁?
我对这个不是 100% 确定的。我相信这种行为是未指定的,因为现在由 Android 来收集资源。如果资源不足,它可能会决定立即终止任务,也可能不会。但是,您应该避免这种设计。如果您需要在应用程序关闭后运行某些内容,请查看 Service 类。