2013-06-17 3 views
7

Ho un servizio che riceve un comando da Internet e avvia un thread in background. Questo thread è passato un gestore dal servizio (il servizio è limitato e passato il gestore) e invia un messaggio al gestore per scattare una foto. Sono bloccato sull'implementazione del gestore.Android: come utilizzare un handle handleMessage e accesso al riferimento all'agente principale

static Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      //TODO: Handle different types of messages 
      mCamera.takePicture(null, null, MainActivity.this); 
     } 
}; 

Domande:

  • fa Handler ha bisogno di essere statica? Senza statico, ricevo "La classe di questo gestore dovrebbe essere statica o potrebbero verificarsi perdite"
  • La telecamera deve essere statica? Mi è stato detto di rendere mCamera statica, ma perché è necessario? C'è un modo per impostare takePicture senza rendere statica mCamera?
  • Qual è il modo corretto per passare il riferimento a MainActivity? In questo momento ho l'errore: "Nessuna istanza allegando del tipo MainActivity è accessibile in ambito"
+0

Dai un'occhiata qui: http://stackoverflow.com/a/16071874/2359488 –

risposta

9

si può fare una classe (Attività/Service) implementare Handler.Callback e creare un nuovo gestore per il tramite new Handler(this).

+0

Questo ha fatto il trucco in quanto semplifica molto il sovraccarico (non devo passare l'oggetto, ecc.) Rispetto al altri metodi descritti in questo post. – Rich

0

È possibile utilizzare obj membro Message e passare l'oggetto desiderato al gestore.

static Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      //TODO: Handle different types of messages 
      //TODO: handle cast exception 
      final MainActivity activity = (MainActivity) msg.obj; 
      final Camera camera = activity.getCamera(); 
      camera.takePicture(null, null, activity); 
     } 
}; 
2

È possibile modificare il codice come segue:

static Handler handler = new Handler() { 

      MainActivity mActivity; 

      @Override 
      public void handleMessage(Message msg) { 
       //TODO: Handle different types of messages 
       if(mActivity != null) { 
        mActivity.mCamera.takePicture(null, null, mActivity); 
       } 
      } 
    }; 

    void MainActivity::onCreate(Bundle savedState) { 
     ... 
     handler.mActivity = this; 
    } 

    void MainActivity::onDestroy() { 
     ... 
     handler.mActivity = null; 
    }  
Problemi correlati