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 mit THREAD_POOL_EXECUTOR und nicht SERIAL_EXECUTOR Recht? Versuchen Sie, mit SERIAL_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!
InformationsquelleAutor user2062024 | 2013-08-21
Schreibe einen Kommentar