Autore Topic: Problema passando da landscape a portrait e viceversa con Message e Handler  (Letto 890 volte)

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Ciao a tutti.
Ho un problema quando effettuo la rotazione dell'emulatore, poichè mi si presenta il seguente errore :
Codice: [Seleziona]
WARN/dalvikvm(480): threadid=8: thread exiting with uncaught exception (group=0x4001d800) ERROR/AndroidRuntime(480): FATAL EXCEPTION: Thread-9
ERROR/AndroidRuntime(480): android.util.AndroidRuntimeException: { what=120 when=1175346 } This message is already in use.
ERROR/AndroidRuntime(480):     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171)
ERROR/AndroidRuntime(480):     at android.os.Handler.sendMessageAtTime(Handler.java:457)
ERROR/AndroidRuntime(480):     at android.os.Handler.sendMessageDelayed(Handler.java:430)
ERROR/AndroidRuntime(480):     at android.os.Handler.sendMessage(Handler.java:367)
ERROR/AndroidRuntime(480):     at it.giancarlo.tachimetro.Speed_Runner2.run(Speed_Runner2.java:37)
ERROR/AndroidRuntime(480):     at java.lang.Thread.run(Thread.java:1096)

il mio main.xml è il seguente :
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView android:layout_width="wrap_content"
                android:layout_height="wrap_content" android:text="@string/hello" />
        <TableRow android:id="@+id/tableRow1" android:layout_height="wrap_content"
                android:layout_width="wrap_content">
                <it.giancarlo.tachimetro.Tachimeter
                        android:layout_height="180dp" android:layout_width="180dp"
                        android:id="@+id/customView"></it.giancarlo.tachimetro.Tachimeter>
        </TableRow>
        <TableRow android:id="@+id/tableRow1" android:layout_height="180dp"
                android:layout_width="180dp">
                <it.giancarlo.tachimetro.Tachimeter
                        android:layout_height="wrap_content" android:layout_width="wrap_content"
                        android:id="@+id/customView2"></it.giancarlo.tachimetro.Tachimeter>
        </TableRow>
</LinearLayout>

mentre il manifest è :
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="it.giancarlo.testtachimetro"
     android:versionCode="1"
     android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".TestTachimetro"
                 android:label="@string/app_name"
                 android:screenOrientation="landscape"
                 android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="it.giancarlo.tachimetro.TachimActivity"/>
    </application>
</manifest>

Posto anche l'activity principale. Tachimeter è una classe che ho definito in un altro file e che disegna due immagini, una di sfondo ed una "freccia" che ruota in base al parametro velocità. La rotazione della freccia funziona perfettamente, ma il problema nasce quando effettuo la rotazione dell'emulatore che mi manda l'applicazione i crash.
Codice (Java): [Seleziona]
public class TestTachimetro extends Activity {
               
        Tachimeter tachimeter1=null;
        Tachimeter tachimeter2=null;
        Thread thread_tachimeter1=null;  
        Thread thread_tachimeter2=null;

        // ---------- metodo invocato quando l'activity viene creata ----------------
    @Override
    public void onCreate(Bundle savedInstanceState) {          
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tachimeter1 = (Tachimeter) findViewById(R.id.customView);
        tachimeter2 = (Tachimeter) findViewById(R.id.customView2);
       
    } // fine metodo onCreate
   
 // -------------------- onResume() -----------------------------------
    @Override
        protected void onResume() {
                super.onResume();
                thread_tachimeter1=new Thread(new Speed_Runner(handler1)); // Thread che invia il messaggio
                thread_tachimeter1.start();
                thread_tachimeter2=new Thread(new Speed_Runner2(handler2 )); // Thread che invia il messaggio */
                thread_tachimeter2.start();
        } // fine metodo onResume
   
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
           super.onConfigurationChanged(newConfig);
       
        //impostiamo layout e views
                                                               
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
       
         
    }
   
