我需要每隔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()
,这不会导致多个线程形成,因为(我认为)之前的线程在我调用之前还没有结束一个新的。或者这是有效的。
答案 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的成员,那么一切都很好。
您也可以考虑使用服务。