Autore Topic: Aggiornare TextView con AsyncTask  (Letto 1161 volte)

Offline atm

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP/7
Aggiornare TextView con AsyncTask
« il: 08 Giugno 2013, 15:05:30 CEST »
0
Salve a tutti,

allora la mia activity(ReadNews) riceve da un'activity(News) chiamate un array di informazioni.

La mia activity ReadNews ha due pulsanti per leggere la notizia precedente e quella successiva...

Cliccando su uno dei due bottoni vorrei leggere la notizia precedente o successiva.

Questo funziona correttamente.

Quello che vorrei è che quando l'utente clicca un bottone ci sia una ProgressDialog che dice: "Caricamento in corso"...

Quando la textbox ha terminato il caricamento(metodo setText()), far scomparire la ProgressDialog.

L'effetto che ottengo adesso non da la percezione all'utente che abbia clicclato il pulsante....

Se volete vi posto la classe intera....

Spero di esser stato chiaro e che qualcuno mi possa aiutare...

Comunque Grazie a tutti


Post unito: 09 Giugno 2013, 18:17:50 CEST
Ma nessuno mi sa aiutare?  :-(
« Ultima modifica: 09 Giugno 2013, 18:17:50 CEST da atm, Reason: Merged DoublePost »

Offline MikeKeepsOnShine

  • Utente junior
  • **
  • Post: 84
  • Respect: 0
    • mikekeepsonshine
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Fame , Samsung Galaxy Tab 2 7.0
  • Sistema operativo:
    Windows 7
Re:Aggiornare TextView con AsyncTask
« Risposta #1 il: 10 Giugno 2013, 10:49:16 CEST »
0
Prova a postare il codice ( o magari solo la parte che ti interessa risolvere) e vediamo che si può fare  ;-)
True perfection has to be imperfect

Offline atm

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP/7
Re:Aggiornare TextView con AsyncTask
« Risposta #2 il: 10 Giugno 2013, 11:31:18 CEST »
0
Grazie Mike per la risposta...

Ecco il codice che uso...

Codice del click bottone "lettura notizia precedente"
Codice: [Seleziona]
((Button) findViewById(R.id.PrevNews)).setOnClickListener(new View.OnClickListener() {
           public void onClick(View paramAnonymousView) {
               int currentnews = getNews(); //restituisce l'id dell'array delle notizie
               if(currentnews >= 0){
                 readNews(arrayNews.get(currentnews));
               }
           }
       });

Metodo readNews....

Codice: [Seleziona]
private void readNews(Article art) {
       try{
         //pd e' una ProgressDialog di classe
         this.pd = ProgressDialog.show(this, "Caricamento in corso", "Carico...", true, false);
         this.pd.setCancelable(true);
         AsTask as = new AsTask(art);
         as.execute(new Void[0]);
       }
       catch(Exception ex){
       }
   }


Classe AsTask

Codice: [Seleziona]
private class AsTask extends AsyncTask<Void, Void, Void> {
       private Article myArt = null;

       private AsTask(Article art) {
         this.myArt = art;
       }

       protected Void doInBackground(Void[] paramArrayOfVoid) {
           txtNews.setText(myArt.getFullText());
           return null;
       }

       @Override
       protected void onPostExecute(Void paramVoid) {
           this.pd.dismiss();
       }

       @Override
       protected void onProgressUpdate(Void[] paramArrayOfVoid) {
           this.pd.setMessage("download");
       }
   }


Grazie mille

Offline MikeKeepsOnShine

  • Utente junior
  • **
  • Post: 84
  • Respect: 0
    • mikekeepsonshine
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Fame , Samsung Galaxy Tab 2 7.0
  • Sistema operativo:
    Windows 7
Re:Aggiornare TextView con AsyncTask
« Risposta #3 il: 10 Giugno 2013, 17:45:41 CEST »
0
E' proprio necessario passare attraverso il metodo readNews() ?
All'interno di questo metodo cerchi di attivare la ProgressDialog e fai partire l'async task.
Prova così:
Codice (Java): [Seleziona]
((Button) findViewById(R.id.PrevNews)).setOnClickListener(new View.OnClickListener() {
                                   public void onClick(View paramAnonymousView) {
                                           int currentnews = getNews(); //restituisce l'id dell'array delle notizie
                                           if(currentnews >= 0){
                                                AsTask as = new AsTask(arrayNews.get(currentnews));
                                                as.execute(new Void[0]);
                                           }
                                   }
                           });

E nell'AsyncTask aggiungi il metodo onPreExecute, nel quale parte la ProgressDialog:
Codice (Java): [Seleziona]
private class AsTask extends AsyncTask<Void, Void, Void> {
                                   private Article myArt = null;

                                   private AsTask(Article art) {
                                         this.myArt = art;
                                   }
                                   
                                   protected void onPreExecute(){
                                                super.onPreExecute();
                                                pd = ProgressDialog.show(this, "Caricamento in corso", "Carico...", true, false);
                                                pd.setCancelable(true);
                                   }

                                   protected Void doInBackground(Void[] paramArrayOfVoid) {
                                           txtNews.setText(myArt.getFullText());
                                           return null;
                                   }

                                   @Override
                                   protected void onPostExecute(Void paramVoid) {
                                           this.pd.dismiss();
                                   }