//----------  L'Handler che riceve i messaggi inviati dal thread refresh_thread ----
    Handler handler1=new Handler(){
       
        @Override
        public void handleMessage(Message msg){
                Log.d("handlemessage", "all'interno di handlemessage1" );
                        tachimeter1.setVelocità(msg.what);
                        tachimeter1.invalidate(); // serve per richiamare il metodo ondraw che ridisegna la View

                super.handleMessage(msg);

        } // fine metodo handleMessage
       
    }; // fine Handler
   
   
    // ------------------- secondo Handler -------------------------------------
   
 // ---------------  L'Handler che riceve i messaggi inviati dal thread refresh_thread2 -----------------------------
   
    Handler handler2=new Handler(){
       
        @Override
        public void handleMessage(Message msg){
               
                Log.d("handlemessage", "all'interno di handlemessage2" );
                tachimeter2.setVelocità(msg.what);
               
                tachimeter2.invalidate(); // serve per richiamare il metodo ondraw che ridisegna la View
                super.handleMessage(msg);

        } // fine metodo handleMessage
       
    }; // fine Handler
       
} // fine classe

Qualcuno mi può gentilmente dare qualche suggerimento ????
Grazie.

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 passando da landscape a portrait e viceversa con Message e Handler
« Risposta #1 il: 30 Maggio 2011, 22:54:03 CEST »
0
Manca il codice del thread, ma a parte quello la prima cosa che mi viene in mente è che in seguito alla rotazione ricrei i thread, ma non fai terminare i precedenti.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:Problema passando da landscape a portrait e viceversa con Message e Handler
« Risposta #2 il: 30 Maggio 2011, 23:10:10 CEST »
0
Ecco il codice del Thread :
Codice (Java): [Seleziona]
ublic class Speed_Runner implements Runnable {
       
        Message message;
        Handler handler;
       
        public Speed_Runner ( Handler hand) {
                handler=hand;
               
        } // fine costruttore
       
        @Override
        public void run() {  // Message rappresenta un valore intero che invio come velocità
               
                message = Message.obtain();
                message.what= 0;
                handler.sendMessage(message);
                SystemClock.sleep(2000);

                message.what= 20;
                handler.sendMessage(message);
                SystemClock.sleep(2000);
               
                message.what= 40;
                handler.sendMessage(message);
                SystemClock.sleep(2000);
               
                message.what= 60;
                handler.sendMessage(message);
                SystemClock.sleep(2000);
               
                message.what= 80;
                handler.sendMessage(message);
                SystemClock.sleep(2000);
               
                message.what= 100;
                handler.sendMessage(message);
                SystemClock.sleep(2000);
               
                message.what= 120;
                handler.sendMessage(message);
                SystemClock.sleep(2000);
                                       
        } //  fine metodo run()

}

