Autore Topic: Aggiornare UI da una AsyncTask (2 file separati)  (Letto 523 volte)

Offline auron86

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Aggiornare UI da una AsyncTask (2 file separati)
« il: 27 Luglio 2013, 23:37:29 CEST »
0
Salve

Sono nuovo in android, stavo screando un app, e mi ero inoltrato nel magico mondo delle AsyncTask, quando mi sono bloccato


Ho una classe AsyncTask, che deve creare una  ProgressDialog, e poi chiuderla.
Il problema sta nel fatto che il logcat, mi da un errore.

Codice (Java): [Seleziona]
public class JsonFermate extends AsyncTask<String,String,String>{

    MainActivity activity;

    public JsonFermate(MainActivity activity) {
             this.activity = activity;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        activity.pd.show(activity,"Scaricando le Fermate","Downloading...",true,false);
    }


    @Override
    protected String doInBackground(String... strings) {
        return "In progresso";
    }

    @Override
    protected void onPostExecute(String result) {
        activity.pd.dismiss();
    }

 }


di seguito il main


Codice (Java): [Seleziona]
public class MainActivity extends Activity {
    public ProgressDialog pd=null;
   
public MainActivity(){

    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JsonFermate json  = new JsonFermate(MainActivity.this);
        json.execute("Start");
    }

}


illogcat mi da questo errore


Codice: [Seleziona]

07-27 23:30:16.585  30792-30792/it.alessiopiromallo.www.orarivesusviana E/AndroidRuntime: FATAL EXCEPTION: main
        java.lang.NullPointerException
        at it.alessiopiromallo.www.orarivesusviana.JsonFermate.onPostExecute(JsonFermate.java:61)
        at it.alessiopiromallo.www.orarivesusviana.JsonFermate.onPostExecute(JsonFermate.java:32)
        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:137)
        at android.app.ActivityThread.main(ActivityThread.java:5227)
        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:795)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
        at dalvik.system.NativeStart.main(Native Method)



in pratica l'errore consiste del activity.pd.dismiss() , infatti la ProgressDialog, viene correttamente creata, ma poi quando il thread entra nel onPostExecute l'app va in FC
« Ultima modifica: 28 Luglio 2013, 00:13:29 CEST da auron86 »

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Aggiornare UI da una AsyncTask (2 file separati)
« Risposta #1 il: 28 Luglio 2013, 10:32:13 CEST »
+1
Nella MainActivity ti sei scordato di inizializzare pd prima di lanciare il task

Offline auron86

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:Aggiornare UI da una AsyncTask (2 file separati)
« Risposta #2 il: 28 Luglio 2013, 10:58:53 CEST »
0
Ciao, grazie per la risposta 

ho modificato il tutto, tuttavia ora non mi da più errore, ma non termina la PD, in pratica arriva fino al comando dismiss(), ma non la chiude


Codice (Java): [Seleziona]
public class JsonFermate extends AsyncTask<String,String,String>{

    MainActivity activity;

    public JsonFermate(MainActivity activity) {
             this.activity = activity;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        activity.pd.show(activity,"Scaricando le Fermate","Downloading...",true,false);
    }


    @Override
    protected String doInBackground(String... strings) {
        return "In progresso";
    }

    @Override
    protected void onPostExecute(String result) {
        activity.pd.dismiss();
    }

 }


di seguito il main


Codice (Java): [Seleziona]
public class MainActivity extends Activity {
    public ProgressDialog pd;
   
public MainActivity(){

    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pd = new  ProgressDialog(this);
        JsonFermate json  = new JsonFermate(MainActivity.this);
        json.execute("Start");
    }

}


inoltre ho sparso dei log.i in tutto l'AsyncTask, e in effetti il thread arriva correttamente alla onPostExecute()

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Aggiornare UI da una AsyncTask (2 file separati)
« Risposta #3 il: 29 Luglio 2013, 10:11:00 CEST »
+1
Codice (Java): [Seleziona]
        activity.pd.show(activity,"Scaricando le Fermate","Downloading...",true,false);
E' sbagliato, non devi visualizzare il ProgressDialog in questo modo.
Il metodo show che stai usando non visualizza pd, ma crea un ProgressDialog ex novo; per questo quando fai il dismiss() di pd non ti chiude il dialog, è a tutti gli effetti un altro dialog quello che stai vedendo.

Hai due possibilità, o visualizzi pd in modo corretto così:

Codice (Java): [Seleziona]
   @Override
    protected void onPreExecute() {
        super.onPreExecute();
        activity.pd.setTitle("Downloading...");
        activity.pd.setMessage("Scaricando le Fermate");
        activity.pd.setCancelable(false);
        activity.pd.setIndeterminate(true);
        activity.pd.show();
    }

oppure sovrascrivi pd con il dialog che crei col metodo statico così:
Codice (Java): [Seleziona]
   @Override
    protected void onPreExecute() {
        super.onPreExecute();
        activity.pd = ProgressDialog.show(activity,"Scaricando le Fermate","Downloading...",true,false);
    }

A questo punto il dialog che stai vedendo è a tutti gli effetti associato a pd, e facendo il dismiss() viene chiuso.
« Ultima modifica: 29 Luglio 2013, 10:14:04 CEST da Sakazaki »

Offline auron86

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:Aggiornare UI da una AsyncTask (2 file separati)
« Risposta #4 il: 29 Luglio 2013, 10:15:16 CEST »
0
Funziona, grazie 1000 per l' aiuto :)