                                   @Override
                                   protected void onProgressUpdate(Void[] paramArrayOfVoid) {
                                           this.pd.setMessage("download");
                                   }
                           }

Spero possa esserti d'aiuto, fammi sapere!  ;-)
True perfection has to be imperfect

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Aggiornare TextView con AsyncTask
« Risposta #4 il: 10 Giugno 2013, 18:34:22 CEST »
0
Non sono entrato nel merito del codice, ma l'ultimo esempio dovrebbe essere ok.

Vorrei farti notare una cosa sulle Dialog.
Ho già postato questo tipo di link, ma credo che sia di una grande utiltà.
Le dialog stanno scomparendo dalla linee guida Android.
Di per se non sono sbagliate, ma non aggiungono niente nella navigazione dell'utente, anzi presentano spesso un comportamento modale che è preferibile evitare.
Informazioni chiamate in-line e non bloccanti sull'utente sono sempre preferibili.

Linko un post di uno degli sviluppatori Android di Google
https://plus.google.com/+RomanNurik/posts/eSCfnyTzFUx


Offline atm

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP/7
Re:Aggiornare TextView con AsyncTask
« Risposta #5 il: 10 Giugno 2013, 20:37:23 CEST »
0
Grazie ad entrambi per la risposta...

Mike non funziona....

Ti allego il LogCat dell'errore causato dalla riga:
Codice: [Seleziona]
txtNews.setText(myArt.getFullText());

18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime   FATAL EXCEPTION: AsyncTask #3
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime   java.lang.RuntimeException: An error occured while executing doInBackground()
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.os.AsyncTask$3.done(AsyncTask.java:278)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at java.util.concurrent.FutureTask.run(FutureTask.java:137)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at java.lang.Thread.run(Thread.java:856)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime   Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.view.View.requestLayout(View.java:12675)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.widget.ScrollView.requestLayout(ScrollView.java:1386)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.widget.TextView.checkForRelayout(TextView.java:6767)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.widget.TextView.setText(TextView.java:3306)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.widget.TextView.setText(TextView.java:3162)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.widget.TextView.setText(TextView.java:3137)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at it.pc.meteo.ReadNewsActivity$AsTask.doInBackground(ReadNewsActivity.java:180)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at it.pc.meteo.ReadNewsActivity$AsTask.doInBackground(ReadNewsActivity.java:164)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at android.os.AsyncTask$2.call(AsyncTask.java:264)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
18:33:02.527   866   it.pc.meteo   ERROR   AndroidRuntime       ... 5 more
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager   Activity it.pc.meteo.ReadNewsActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@414ecac8 that was originally added here
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager   android.view.WindowLeaked: Activity it.pc.meteo.ReadNewsActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@414ecac8 that was originally added here
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.view.Window$LocalWindowManager.addView(Window.java:537)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.app.Dialog.show(Dialog.java:278)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.app.ProgressDialog.show(ProgressDialog.java:116)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.app.ProgressDialog.show(ProgressDialog.java:104)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at it.pc.meteo.ReadNewsActivity$AsTask.onPreExecute(ReadNewsActivity.java:175)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.os.AsyncTask.execute(AsyncTask.java:511)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at it.pc.meteo.ReadNewsActivity.readNews(ReadNewsActivity.java:133)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at it.pc.meteo.ReadNewsActivity.access$200(ReadNewsActivity.java:28)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at it.pc.meteo.ReadNewsActivity$2.onClick(ReadNewsActivity.java:72)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.view.View.performClick(View.java:3511)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.view.View$PerformClick.run(View.java:14105)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.os.Handler.handleCallback(Handler.java:605)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.os.Handler.dispatchMessage(Handler.java:92)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.os.Looper.loop(Looper.java:137)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at android.app.ActivityThread.main(ActivityThread.java:4424)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at java.lang.reflect.Method.invokeNative(Native Method)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at java.lang.reflect.Method.invoke(Method.java:511)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
18:33:05.137   866   it.pc.meteo   ERROR   WindowManager       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

Come mai?


Comunque studierò anche la possibilità di implementare quello suggerito da GabMarioPower.... Spero di risolvere il prima possibile...

Grazie

Post unito: 10 Giugno 2013, 20:46:38 CEST
Ho risolto così:

Codice (Java): [Seleziona]
runOnUiThread(new Runnable() {
                public void run() {
                  txtNews.setText(myArt.getFullText());
                }
            });

Grazie....
« Ultima modifica: 10 Giugno 2013, 20:46:38 CEST da atm, Reason: Merged DoublePost »

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 TextView con AsyncTask
« Risposta #6 il: 11 Giugno 2013, 09:10:48 CEST »
0
Ho risolto così:

Codice (Java): [Seleziona]
runOnUiThread(new Runnable() {
                public void run() {
                  txtNews.setText(myArt.getFullText());
                }
            });

Please do not try this at home, at school or anywhere!

Mai lanciare thread nel thread della UI, il metodo runOnUiThread andrebbe bandito.

Torna ad usare l'AsyncTask, il problema che ti dava dipende dal fatto che cercavi di modificare il campo di testo dal doInBackground(...), ma qualsiasi modifica alla UI pilotata da un AsyncTask va fatta nel onPostExecute(...).
Tutto li.