Quindi nel metodo onConfigurationChanged(Configuration newConfig) dovrei stoppare i thread ???? Che metodo posso utilizzare per arrestare i thread ????
Grazie.

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:Problema passando da landscape a portrait e viceversa con Message e Handler
« Risposta #3 il: 30 Maggio 2011, 23:30:02 CEST »
0
in realtà l'errore è il seguente :
Codice: [Seleziona]
05-30 23:24:51.474: DEBUG/OnDraw(364): la larghezza del canvas è : 480
05-30 23:24:52.154: INFO/ActivityManager(58): Config changed: { scale=1.0 imsi=310/260 loc=en_US touch=3 keys=2/1/2 nav=3/1 orien=2 layout=18 uiMode=17 seq=8}
05-30 23:24:52.154: DEBUG/Demo(364): onConfigurationChange
05-30 23:24:52.254: DEBUG/onMeasure(364): E' stato invocato il metodo onMeasure
05-30 23:24:52.254: DEBUG/onMeasure(364): E' stato invocato il metodo onMeasure
05-30 23:24:53.364: DEBUG/setvelocità(364): la velocità è : 60
05-30 23:24:53.374: DEBUG/OnDraw(364): E' stata invocata la funzione onDraw
05-30 23:24:53.374: DEBUG/OnDraw(364): L'altezza del canvas è 320
05-30 23:24:53.374: DEBUG/OnDraw(364): la larghezza del canvas è : 480
05-30 23:24:53.384: WARN/dalvikvm(364): threadid=8: thread exiting with uncaught exception (group=0x4001d800)
05-30 23:24:53.394: ERROR/AndroidRuntime(364): FATAL EXCEPTION: Thread-9
05-30 23:24:53.394: ERROR/AndroidRuntime(364): android.util.AndroidRuntimeException: { what=120 when=740337 } This message is already in use.
05-30 23:24:53.394: ERROR/AndroidRuntime(364):     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171)
05-30 23:24:53.394: ERROR/AndroidRuntime(364):     at android.os.Handler.sendMessageAtTime(Handler.java:457)
05-30 23:24:53.394: ERROR/AndroidRuntime(364):     at android.os.Handler.sendMessageDelayed(Handler.java:430)
05-30 23:24:53.394: ERROR/AndroidRuntime(364):     at android.os.Handler.sendMessage(Handler.java:367)
05-30 23:24:53.394: ERROR/AndroidRuntime(364):     at it.giancarlo.tachimetro.Speed_Runner2.run(Speed_Runner2.java:37)
05-30 23:24:53.394: ERROR/AndroidRuntime(364):     at java.lang.Thread.run(Thread.java:1096)
05-30 23:24:53.404: WARN/ActivityManager(58):   Force finishing activity it.giancarlo.testtachimetro/.TestTachimetro
05-30 23:24:53.444: DEBUG/OnDraw(364): E' stata invocata la funzione onDraw
05-30 23:24:53.454: DEBUG/OnDraw(364): L'altezza del canvas è 320
05-30 23:24:53.464: DEBUG/OnDraw(364): la larghezza del canvas è : 480
05-30 23:24:53.515: INFO/WindowManager(58): Setting rotation to 0, animFlags=1
05-30 23:24:53.536: INFO/ActivityManager(58): Config changed: { scale=1.0 imsi=310/260 loc=en_US touch=3 keys=2/1/2 nav=3/1 orien=1 layout=18 uiMode=17 seq=9}
05-30 23:24:53.565: ERROR/JavaBinder(364): *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
05-30 23:24:53.565: ERROR/JavaBinder(364): android.util.AndroidRuntimeException: { what=50 when=740387 arg1=1 obj= } This message is already in use.
05-30 23:24:53.565: ERROR/JavaBinder(364):     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171)
05-30 23:24:53.565: ERROR/JavaBinder(364):     at android.os.Handler.sendMessageAtTime(Handler.java:457)
05-30 23:24:53.565: ERROR/JavaBinder(364):     at android.os.Handler.sendMessageDelayed(Handler.java:430)
05-30 23:24:53.565: ERROR/JavaBinder(364):     at android.os.Handler.sendMessage(Handler.java:367)
05-30 23:24:53.565: ERROR/JavaBinder(364):     at com.android.internal.view.IInputConnectionWrapper.dispatchMessage(IInputConnectionWrapper.java:172)
05-30 23:24:53.565: ERROR/JavaBinder(364):     at com.android.internal.view.IInputConnectionWrapper.commitText(IInputConnectionWrapper.java:106)
05-30 23:24:53.565: ERROR/JavaBinder(364):     at com.android.internal.view.IInputContext$Stub.onTransact(IInputContext.java:152)
05-30 23:24:53.565: ERROR/JavaBinder(364):     at android.os.Binder.execTransact(Binder.java:288)
05-30 23:24:53.565: ERROR/JavaBinder(364):     at dalvik.system.NativeStart.run(Native Method)
05-30 23:24:55.165: INFO/Process(364): Sending signal. PID: 364 SIG: 9
05-30 23:24:55.444: INFO/ActivityManager(58): Process it.giancarlo.testtachimetro (pid 364) has died.
05-30 23:24:55.655: WARN/InputManagerService(58): Got RemoteException sending setActive(false) notification to pid 364 uid 10040

