Android AsyncTask - warum ist doInBackground() nicht ausgeführt wird?
Ich habe eine verschachtelte fragment mit der folgenden Methode:
public void onSave() {
if (getActivity() == null || view == null) return;
if (file != null && file.exists()) {
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
Log.d("log", "onPreExecute of save ex");
}
@Override
protected Void doInBackground(Void... params) {
Log.d("log", "doInBackground of save ex");
//DO SOMETHING
return null;
}
protected void onPostExecute(Void result) {
BaseFragment fragment = new LocalListFragment();
((LocalLauncherFragment)(LocalEditFragment.this.getParentFragment())).setFragment(fragment);
Log.d("log", "end of save ex");
};
}.execute();
} else {
showAlert();
}
}
Mein problem ist, dass wenn ich diese Methode aufrufen, für die erste Zeit, führt er bis onPostExecute(). Allerdings, wenn ich gehen, um andere fragment und öffnet dieses fragment neu(durch die Schaffung eines neuen fragment-Objekt und ersetzen es), dann nur onPreExecute() ausgeführt wird. Warum dies nicht von asyncTask Objekt ausgeführt werden, sowie zum zweiten mal?
Intestingly wenn ich executeOnExecutor() dann funktioniert es gut für das zweite mal. Aber warum nicht execute() arbeiten? Ist AsyncTask Leben gebunden fragment, oder was?
Vielen Dank im Voraus!
- Ich bin mir nicht sicher, aber die Fragmente können UI-Komponenten, also würde ich vorsichtig sein, über Unordnung mit Ihnen viel in hintergrund-threads. Haben Sie versucht, indem Sie Ihre log-Anweisung als erste Zeile in die
doInBackground
Methode und sehen, wenn es auftaucht? - ja habe ich. auf den ersten versuchen, die beide onPreExecute() doInBackground() aufgerufen, aber das zweite mal nur onPReExeucte() aufgerufen wird 🙁
- Wenn Sie mit
executeOnExecutor
ich nehme an, du bist mitTHREAD_POOL_EXECUTOR
und nichtSERIAL_EXECUTOR
Recht? Versuchen Sie, mitSERIAL_EXECUTOR
und ich würde Wetten, erhalten Sie die gleichen (unerwünschten) Verhalten. - Ja, mit SERIAL_EXECUTOR gibt mir das gleiche Ergebnis wie das verwenden von execute(). Etwas scheint wirklich hängen auf der AsyncTask-thread, aber kann nicht herausfinden, warum... weil auf der ersten laufen, onPostExecute() aufgerufen wird, ohne jede problema!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt für mich wie etwas ist hängen im
AsyncTask
. In modernen Versionen von AndroidAsyncTask
s in einem einzigen thread ausgeführt, es sei denn, Sie geben eineExecutor
das ist multi-threaded.onPreExecute()
läuft immer noch erfolgreich, denn das läuft auf dem main thread. Sie sehen niedoInBackground
zweiten mal, obwohl, weil die einzelnen hintergrund-thread noch immer hingen von den ersten Anruf. Sie müssen überprüfen Sie den Inhalt desLocalKeekLauncherFragment.setFragment(fragment)
um zu sehen was hängen.onPostExecute
, aber mein Verdacht ist immer noch, dass etwas, ist die Ursache HIERFÜR hängen im hintergrund-thread. Können Sie nach dem code für//DO SOMETHING
?Scheint es, dass doInBackground thread hat wohl abgestürzt zweiten mal.Es bleibt nicht stecken von den ersten versuchen als onPostExecute genannt und dies ist nur möglich, wenn doInBackground hat zurückgegebene Wert erfolgreich.