Autore Topic: Problema ImageView e cambio immagine  (Letto 754 volte)

Offline bttf92

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid A1
  • Sistema operativo:
    Windows 7 Pro\Linux Mint
Problema ImageView e cambio immagine
« il: 12 Aprile 2011, 16:00:45 CEST »
0
Salve a tutti!! :-)

Questo è il mio primo post, e già tratta di un problema. In pratica ho la necessità di visualizzare un'orologio utilizzando delle immagini che raffigurano i numeri, quindi ho creato un timer(con periodo 1 sec) che aggiorna i ImageViews con le immagini in base all'orario. Per semplificare l'esecuzione ho creato un LevelListDrawable:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="UTF-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:maxLevel="0" android:drawable="@drawable/g0" />
  <item android:maxLevel="1" android:drawable="@drawable/g1" />
  <item android:maxLevel="2" android:drawable="@drawable/g2" />
  <item android:maxLevel="3" android:drawable="@drawable/g3" />
  <item android:maxLevel="4" android:drawable="@drawable/g4" />
  <item android:maxLevel="5" android:drawable="@drawable/g5" />
  <item android:maxLevel="6" android:drawable="@drawable/g6" />
  <item android:maxLevel="7" android:drawable="@drawable/g7" />
  <item android:maxLevel="8" android:drawable="@drawable/g8" />
  <item android:maxLevel="9" android:drawable="@drawable/g9" />
 </level-list>

e l'ho assegnato ai ImageView. Il codice invece è questo:

Codice (Java): [Seleziona]
        ImageView gap; 
        ImageView gh1;
        ImageView gh2;
        ImageView gm1;
        ImageView gm2;
       
        Calendar curtime;
        Timer tclock;

        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                gap = (ImageView) findViewById(R.id.gap);
                gh1 = (ImageView) findViewById(R.id.gh1);
                gh2 = (ImageView) findViewById(R.id.gh2);
                gm1 = (ImageView) findViewById(R.id.gm1);
                gm2 = (ImageView) findViewById(R.id.gm2);

                curtime = Calendar.getInstance();
                tclock = new Timer() ;
                tclock.schedule(new tclockTask(), 0, 1000);
        }

        class tclockTask extends TimerTask  {
                public void run() {
                        gap.setImageLevel(curtime.get(Calendar.AM_PM));
                        int h = curtime.get(Calendar.HOUR);
                        int m = curtime.get(Calendar.MINUTE);
                        if (h<10) {
                                gh1.setImageLevel(0);
                                gh2.setImageLevel(h);
                        } else {
                                gh1.setImageLevel(1);
                                gh2.setImageLevel(h-10);
                        }      
                        if (m<10) {
                                gm1.setImageLevel(0);
                                gm2.setImageLevel(m);
                        } else {
                                gm1.setImageLevel(m/10);
                                gm2.setImageLevel(m-(m/10)*10);
                        }      
                        curtime.add(Calendar.SECOND, 1);
                }
         }
Ho tagliato le parti non inerenti e gli import. Quando il programma viene avviato riesce ad impostare correttamente tutte le immagini in base all'ora, ma quando passa un minuto, e quindi dovrebbe aggiornare l'ImageView, il programma crasha. Ho provato in tutti i modi, anche senza usare la LevelListDrawable ma il risultato è sempre lo stesso. Dopo la prima volta non riesce più a cambiare l'immagine e il programma termina. Premetto che non ho molte conoscenze delle SDK di Android ed in generale di Java, questi sono i miei primi passi. Quindi chiedo a voi se c'è una soluzione al mio problema.

Grazie in anticipo!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema ImageView e cambio immagine
« Risposta #1 il: 12 Aprile 2011, 16:11:58 CEST »
0
Quando un'applicazione crasha, nel LogCat trovi la moviola dell'incidente, insieme a tante altre segnalazioni di eventi più o meno critici. Dovresti individuare l'istante del crash e vedere cosa è stato scritto. Se vuoi una mano a comprenderlo, puoi postare qua l'estratto dell'errore.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline bttf92

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid A1
  • Sistema operativo:
    Windows 7 Pro\Linux Mint
Re:Problema ImageView e cambio immagine
« Risposta #2 il: 12 Aprile 2011, 17:02:14 CEST »
0
Eccolo qui:
Codice: [Seleziona]
I/ActivityManager(  354): Displayed activity com.android.digio.bttf/.Main: 628 ms (total 628 ms)
D/KeyguardViewMediator(  354): handleTimeout
W/dalvikvm(  982): threadid=8: thread exiting with uncaught exception (group=0x2aac87c8)
E/AndroidRuntime(  982): FATAL EXCEPTION: Timer-0
E/AndroidRuntime(  982): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
E/AndroidRuntime(  982):         at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
E/AndroidRuntime(  982):         at android.view.ViewRoot.invalidateChild(ViewRoot.java:607)
E/AndroidRuntime(  982):         at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633)
E/AndroidRuntime(  982):         at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505)
E/AndroidRuntime(  982):         at android.view.View.invalidate(View.java:5140)
E/AndroidRuntime(  982):         at android.widget.ImageView.invalidateDrawable(ImageView.java:174)
E/AndroidRuntime(  982):         at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:300)
E/AndroidRuntime(  982):         at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:227)
E/AndroidRuntime(  982):         at android.graphics.drawable.LevelListDrawable.onLevelChange(LevelListDrawable.java:79)
E/AndroidRuntime(  982):         at android.graphics.drawable.Drawable.setLevel(Drawable.java:445)
E/AndroidRuntime(  982):         at android.widget.ImageView.setImageLevel(ImageView.java:352)
E/AndroidRuntime(  982):         at com.android.digio.bttf.Main$tclockTask.run(Main.java:98)
E/AndroidRuntime(  982):         at java.util.Timer$TimerImpl.run(Timer.java:289)
W/ActivityManager(  354):   Force finishing activity com.android.digio.bttf/.Main
I/WindowManager(  354): Setting rotation to 0, animFlags=1
I/ActivityManager(  354): Config changed: { scale=1.0 imsi=222/10 loc=it_IT touch=3 keys=1/1/2 nav=1/1 orien=1 layout=34 uiMode=17 seq=327}
D/PhoneApp(  472): updateProximitySensorMode: state = IDLE
D/PhoneApp(  472): updateProximitySensorMode: lock already released.
W/ActivityManager(  354): Duplicate finish request for HistoryRecord{311d0770 com.android.digio.bttf/.Main}
I/ActivityManager(  354): Process com.android.digio.bttf (pid 982) has died.

Come errore da "Only the original thread that created a view hierarchy can touch its views." però la prima volta riesce ad impostare l'immagine senza problemi, perché alla volta successiva invece va in errore??

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema ImageView e cambio immagine
« Risposta #3 il: 12 Aprile 2011, 17:27:12 CEST »
0
Si, la ragione del crash è praticamente scritta dove hai detto:

Citazione
Only the original thread that created a view hierarchy can touch its views.

Prova a dare un'occhiata a questa implementazione (la seconda parte) della cosa che ti occorre implementare:
Updating the UI from a Timer | Android Developers
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store