【发布时间】:2025-12-22 19:40:06
【问题描述】:
我的应用使用了很多 AsyncTask。毕竟它是一个网络应用程序。当我跟踪调试选项卡时,我注意到每个 AsyncTask 都说在它后面运行,并且在 5 个 AsyncTasks 之后,我无法启动任何 AsyncTasks。我通过将执行程序更改为THREAD_POOL_EXECUTOR 来修复它,它允许池化 15 个线程。但是 AsyncTasks 仍然显示为正在运行。
AsyncTasks 中都有 InputStreams 和 BufferedReaders 来读取 JSON,但我从未在 Streamers 和 Readers 上调用 close() 方法。是这样吗,还是AsyncTask完成后无论如何都会被收集?
如果是这样,那为什么我不能在我的应用中运行超过 5 个 AsyncTask?
既然我悬赏了,我会更明确地解释这一点
AsyncTasks 都通过他们的方法。除了BasicNameValuePairs 不同之外,它们都以完全相同的方式构建。我 100% 确定代码中没有简单的错误。
这是其中一个 AsyncTask 的示例:
private class RunningEvent extends AsyncTask<Void, Void, Response> {
@Override
protected void onPreExecute() {
if (Constants.isOnline(getApplicationContext())) {
super.onPreExecute();
} else {
Toast.makeText(getApplicationContext(),
"No internet connection", Toast.LENGTH_LONG).show();
return;
}
}
@Override
protected Response doInBackground(Void... empty) {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(URL);
try {
List<NameValuePair> values = new ArrayList<NameValuePair>(5);
values.add(new BasicNameValuePair("tag", "eventRunning"));
values.add(new BasicNameValuePair("userid", String
.valueOf(response.user.userid)));
post.setEntity(new UrlEncodedFormEntity(values));
HttpResponse httpresponse = client.execute(post);
HttpEntity entity = httpresponse.getEntity();
InputStream stream = entity.getContent();
Log.i("MenuActivity",
"Input streamed, parsing Gson for existing events");
Gson gson = new Gson();
Reader reader = new InputStreamReader(stream);
eventresponse = gson.fromJson(reader, Response.class);
return eventresponse;
} catch (Exception e) {
e.printStackTrace();
Log.e("RunningEvent", "Error sending data to Server");
}
return null;
}
@Override
protected void onPostExecute(Response result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Log.i("MenuActivity", "Binding button");
if (eventresponse != null) {
if (eventresponse.success == 1) {
eventresponse.user = response.user;
bActivity.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
Intent i = new Intent("com.xxx.xxx.EVENT");
i.putExtra("response", eventresponse);
running = false;
switcher.cancel(true);
MenuActivity.this.finish();
startActivity(i);
}
});
} else {
bActivity.setText("Nieuw activity");
bActivity.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
Intent i = new Intent("com.xxx.xxx.NEWEVENT");
i.putExtra("response", response);
running = false;
switcher.cancel(true);
MenuActivity.this.finish();
startActivity(i);
}
});
}
} else {
Log.i("RunningEvent", "Response is null");
}
}
}
上面的例子是有时会作为第6个AsyncTask运行,它永远不会进入doInBackground()方法。我相信这是 SERIAL_EXECUTOR 的 5 Thread 限制。我通过将大多数AsyncTasks 放入THREAD_POOL_EXECUTOR 来“解决”这个问题,但这只是在避免它。
这些AsyncTasks 从未停止运行并堵塞Executor 的原因可能是什么?
【问题讨论】:
-
AsyncTasks 应该完整吗?我的意思是任务是否仍在正常运行,或者它们是否已完成并仍在继续?
-
它们一直在 ADT 调试工具中运行。
-
任务完成了吗,意思是onPostExecute()被调用了吗?
-
他们都完成了他们的步骤并完成了,但他们永远不会被收集。
标签: java android garbage-collection android-asynctask threadpool