使用新的Asynctask替换AsyncTask时会发生什么

时间:2014-12-17 05:06:45

标签: java android android-asynctask

快速Android问题...当您创建一个替换现有AsyncTask的新AsyncTask时会发生什么?例如,您有一个简单的活动:

public class ExampleActivity extends Activity{

    private MyTask myTask;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // first instance
        myTask = new MyTask();
        myTask.execute();

        // immediately replace first instance
        // assume the first instance hasn't finished yet
        myTask = new MyTask();
        myTask.execute();


    }
}

第一个实例会发生什么?它完成了吗?是垃圾收集?

7 个答案:

答案 0 :(得分:2)

两个实例都将单独运行,直至任务完成。

首次推出时,AsyncTasks在一个后台线程上连续执行。

从DONUT开始,这被改为一个线程池,允许多个任务并行运行。

从HONEYCOMB开始,任务在单个线程上执行,以避免因并行执行而导致的常见应用程序错误。

答案 1 :(得分:1)

假设第一个实例从0毫秒开始并以9毫秒结束,然后第二个实例以3毫秒结束,并在其他时间结束,所以如果它将在堆栈中并行执行代码。

答案 2 :(得分:1)

AsyncTask串行运行,意味着它们一个接一个地运行。当你将myTask设置为另一个AsyncTask时,它没有摆脱你刚刚开始的旧版本,你只是失去对它的引用。现在第二个AsyncTask将在第一个完成后运行。

答案 3 :(得分:1)

在任务完成之前,实例不会被垃圾收集。请注意,这可能会导致内存泄漏。

答案 4 :(得分:0)

根据文件:

AsyncTask可以正确,轻松地使用UI线程。此类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

因此,两个实例将在单独的线程中运行而不会相互链接,并且将一直运行直到完成。

答案 5 :(得分:0)

问题最初(在早期的Android OS版本中)池大小只有1,这意味着没有对一堆AsyncTasks进行并行计算。但后来他们修复了这个问题,现在大小为5,所以最多可以同时运行5个AsyncTasks。 https://github.com/vitkhudenko/test_asynctask

答案 6 :(得分:0)

AsyncTask在UI线程上运行,它们是串行执行的。 Yaa,你会在那里泄漏。尝试在这里运行内存分析器工具,你将在这里了解保留堆。

您无法在AsyncTask的单个实例上运行执行,如:

 myTask = new MyTask();
myTask.execute();
myTask.execute(); // Illegal

as,在文档中说明

任务只能执行一次(如果尝试第二次执行,则会抛出异常。)

参考:http://developer.android.com/reference/android/os/AsyncTask.html

但你要做的是非常合法的。

相关问题