Ich entwickle eine Anwendung, in der ich jedes Mal, wenn sich ein Benutzer beim System anmeldet, einige Informationen aktualisieren muss. Außerdem verwende ich die Datenbank im Telefon. Für all diese Vorgänge (Aktualisierungen, Abrufen von Daten aus der Datenbank usw.) verwende ich asynchrone Aufgaben. Bis jetzt habe ich nicht verstanden, warum ich sie nicht verwenden sollte, aber kürzlich habe ich festgestellt, dass einige meiner asynchronen Aufgaben bei einigen Vorgängen einfach vor der Ausführung angehalten werden und nicht zu doInBackground springen. Das war einfach zu seltsam, um es so zu belassen, also habe ich eine andere einfache Anwendung entwickelt, um zu überprüfen, was falsch ist. Und seltsamerweise bekomme ich das gleiche Verhalten, wenn die Anzahl der asynchronen Gesamtaufgaben 5 erreicht, die sechste stoppt bei der Vorausführung.
Hat Android ein Limit von asyncTasks für Aktivität / App? Oder ist es nur ein Fehler und sollte gemeldet werden? Hat jemand das gleiche Problem erlebt und vielleicht eine Problemumgehung gefunden?
Hier ist der Code:
Erstellen Sie einfach 5 dieser Threads, um im Hintergrund zu arbeiten:
private class LongAsync extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
isRunning = true;
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
while (isRunning)
{
}
return null;
}
@Override
protected void onPostExecute(String result)
{
Log.d("TestBug","onPostExecute");
}
}
Und dann erstelle diesen Thread. Es wird preExecute eingeben und hängen (es wird nicht zu doInBackground gehen).
private class TestBug extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
waiting = new ProgressDialog(TestActivity.this);
waiting.setMessage("Loading data");
waiting.setIndeterminate(true);
waiting.setCancelable(true);
waiting.show();
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
return null;
}
@Override
protected void onPostExecute(String result)
{
waiting.cancel();
Log.d("TestBug","onPostExecute");
}
}
quelle
core pool size
odermaximum pool size
?@antonyt hat die richtige Antwort, aber wenn Sie nach einer einfachen Lösung suchen, können Sie sich Needle ansehen.
Damit können Sie eine benutzerdefinierte Thread-Pool-Größe definieren, die im Gegensatz
AsyncTask
zu allen Android-Versionen gleich funktioniert . Damit können Sie Dinge sagen wie:oder Dinge wie
Es kann noch viel mehr. Schau es dir auf GitHub an .
quelle
Update : Seit API 19 wurde die Größe des Kernthreadpools geändert, um die Anzahl der CPUs auf dem Gerät widerzuspiegeln, wobei zu Beginn mindestens 2 und höchstens 4 CPUs vorhanden sind, während die CPU * 2 +1 - Referenz auf maximal 2,5 erhöht wurde
Beachten Sie auch, dass der Standard-Executor von AsyncTask seriell ist (führt jeweils eine Aufgabe und in der Reihenfolge aus, in der sie ankommen), mit der Methode
Sie können einen Executor bereitstellen, um Ihre Aufgaben auszuführen. Sie können den THREAD_POOL_EXECUTOR als Executor unter der Haube bereitstellen, jedoch ohne Serialisierung von Aufgaben, oder Sie können sogar Ihren eigenen Executor erstellen und hier bereitstellen. Beachten Sie jedoch sorgfältig die Warnung in den Javadocs.
Beachten Sie außerdem, dass sowohl das von Executors bereitgestellte Framework THREAD_POOL_EXECUTOR als auch die serielle Version SERIAL_EXECUTOR (standardmäßig für AsyncTask) statisch sind (Konstrukte auf Klassenebene) und daher für alle Instanzen von AsyncTask (s) in Ihrem App-Prozess gemeinsam genutzt werden.
quelle