Autore Topic: Startare fragment da onPostExecute asynctask  (Letto 500 volte)

Offline EdoardoGoffredoDeveloper

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
Startare fragment da onPostExecute asynctask
« il: 29 Febbraio 2016, 09:36:14 CET »
0
Ciao a tutti...
Premetto che sono alle prime armi con il mondo android..

Ho un problema...
Vorrei startare un fragment all'interno di un onPostExecute di un asycntask..

In poche parole al termine di quest'ultimo dovrebbe startare il fragment..
c'è un modo per poterlo fare al suo interno??

il codice in questione è questo...

Codice (Java): [Seleziona]
@Override
                protected void onPostExecute(String result) {
                        if (processVisibility != false) {
                                pd.dismiss();
                                Toast.makeText(mContext, sendingMessageSuccess,
                                                        Toast.LENGTH_SHORT).show();

                                FragmentBenvenuto fragment = new FragmentBenvenuto();
                                android.support.v4.app.FragmentTransaction fragmentTransaction =
                                                getFragmentManager().beginTransaction();
                                fragmentTransaction.setRetainInstance(true)
                                fragmentTransaction.replace(R.id.fragment_container, fragment);
                                fragmentTransaction.commit();
                               
                        }
                        super.onPostExecute(result);
                }


L'asynctask che uso servirebbe per mandare una mail in background ad un determinato indirizzo...
Quest'ultima viene inviata correttamente ma quando nell'onPostExecute tento di startare il fragment.. l'app crasha..

I codici di errori che ricevo sono questi..

Codice (Java): [Seleziona]
02-29 09:11:58.492  29560-29560/copyworld.assistenzamobile E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: Activity has been destroyed
            at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511)
            at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634)
            at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613)
            at copyworld.assistenzamobile.backgroundMail.BackgroundMail$startSendingEmail$1.onClick(BackgroundMail.java:156)
            at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:185)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:175)
            at android.app.ActivityThread.main(ActivityThread.java:5279)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
            at dalvik.system.NativeStart.main(Native Method)


Come posso fare per poter startare un fragment nell' onPostExecute di un asynctask??

Mi scuso in anticipo se non ho usato termini corretti o sono stato contorto.

Grazie mille in anticipo  :D


Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Startare fragment da onPostExecute asynctask
« Risposta #1 il: 29 Febbraio 2016, 11:06:07 CET »
0
Lì dice che la tua Activity è stata distrutta: è così?

Offline EdoardoGoffredoDeveloper

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
Re:Startare fragment da onPostExecute asynctask
« Risposta #2 il: 29 Febbraio 2016, 11:13:10 CET »
0
si... nel senso mi crasha e mi dice l' "applicazione si è chiusa in modo anomalo"

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Startare fragment da onPostExecute asynctask
« Risposta #3 il: 29 Febbraio 2016, 13:21:39 CET »
0
Il problema si presenta sempre o solo in certi casi?

Offline EdoardoGoffredoDeveloper

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
Re:Startare fragment da onPostExecute asynctask
« Risposta #4 il: 29 Febbraio 2016, 14:39:26 CET »
0
No no sempre.. Ogni volta che premo il bottone che ho inserito... Parte l'asynck task.. Esegue tutto correttamente.. Ma quando va a eseguire quel pezzo di codice dove starto il fragment.. L'app crasha...
La domanda di fondo è.. Nell' onPostExecute di un asynctask si può startare un fragment nel modo che ho inserito sopra?
Perché ho bisogno assolutamente di startarlo nell' onPostExecute..

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Startare fragment da onPostExecute asynctask
« Risposta #5 il: 29 Febbraio 2016, 15:22:43 CET »
0
Ma sei sicuro di aver postato il codice corretto?
Ad esempio,  quel fragmentTransaction.setRetainInstance(true)
non mi convince...

Offline EdoardoGoffredoDeveloper

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
Re:Startare fragment da onPostExecute asynctask
« Risposta #6 il: 29 Febbraio 2016, 15:40:26 CET »
0
Si...
Cioè nel senso.. Ho altri 6 fragment che starto in altre classi (che non hanno un asynctask ma che estendono Fragment) e i fragment vengono startati correttamente..
Come posso fare??
Cosa mi consiglieresti di fare per farlo startare? Hai un codice funzionante nell'onPostExecute?

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Startare fragment da onPostExecute asynctask
« Risposta #7 il: 29 Febbraio 2016, 15:43:09 CET »
0
Scusa se insisto,  ma quel codice dubito che possa compilare:
- manca il ;
- setReatainInstance non è un metodo bdi FragmentTransaction

Cmq prova a postare tutto il codice e specifica la riga che da l'errore.
« Ultima modifica: 29 Febbraio 2016, 15:52:09 CET da iClaude »

Offline EdoardoGoffredoDeveloper

  • Nuovo arrivato
  • *
  • Post: 44
  • Respect: 0
    • Mostra profilo
Re:Startare fragment da onPostExecute asynctask
« Risposta #8 il: 01 Marzo 2016, 16:09:04 CET »
0
Avevo sbagliato a scrivere il pezzo di codice del fragment..
questo è quello corretto che su altre activity funziona perfettamente..

Codice (Java): [Seleziona]
FragmentAssistenza4 fragment = new FragmentAssistenza4();
                                android.support.v4.app.FragmentTransaction fragmentTransaction =
                                                getSupportFragmentManager().beginTransaction();
                                fragmentTransaction.replace(R.id.fragment_container, fragment);
                                fragmentTransaction.commit();

Il problema però persiste... nello startare il fragment (nell'onPostExecute) ricevo questo errore...

Codice (Java): [Seleziona]
03-01 16:07:59.767    5034-5034/copyworld.assistenzamobile E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException: Activity has been destroyed
            at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511)
            at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634)
            at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613)
            at copyworld.assistenzamobile.backgroundMail.BackgroundMail$startSendingEmail.onPostExecute(BackgroundMail.java:143)
            at copyworld.assistenzamobile.backgroundMail.BackgroundMail$startSendingEmail.onPostExecute(BackgroundMail.java:95)
            at android.os.AsyncTask.finish(AsyncTask.java:631)
            at android.os.AsyncTask.access$600(AsyncTask.java:177)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:175)
            at android.app.ActivityThread.main(ActivityThread.java:5279)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
            at dalvik.system.NativeStart.main(Native Method)

come posso fare per risolvere??

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Startare fragment da onPostExecute asynctask
« Risposta #9 il: 02 Marzo 2016, 10:33:53 CET »
0
In generale usare un AsyncTask semplice per operazioni di rete, a meno di non incorporarlo in un retained Fragment con tutti i controlli del caso, non è una buona idea appunto perché nel frattempo l'Activity potrebbe essere distrutta.

Detto questo la distruzione di un Activity dovrebbe essere l'eccezione, non la regola (rotazione telefono, memoria satura, ecc.). Dal codice che hai postato non riesco a capire da dove nasce il problema. Bisognerebbe vedere tutto il resto.