AsyncTasks nie są gromadzone, co powoduje, że inne AsyncTasks nie działają
Moja aplikacja korzysta z wielu AsyncTasks. W końcu jest to aplikacja internetowa. A kiedy śledzę zakładkę Debugowania, zauważam, że każdy AsyncTask mówi, że działa za nim, a po 5 AsyncTasks nie mogę uruchomić żadnych AsyncTasków. Naprawiłem to, zmieniając executor naTHREAD_POOL_EXECUTOR
co pozwala na połączenie 15 wątków. Ale AsyncTasks nadal są wyświetlane jako działające.
Wszystkie AsyncTasks mają strumienie InputStreams i BufferedReaders w nich, aby czytać JSON, ale nigdy nie nazywamclose()
metoda na streamerach i czytnikach. Czy to możliwe, czy AsyncTask zostanie zebrany po zakończeniu, bez względu na wszystko?
Jeśli to jest umowa, to dlaczego nie mogę uruchomić więcej niż 5 AsyncTasków w mojej aplikacji?
Widząc, że nałożyłem na to nagrodę, wyjaśnię to dokładniejTheAsyncTasks
wszyscy przechodzą przez ich metody. Wszystkie są zbudowane dokładnie w ten sam sposób, z wyjątkiem innychBasicNameValuePairs
. Jestem w 100% pewien, że w kodzie nie ma łatwego błędu.
Oto przykład jednego z AsyncTasków:
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");
}
}
}
Powyższy przykład jest czasami pobierany jako szóstyAsyncTask
i nigdy nie wejdzie dodoInBackground()
metoda. Wierzę, że to jest 5Thread
limitSERIAL_EXECUTOR
. „Naprawiłem” problem, umieszczając większośćAsyncTasks
wTHREAD_POOL_EXECUTOR
, ale to jest po prostu unikanie.
Co może być przyczyną tegoAsyncTasks
nigdy nie przestawaj biegać i zatykaćExecutor
?