Autore Topic: Thread vari in handler..  (Letto 520 volte)

Offline crc_error

  • Utente junior
  • **
  • Post: 85
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Windows 8, Ubuntu 12
Thread vari in handler..
« il: 06 Giugno 2013, 09:40:28 CEST »
0
Ciao a tutti sto cercando di capire bene come funzionano thread, runnable, executor, handler, ecc..

Così ho creato il codice qua sotto. Testato il tutto (inviando messaggi all'handler) funziona tutto correttamente.
Infatti mettendo dei breakpoint e dei Log dentro ogni "case" dello "switch" ottengo i valori corretti per ogni valore inviato tramite i messaggi.

Ora mi chiedo, dal punto di vista di Java, delle best practices, ecc.. è corretto il codice? Oppure no?


Codice (Java): [Seleziona]
        HandlerThread t1 = new HandlerThread("Thread di update");
        private ServiceHandler updateHandler;
        private static ExecutorService elaboraTutto = Executors.newSingleThreadExecutor();
        private static Queue<Float> coda = new LinkedList<Float>();

        // .....................................

        @Override
        protected void onStart() {
                super.onStart();
                t1.start();
                updateHandler = new ServiceHandler(t1.getLooper());
        }

        private final static class MyHandler extends Handler {
               
                ServiceHandler(Looper loop) {
                        super(loop);
                }
                @Override
                public void handleMessage(Message msg) {

                        switch(msg.what) {
                                case MSG_UPDATE_POS:
                                        // EXECUTOR CON CALLABLE E FUTURE ===============================================
                                        CalcolaSeparatamente calcola = new CalcolaSeparatamente(msg.arg1);
                                        Future<Float> fuValore = elaboraTutto.submit(calcola);
                                        float valore = fuValore.get();
                                break;
                                case MSG_DUE:
                                        // RUNNABLE E THREAD ============================================================
                                        Runnable snd = new MioRunnnable(dato);
                                        Thread tSnd = new Thread(snd);
                                        tSnd.start();
                                break;
                                case MSG_TRE:
                                        // ASYNCTASK ====================================================================
                                        new MyAsyncTask().execute();
                                break;
                                case MSG_QUATTRO:
                                        // ASYNCTASK CON GET ============================================================
                                        try {
                                                float mioValore = new ChiudiTraccia().execute().get();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        } catch (ExecutionException e) {
                                                e.printStackTrace();
                                        }
                                break; 
                                default:
                                        super.handleMessage(msg);                              
                }
        }
       
        public static class CalcolaSeparatamente implements Callable<Float> {
               
                int val;
               
                public CalcolaVMedia(int media) {
                        this.val = media;
                }
               
                @Override
                public Float call() throws Exception {
                        if(coda.size() == 20)
                                coda.poll();
                        coda.offer(this.val);
                       
                        float spd = calcolaMediaValCoda(coda);
               
                        return spd;
                }
               
        }
       

Grazie mille in anticipo ;)