我的应用程序使用了很多 AsyncTasks。毕竟它是一个网络应用程序。当我跟踪 Debug 选项卡时,我注意到每个 AsyncTask 都说在它后面运行,并且在 5 个 AsyncTasks 之后,我无法启动任何 AsyncTasks。我通过更改THREAD_POOL_EXECUTOR
允许 15 个线程池化的执行程序来修复它。但是 AsyncTasks 仍然显示为正在运行。
AsyncTasks 中都有 InputStreams 和 BufferedReaders 来读取 JSON,但我从未close()
在 Streamers 和 Readers 上调用该方法。可能是这样,还是无论如何都会在完成后收集AsyncTask?
如果是这样,那为什么我不能在我的应用程序中运行超过 5 个 AsyncTasks?
看到我悬赏它,我将更明确地解释这一点
所有人都通过他们的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()
方法。我相信这是 5 的Thread
限制SERIAL_EXECUTOR
。我通过投入大部分AsyncTasks
来“解决”问题THREAD_POOL_EXECUTOR
,但这只是在避免它。
AsyncTasks
这些永远不会停止运行和堵塞的原因可能是什么Executor
?