2012-11-06 20 views
7

Ho il seguente problema. Sto drawning percorso sulla mapview in thread separato in questo modo:Perché getHandler() restituisce null?

public void drawRoute(final MapView mapView) { 
      new Thread(new Runnable() { 
      public void run() { 
      try { 
      //Do something useful 
      } catch (SomeException se) { 
      Handler handler = mapView.getHandler(); 
      handler.post(/*show error in UI thread*/) 
      }} 
     }).start(); 
     } 

Ma quando ho gestore restituisce NULL, anche se in modalità debug gestore restituito e viene visualizzato un messaggio di errore. Quale può essere il problema?

PS Potrebbe essere il modo non corretto per ottenere Handler, ma non sono riuscito a trovare informazioni a riguardo.

+0

Credo che non si possa disegnare nulla al di fuori del thread principale. Controlla questo: http://android-developers.blogspot.com.br/2009/05/painless-threading.html – Bilthon

+0

Sì, hai ragione, ma aggiungo gli overlay nel thread dell'interfaccia utente e poi chiamo postInvalidate su mapView, c'è solo calcoli in thread separati. – Bracadabra

+0

probabilmente hai bisogno di un 'run' da qualche parte intorno a – njzk2

risposta

21

Procedimento getHandler restituisce null perché la vista non è collegata:

public Handler getHandler() { 
    if (mAttachInfo != null) { 
     return mAttachInfo.mHandler; 
    } 
    return null; 
} 

mAttachInfo occupa dispatchAttachedToWindow e annullato in dispatchDetachedFromWindow.

Invece di mapView.getHandler().post() è possibile utilizzare direttamente mapView.post() (che sembra utilizzare getHandler().post() o ViewRootImpl.getRunQueue().post()).

+0

Grazie! Utilizzando post, questo diventa davvero semplice e utile. – yuku

Problemi correlati