quindi viene dopo la rotazione viene chiamata la funzione onConfigurationChange, poi viene  invocato il metodo invocato il metodo onMeasure, poi viene settata la nuova velocità,  viene invocata la funzione onDraw e poi va in crash!!!
Naturalmente se non ruoto lo schermo durante l'esecuzione, l'applicazione funziona senza alcun tipo di problema sia in modalità landscape che in modalità portrait.

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 passando da landscape a portrait e viceversa con Message e Handler
« Risposta #4 il: 30 Maggio 2011, 23:50:25 CEST »
0
Dunque, prima di tutto una premessa: ogni volta che ruoti lo schermo la tua activity viene letteralmente distrutta e ricreata da zero, normalmente non ci sono problemi, ma se si erano avviate delle attività (esempio dei thread), si possono creare problemi perchè i thread non vengono distrutti contestualmente alla activity, tocca a te distruggerli.

L'errore dovrebbe essere dovuto a questo:
- crei l'activity la prima volta
- viene avviato il thread
- il thread ottiene un messaggio da inviare all'handler, che userà varie volte nel corso dei 20 secondi successivi
- ad un certo punto ruoti lo schermo
- riparte l'activity
- viene avviato un altro thread
- il nuovo thread ottiene il messaggio
- il vecchi thread riutilizza il vecchio messaggio e si crea un conflitto

Ci sarebbero vari modi di sistemare le cose, ma dipende da cosa vuoi ottenere.

Intanto una cosa da evitare è mettere sleep(2000) nel run() del thread. E' il modo sbagliato di fare qualsiasi cosa. Se ti serve un messagio ogni 2 secondi, usa un postmessagedelayed direttamente sull'handler, senza bisogno del thread. Se proprio devi usare dei thread, potresti conservare il riferimento e passarlo alla nuova activity, senza bisogno di ricrearlo.

Ripeto, dipende da cosa vuoi fare.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:Problema passando da landscape a portrait e viceversa con Message e Handler
« Risposta #5 il: 31 Maggio 2011, 00:26:17 CEST »
0
Innanzitutto ti ringrazio per il tuo aiuto :-)
Non trovo il metodo postmessagedelayed, ma c'è postDelayed(Runnable r, delayMillis), ma richiede un runnable, cioè un thread.

Io preferirei utilizzare i thread, ma se c'è una soluzione migliore va bene uguale.
Io vorrei solo che l'applicazione continuasse la propria esecuzione anche successivamente alla rotazione dello schermo.
 

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:Problema passando da landscape a portrait e viceversa con Message e Handler
« Risposta #6 il: 09 Giugno 2011, 13:07:13 CEST »
0
nessuno riesce ad aiutarmi ????
Grazie.

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Problema passando da landscape a portrait e viceversa con Message e Handler
« Risposta #7 il: 10 Giugno 2011, 10:56:06 CEST »
0
Domanda: ma se nel manifest dichiari "Landscape" come screenOrientation, che motivo hai di gestire la rotazione ?
Il problema sull'Handler potrebbe dipendere dai tempi usati per l'accodamento dei messagi.
Di fatti l'errore che ottieni deriva dal MessageQueue, sul metodo enqueueMessage(Message,long):

