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!
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
sì, l'ho fatto. al primo tentativo, vengono chiamati sia onPreExecute() doInBackground() che alla seconda volta, solo onPReExeucte() è chiamato :( – user2062024
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