Autore Topic: Problema Handlers e Thread con ToggleButton  (Letto 750 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
Problema Handlers e Thread con ToggleButton
« il: 15 Giugno 2011, 16:06:02 CEST »
0
Ciao a tutti.
ho il seguente problema : Ho realizzato un'activity composta da due togglebutton e due oggetti di una classe che estende view.
Quando clicco sul primo toogglebutton, viene avviato un Thread che tramite scambio di messagi con il main-thread avvia l'animazione della prima estensione di view e funziona senza problemi.
I problemi si hanno quando durante l'animazione clicco sul primo o sul secondo togglebutton.
Infatti da logcat ricevo il seguente errore :
Codice: [Seleziona]
06-15 15:49:11.067: DEBUG/onClick(271): Sono in onClick
06-15 15:49:11.067: DEBUG/onClick(271): pulsante OFF premuto
06-15 15:49:11.457: WARN/dalvikvm(271): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
06-15 15:49:11.467: ERROR/AndroidRuntime(271): FATAL EXCEPTION: Thread-8
06-15 15:49:11.467: ERROR/AndroidRuntime(271): android.util.AndroidRuntimeException: { what=6 when=56421 } This message is already in use.
06-15 15:49:11.467: ERROR/AndroidRuntime(271):     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:171)
06-15 15:49:11.467: ERROR/AndroidRuntime(271):     at android.os.Handler.sendMessageAtTime(Handler.java:457)
06-15 15:49:11.467: ERROR/AndroidRuntime(271):     at android.os.Handler.sendMessageDelayed(Handler.java:430)
06-15 15:49:11.467: ERROR/AndroidRuntime(271):     at android.os.Handler.sendMessage(Handler.java:367)
06-15 15:49:11.467: ERROR/AndroidRuntime(271):     at it.giancarlo.tachimetro.Controller.run(Controller.java:43)
06-15 15:49:11.467: ERROR/AndroidRuntime(271):     at java.lang.Thread.run(Thread.java:1096)
06-15 15:49:11.557: WARN/ActivityManager(59):   Force finishing activity it.giancarlo.testtachimetro/.TestTachimetro
06-15 15:49:12.067: INFO/ARMAssembler(59): generated scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x2c2c38:0x2c2cf4] in 3484920 ns
06-15 15:49:12.077: WARN/ActivityManager(59): Activity pause timeout for HistoryRecord{44f59220 it.giancarlo.testtachimetro/.TestTachimetro}
06-15 15:49:22.908: WARN/ActivityManager(59): Activity destroy timeout for HistoryRecord{44f59220 it.giancarlo.testtachimetro/.TestTachimetro}

Posto anche il codice, :
Codice (Java): [Seleziona]
public class TestTachimetro extends Activity {
                               
        Tachimeter tachimeter1=null;
        Tachimeter tachimeter2= null;
        ToggleButton togglebutton= null;
        ToggleButton togglebuttonfari= null;
        Thread thread_tachimeter1=null;  
        Thread thread_tachimeter2=null;
        Thread thread_button=null;
        Message message1, message2;
        int sleep_time=1000;
        // ---------- 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"); 
               
                togglebutton.setOnClickListener(new OnClickListener() {
                    public void onClick(View vass) {
                        Log.d("onClick", "Sono in onClick");
                                if (togglebutton.isChecked()) {
                                        Log.d("onClick", "pulsante premuto");
                                        thread_tachimeter1=new Thread(new Controller(handler1,handler2));
                                        thread_tachimeter1.start();

                                        }// fine if

                                else {
                               
                                        Log.d("onClick", "pulsante OFF premuto");                              

                                        thread_tachimeter1.interrupt();
                                        handler1.removeCallbacksAndMessages(handler1);
                                        } // fine else
                                       
                    }// fine onclick  
                });// fine onclicklistner
   
                   
                    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");
                                } // fine else if
                            }// fine onclick
                    }); // fine OnClickListener        
    } // fine onResume
 
   
//----------  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);
                this.removeCallbacksAndMessages(handler1);

        } // fine metodo handleMessage
       

       
    }; // fine Handler
   
       
} // fine classe

Codice (Java): [Seleziona]
public class Controller implements Runnable {
       
        Message message1;
        Message message2;
        Handler handler1;
        Handler handler2;
        int sleep_time=1000;
        int x=0;
       
        public Controller ( Handler hand1, Handler hand2) {
                handler1=hand1;
                handler2=hand2;
               
        } // fine costruttore
       
        @Override
        public void run() {
                Log.d("Controller - run", "All'interno di run");
               
                message1 = Message.obtain();                           
               
                message1.what= 0;
               
                do{
                       
                        SystemClock.sleep(sleep_time);
                        message1.what=x + 3;
                        x=message1.what;
                        handler1.sendMessage(message1);
                       
                 } while (!Thread.currentThread().isInterrupted());
} //  fine metodo run()

}

Qualcuno mi può aiutare ?????
Grazie,