Codice (Java): [Seleziona]
    final boolean enqueueMessage(Message msg, long when) {
        if (msg.when != 0) {
            throw new AndroidRuntimeException(msg
                    + " This message is already in use.");
        }
        ....

In altre parole stai accodando un messagio che già è stato usato o che stai usando mentre lo accodi  o_O
(android.util.AndroidRuntimeException: { what=50 when=740387 arg1=1 obj= } This message is already in use. [il valore when deve essere uguale a 0 ])

Puoi provare a fare un controllo sul messaggio, per vedere se è già in lista con il metodo hasMessages(int what) della classe Handler, e ottimizzare i tuoi Thread in modo da non creare mille istanze senza controllo :-P

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:Problema passando da landscape a portrait e viceversa con Message e Handler
« Risposta #8 il: 12 Giugno 2011, 17:54:15 CEST »
0
Ciao.
Grazie mille per  consigli, ma non sono ancora riuscito a risolvere.....
Ho effettuato qualche modifica, ho realizzato un'unica classe che invia i messaggi per entrambi gli handler
Codice (Java): [Seleziona]
public class Controller implements Runnable {
       
        Message message1, message2;
        Handler handler1;
        Handler handler2;
        int sleep_time=1000;
        //private SynchronizedBuffer syncbuffer;
       
        public Controller ( Handler hand1, Handler hand2) {
                handler1=hand1;
                handler2=hand2;
               
        } // fine costruttore
       
        @Override
        public void run() {
                Log.d("Speed_Runner - run", "All'interno di Speed Runner");
                while(!Thread.currentThread().isInterrupted()) {
               
                message1 = Message.obtain();                           
                message2 = Message.obtain();
               
                message1.what= 0;
                if( !handler1.hasMessages(message1.what)){
                        handler1.sendMessage(message1); }
                SystemClock.sleep(sleep_time);
               
                message2.what= 0;
                if( !handler2.hasMessages(message2.what)){
                        handler2.sendMessage(message2); }
                SystemClock.sleep(sleep_time);
               
                message1.what= 10;
                if( !handler1.hasMessages(message1.what)){
                        handler1.sendMessage(message1); }
                SystemClock.sleep(sleep_time);
               
                message2.what= 10;
                if( !handler2.hasMessages(message2.what)){
                        handler2.sendMessage(message2); }
                SystemClock.sleep(sleep_time);
               
                message1.what= 20;
                if( !handler1.hasMessages(message1.what)){
                        handler1.sendMessage(message1); }
                SystemClock.sleep(sleep_time);
               
                message2.what= 20;
                if( !handler2.hasMessages(message2.what)){
                        handler2.sendMessage(message2); }
                SystemClock.sleep(sleep_time);
               
                message1.what= 30;
                if( !handler1.hasMessages(message1.what)){
                        handler1.sendMessage(message1); }
                SystemClock.sleep(sleep_time);
               
                message2.what= 30;
                if( !handler2.hasMessages(message2.what)){
                        handler2.sendMessage(message2); }
                SystemClock.sleep(sleep_time);
               
                       
                } // fine while
                } //  fine metodo run()

}

ed ho modificato anche la classe principale che estende activity :

Codice (Java): [Seleziona]
public class TestTachimetro extends Activity {

        protected static final int default_velocita= 0;
        protected boolean running=true;
                               
        Tachimeter tachimeter1=null;
        Tachimeter tachimeter2= null;
        ToggleButton togglebutton= null;
        ToggleButton togglebuttonfari= null;
        Thread thread_tachimeter1=null;  
        Thread thread_tachimeter2=null;
        Thread thread_button=null;

        // ---------- metodo invocato quando l'activity viene creata ----------------
    @Override
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);
        Log.d("TestTachimeter","onCreate");
       
        setContentView(R.layout.main);
        tachimeter1 = (Tachimeter) findViewById(R.id.customView);
        tachimeter1.setimg(R.drawable.speedometer);
        tachimeter1.configure(255, 220, 260);
       
        tachimeter2 = (Tachimeter) findViewById(R.id.customView2);
        tachimeter2.setimg(R.drawable.contagiri);
        tachimeter2.configure(270, 222, 60);
       
        togglebutton = (ToggleButton) findViewById(R.id.togglebutton); // aggiunto
        togglebuttonfari = (ToggleButton) findViewById(R.id.togglebuttonfari); // aggiunto
               
    } // fine metodo onCreate
   
 // -------------------- onResume() -----------------------------------
    @Override
        protected void onResume() {
                super.onResume();
                Log.d("onResume", "Sono in onResume"); 
               
                thread_tachimeter1=new Thread(new Controller(handler1,handler2)); // Thread che invia il messaggio
               
                /* // aggiunto */
               
                togglebutton.setOnClickListener(new OnClickListener() {
                    public void onClick(View vass) {
                        Log.d("onClick", "Sono in onClick");
                        // Perform action on clicks
                        if (togglebutton.isChecked()) {
                            Log.d("onClick", "pulsante premuto");
                                thread_tachimeter1.start();
                                Log.d("onClick", "dopo pulsante premuto");
                        } else if (!togglebutton.isChecked()) {
                                Log.d("onClick", "pulsante OFF premuto");
                                handler1.removeCallbacksAndMessages(thread_tachimeter1);
                                handler2.removeCallbacksAndMessages(thread_tachimeter1);
                                thread_tachimeter1.interrupt();
                        }
                    }
                });                    
               
                togglebuttonfari.setOnClickListener(new OnClickListener() {
                    public void onClick(View vass) {
                        Log.d("onClick", "Sono in onClick");
                        // Perform action on clicks
                        if (togglebuttonfari.isChecked()) {
                           
                                Log.d("onClick", "togglebuttonfari pulsante premuto");
                        } else if (!togglebuttonfari.isChecked()) {
                           
                                Log.d("onClick", "togglebuttonfari pulsante OFF premuto");
                        }
                    }
                });                    
               
                 // fino a qui !!!
               
//              thread_tachimeter1=new Thread(new Controller(handler1,handler2));
//              thread_tachimeter1.start();
//              Log.d("thread1", "Dopo la chiamata thread1");

 /*  -- questi 3 dopo erano già disattivati perchè ora utilizzo un unico controller per tutti i widget --*/
                //thread_tachimeter2.start();
                //Log.d("thread2", "Dopo la chiamata thread2");
                //Log.d("News", "Posso inserire qui altre istruzioni");
               
        } // fine metodo onResume
   
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        Log.d("Demo", "onConfigurationChange");
        super.onConfigurationChanged(newConfig);
       
        //---------------------  impostiamo layout e views ---------------------------------
        //setContentView(R.layout.main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                 
    }
   
