私のアプリは多くの AsyncTask を使用しています。結局のところ、それはWebアプリです。そして、[デバッグ] タブを追跡すると、すべての AsyncTask がその背後で実行されていることがわかり、5 つの AsyncTask の後、AsyncTask を開始できません。THREAD_POOL_EXECUTOR
15 スレッドをプールできるようにエグゼキュータを変更することで修正しました。しかし、AsyncTasks はまだ実行中として表示されます。
AsyncTasks にはすべて、JSON を読み取るための InputStreams と BufferedReaders がありますがclose()
、Streamers と Readers でメソッドを呼び出すことはありません。これはそれでしょうか、それとも AsyncTask は何があっても終了後に収集されますか?
それが問題なら、アプリで 5 つ以上の AsyncTask を実行できないのはなぜですか?
賞金をかけたので、これをより明確に説明します
すべてが彼らのAsyncTasks
方法を通過します。それらはすべて、異なるBasicNameValuePairs
. コードに簡単な間違いがないことは 100% 確信しています。
AsyncTasks の 1 つの例を次に示します。
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()
。これが の 5Thread
の限界だと思いますSERIAL_EXECUTOR
。AsyncTasks
ほとんどを に入れることで問題を「修正」しましTHREAD_POOL_EXECUTOR
たが、これはそれを回避しているだけです。
AsyncTasks
これらが実行を停止せず、詰まる理由は何Executor
でしょうか?