2013-08-21 10 views
6

Ho un frammento nidificato che contiene il seguente metodo:AsyncTask Android: perché doInBackground() non viene eseguito?

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(); 
    } 
} 

Il mio problema è che se io chiamo questo metodo per la prima volta, viene eseguito fino a quando OnPostExecute(). Tuttavia, se vado in un altro frammento e apro di nuovo questo frammento (creando un nuovo oggetto frammento e rimpiazzandolo), viene eseguito solo onPreExecute(). Perché questo oggetto asyncTask non viene eseguito correttamente per la seconda volta?

In modo inteso se utilizzo executeOnExecutor(), quindi funziona per la seconda volta. Ma perché execute() non funziona? La vita di AsyncTask è legata al frammento o qualcosa del genere?

Grazie in anticipo!

+0

Non sono sicuro su questo, ma i frammenti possono avere componenti dell'interfaccia utente, quindi starei attento a fare scherzi con loro molto in background. Hai provato a mettere la tua dichiarazione di registro come prima riga nel metodo 'doInBackground' e vedere se si presenta? – kabuko

+0

sì, l'ho fatto. al primo tentativo, vengono chiamati sia onPreExecute() doInBackground() che alla seconda volta, solo onPReExeucte() è chiamato :( – user2062024

+0

Quando si utilizza 'executeOnExecutor', suppongo che si stia utilizzando' THREAD_POEC_EXECUTOR' e non 'SERIAL_EXECUTOR' giusto? Prova con' SERIAL_EXECUTOR' e scommetto che otterrai lo stesso comportamento (indesiderato) – kabuko

risposta

1

Mi sembra che qualcosa sia appeso allo AsyncTask. Nelle versioni moderne di Android AsyncTask s vengono eseguiti su un singolo thread a meno che non si specifichi uno Executor multi-threaded. onPreExecute() viene eseguito correttamente perché viene eseguito sul thread principale. Non si vede mai doInBackground la seconda volta, anche perché il thread in background singolo è ancora bloccato dalla prima chiamata. Dovrai esaminare il contenuto di LocalKeekLauncherFragment.setFragment(fragment) per vedere che cosa causa il blocco.

+0

In realtà quelle 2 righe di transizione dei frammenti dovevano essere in onPostExecute(). Ho modificato il codice e ... al primo tentativo, onPreExecute(), doInBackgroiund(), onPostExecute() eseguito. al secondo tentativo, solo onPreExecute() viene eseguito. Se onPostExecute() viene eseguito al primo tentativo, significa che AsyncTask non si è bloccato sul primo tentativo prova, vero? – user2062024

+0

Sono d'accordo con te che il mio AsyncTask è bloccato perché ho scoperto che dopo che l'ho eseguito la seconda volta, tutte le altre parti in cui AsyncTask.execute() ha smesso di funzionare. – user2062024

+0

Ho controllato lo stato di asyncTask prima di eseguirlo e sembra soddisfacente al secondo tentativo. – user2062024

0

Sembra che il thread doInBackground si sia probabilmente arrestato in un secondo momento. Non può rimanere bloccato dal primo tentativo mentre onPostExecute viene chiamato e questo è possibile solo se doInBackground ha restituito il valore correttamente.