//----------  L'Handler che riceve i messaggi inviati dal thread thread_tachimeter1 ----
    Handler handler1=new Handler(){
       
        @Override
        public void handleMessage(Message msg){
                Log.d("handlemessage", "all'interno di handlemessage1" );
                        tachimeter1.setVelocità(msg.what);
                        tachimeter1.invalidate(); // serve per richiamare il metodo ondraw che ridisegna la View;
                super.handleMessage(msg);

        } // fine metodo handleMessage
       

       
    }; // fine Handler
   
   
    // ------------------- secondo Handler -------------------------------------
   
 // ---------------  L'Handler che riceve i messaggi inviati dal thread thread_tachimeter2 -----------------------------
   
    Handler handler2=new Handler(){
       
        @Override
        public void handleMessage(Message msg){
               
                Log.d("handlemessage", "all'interno di handlemessage2" );
                        tachimeter2.setVelocità(msg.what);
                        tachimeter2.invalidate(); // serve per richiamare il metodo ondraw che ridisegna la View
                super.handleMessage(msg);

        } // fine metodo handleMessage
       
       
    }; // fine Handler
       
} // fine classe

Come puoi notare ho inserito due togglebutton.... ma mi sto concentrando sul funzionamento del primo.
Quando clicco ul primo togglebutton, inizia l'invio dei messagi e la rotazione dell'immagine, ma quando riclicco mi da sempre lo stesso errore, nonostante io chiamo esplicitamente

Codice (Java): [Seleziona]
Log.d("onClick", "pulsante OFF premuto");
                                handler1.removeCallbacksAndMessages(thread_tachimeter1);
                                handler2.removeCallbacksAndMessages(thread_tachimeter1);
                                thread_tachimeter1.interrupt();
L'errore è il seguente e come puoi notare non viene visualizzato il Log.d("onClick", "pulsante OFF premuto");, quindi non entra proprio nel ciclo :

