Autore Topic: Cambiare l'immaggine dell'image view a runtime  (Letto 1241 volte)

Offline nirvana91

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 7, Ubuntu 12.10
Cambiare l'immaggine dell'image view a runtime
« il: 08 Febbraio 2012, 11:41:37 CET »
0
Ciao a tutti, nell'app che sto sviluppando ho bisogno di scaricare immagini da un server ogni 15 secondi e di settare l'immagine scricata come drawable di un ImageView.
Le immagini le scarico tranquillamente ma al momento del cambio del drawable dell'imageView da errore.
per scaricare le immagini uso il seguente timerTask:

Codice (Java): [Seleziona]
class TakeBanner extends TimerTask{
               
                public void run() {
                        receiveBannerURL ();           
                }
               
                public void receiveBannerURL () {
                        scaricaBanner();
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                }
               
               
        }

il quale richiama un metodo dell'activity in cui devo cambiare l'immagine:
Codice (Java): [Seleziona]
public void scaricaBanner(){
                try {
                        String URL = "banner.do";
                        List<NameValuePair> parameters = new ArrayList<NameValuePair>();
                        parameters.add(new BasicNameValuePair("email",DataMethods.getUtente().getEmail()));
                        HttpResponse resp = HttpMethods.sendRequest(MonitoringMapActivity.http+URL, parameters);
                        HashMap<String, String> hm = DataMethods.xmlParserBanner(resp);
                        URL thumb_u = new URL(hm.get("url"));
                    Drawable thumb_d = Drawable.createFromStream(thumb_u.openStream(), "src");
                    iv.setImageDrawable(thumb_d);
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }


ecco l'errore che da nel logcat:
Codice: [Seleziona]
02-08 10:29:18.342: W/System.err(341): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-08 10:29:18.362: W/System.err(341): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-08 10:29:18.362: W/System.err(341):         at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
02-08 10:29:18.362: W/System.err(341):         at android.view.ViewRoot.invalidateChild(ViewRoot.java:607)
02-08 10:29:18.372: W/System.err(341):         at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633)
02-08 10:29:18.372: W/System.err(341):         at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505)
02-08 10:29:18.372: W/System.err(341):         at android.view.View.invalidate(View.java:5139)
02-08 10:29:18.372: W/System.err(341):         at android.widget.ImageView.setImageDrawable(ImageView.java:311)
02-08 10:29:18.372: W/System.err(341):         at com.greencar.activity.MonitoringMapActivity.scaricaBanner(MonitoringMapActivity.java:223)
02-08 10:29:18.372: W/System.err(341):         at com.greencar.activity.MonitoringMapActivity$TakeBanner.receiveBannerURL(MonitoringMapActivity.java:282)
02-08 10:29:18.382: W/System.err(341):         at com.greencar.activity.MonitoringMapActivity$TakeBanner.run(MonitoringMapActivity.java:278)
02-08 10:29:18.382: W/System.err(341):         at java.util.Timer$TimerImpl.run(Timer.java:289)
02-08 10:29:18.392: W/System.err(341):         at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
02-08 10:29:18.392: W/System.err(341):         at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.view.View.requestLayout(View.java:8125)
02-08 10:29:18.392: W/System.err(341):         at android.widget.ImageView.setImageDrawable(ImageView.java:310)
02-08 10:29:18.392: W/System.err(341):         at com.greencar.activity.MonitoringMapActivity.scaricaBanner(MonitoringMapActivity.java:223)
02-08 10:29:18.402: W/System.err(341):         at com.greencar.activity.MonitoringMapActivity$TakeBanner.receiveBannerURL(MonitoringMapActivity.java:282)
02-08 10:29:18.402: W/System.err(341):         at com.greencar.activity.MonitoringMapActivity$TakeBanner.run(MonitoringMapActivity.java:278)
02-08 10:29:18.402: W/System.err(341):         at java.util.Timer$TimerImpl.run(Timer.java:289)


la riga 223 è proprio:
Codice: [Seleziona]
iv.setImageDrawable(thumb_d);

Soluzioni? grazie in anticipo!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Cambiare l'immaggine dell'image view a runtime
« Risposta #1 il: 08 Febbraio 2012, 11:51:28 CET »
0
Hai provato a cercare

"android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."

?

Offline nirvana91

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 7, Ubuntu 12.10
Re:Cambiare l'immaggine dell'image view a runtime
« Risposta #2 il: 08 Febbraio 2012, 12:16:21 CET »
0
Allora ho letto su internet che si poteva risolvere con un async task e in effetti funziona, ma il problema adesso è che non riesco a stoppare l'asynctask
quindi quando cambio activity il task continua a scaricare immagini dal server
e anche quando esco dall'applicazione.  Ho provato a fare nomeTask.cancel(true) ma continua imperterrito!

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Cambiare l'immaggine dell'image view a runtime
« Risposta #3 il: 08 Febbraio 2012, 15:54:22 CET »
0
Allora ho letto su internet che si poteva risolvere con un async task e in effetti funziona, ma il problema adesso è che non riesco a stoppare l'asynctask
quindi quando cambio activity il task continua a scaricare immagini dal server
e anche quando esco dall'applicazione.  Ho provato a fare nomeTask.cancel(true) ma continua imperterrito!
perchè lo lanci millemila volte o al suo interno c'è un ciclo che non finisce mai....
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline nirvana91

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Windows 7, Ubuntu 12.10
Re:Cambiare l'immaggine dell'image view a runtime
« Risposta #4 il: 08 Febbraio 2012, 19:31:50 CET »
0
il problema era nel timer task. Lo cancellavo ma lo riaprivo da un'altra parte e quindi lui continuava ad aprire async task...