在AsyncTask中运行AsyncTask会导致内存泄漏吗?

时间:2016-05-01 13:43:20

标签: android android-asynctask

我需要每隔5秒左右发送一次http Post请求。为此我设置了一个像这样的AsyncTask:

class httpPostAsync extends AsyncTask{

    @Override
    protected Object doInBackground(Object[] params) {
        httpPost();         //The posting function
        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                new httpPostAsync().execute();
            }
        },5000);
    }
}

我想知道如果我在execute()函数中使用onPostExecute(),这不会导致多个线程形成,因为(我认为)之前的线程在我调用之前还没有结束一个新的。或者这是有效的。

3 个答案:

答案 0 :(得分:1)

  

我想知道如果我在onPostExecute()函数中使用execute()(...)

实际上你没有在onPostExecute()中执行任何操作 - 你唯一要做的就是在MessageQueue中添加一个新的Runnable。

当系统从队列中获取此消息进行处理时,它将从Runnable启动run()方法,并将新的AsyncTask添加(new httpPostAsync().execute();)到异步任务队列(因为所有异步任务在单独的单线程中处理。)

  

(...)因为(我认为)之前的线程在我调用新的

之前还没有结束

你又错了;)系统在一个单独的工作线程上只运行了doInBackground AsyncTaks方法。 onPostExecute在应用程序的主UI线程中运行,postDelay() Runnable在与postDelay()相同的线程中执行,因此在您的情况下 - 也在主UI线程中。

就我而言,你的代码不应该导致内存泄漏。

请参阅: Android Developers - API Guides - Processes and Threads

答案 1 :(得分:0)

不,它不会导致内存泄漏。

但是,您可能想要重新处理如何处理此问题。旋转asynctask是昂贵的,你可能只用一个来完成这个而不是链接其中的2个。

例如,

void httpRequst()
void httpPost()

doInBackground(Void void){
   httpRequst();
   httpPost():
return null;
}

而不是启动第二个异步任务......

答案 2 :(得分:0)

这取决于您如何声明httpPostAsync。例如,如果它是Activity / Fragment的非静态内部类,则可能导致内存泄漏。

如果它是在独立文件中定义的,并且您没有使用上下文或Activity / Fragment的成员,那么一切都很好。

您也可以考虑使用服务。