Codice: [Seleziona]
06-12 17:51:47.952: DEBUG/setvelocità(659): la velocità è : 20
06-12 17:51:47.952: DEBUG/OnDraw(659): E' stata invocata la funzione onDraw
06-12 17:51:47.952: DEBUG/getimg(659): get nuova immagine
06-12 17:51:47.973: DEBUG/OnDraw(659): L'altezza del canvas è 480
06-12 17:51:47.973: DEBUG/OnDraw(659): la larghezza del canvas è : 320
06-12 17:51:48.033: DEBUG/(659): double 255/260 vale0.9807692307692307
06-12 17:51:48.033: DEBUG/(659): int speed vale239
06-12 17:51:48.062: DEBUG/OnDraw(659): E' stata invocata la funzione onDraw
06-12 17:51:48.062: DEBUG/getimg(659): get nuova immagine
06-12 17:51:48.082: DEBUG/OnDraw(659): L'altezza del canvas è 480
06-12 17:51:48.082: DEBUG/OnDraw(659): la larghezza del canvas è : 320
06-12 17:51:48.082: DEBUG/(659): double 255/260 vale4.5
06-12 17:51:48.093: DEBUG/(659): int speed vale267
06-12 17:51:48.562: DEBUG/AndroidRuntime(659): Shutting down VM
06-12 17:51:48.562: WARN/dalvikvm(659): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
06-12 17:51:48.612: ERROR/AndroidRuntime(659): FATAL EXCEPTION: main
06-12 17:51:48.612: ERROR/AndroidRuntime(659): android.util.AndroidRuntimeException: { what=1000 when=1884050 } This message is already in use.
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.os.Handler.sendMessageAtTime(Handler.java:457)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.os.Handler.sendMessageDelayed(Handler.java:430)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.os.Handler.sendEmptyMessageDelayed(Handler.java:394)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.os.Handler.sendEmptyMessage(Handler.java:379)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.ViewRoot.scheduleTraversals(ViewRoot.java:652)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.ViewRoot.invalidateChild(ViewRoot.java:624)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.View.invalidate(View.java:5115)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.widget.TextView.invalidateDrawable(TextView.java:3796)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.graphics.drawable.LayerDrawable.invalidateDrawable(LayerDrawable.java:297)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:300)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:227)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:97)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.graphics.drawable.Drawable.setState(Drawable.java:400)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.graphics.drawable.LayerDrawable.onStateChange(LayerDrawable.java:408)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.graphics.drawable.Drawable.setState(Drawable.java:400)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.View.drawableStateChanged(View.java:7234)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.widget.TextView.drawableStateChanged(TextView.java:2271)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.widget.CompoundButton.drawableStateChanged(CompoundButton.java:265)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.widget.ToggleButton.drawableStateChanged(ToggleButton.java:140)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.View.refreshDrawableState(View.java:7248)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.View.onTouchEvent(View.java:4332)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.widget.TextView.onTouchEvent(TextView.java:6557)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.View.dispatchTouchEvent(View.java:3766)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.os.Looper.loop(Looper.java:123)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at java.lang.reflect.Method.invokeNative(Native Method)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at java.lang.reflect.Method.invoke(Method.java:521)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-12 17:51:48.612: ERROR/AndroidRuntime(659):     at dalvik.system.NativeStart.main(Native Method)
06-12 17:51:48.632: WARN/ActivityManager(58):   Force finishing activity it.giancarlo.testtachimetro/.TestTachimetro
06-12 17:51:48.953: WARN/dalvikvm(659): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
06-12 17:51:48.953: INFO/Process(659): Sending signal. PID: 659 SIG: 9
06-12 17:51:48.973: INFO/ActivityManager(58): Process it.giancarlo.testtachimetro (pid 659) has died.
06-12 17:51:48.993: INFO/WindowManager(58): WIN DEATH: Window{4509f938 it.giancarlo.testtachimetro/it.giancarlo.testtachimetro.TestTachimetro paused=true}
06-12 17:51:49.092: WARN/InputManagerService(58): Got RemoteException sending setActive(false) notification to pid 659 uid 10040

Da cosa può essere dovuto quest'errore ????
Grazie

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:Problema passando da landscape a portrait e viceversa con Message e Handler
« Risposta #9 il: 13 Giugno 2011, 14:59:13 CEST »
0
up