2012-11-06 23 views
7

Mam następujący problem. Ja rysunku warto wcześniej trasę na MapView w osobnym wątku tak:Dlaczego funkcja getHandler() zwraca wartość 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(); 
     } 

Ale kiedy się obsługi zwraca null, choć w trybie debugowania obsługi powrócił i jest wyświetlany komunikat o błędzie. Jaki może być problem?

PS Może to być niewłaściwy sposób na uzyskanie Handler, ale nie mogłem znaleźć informacji na jego temat.

+0

Uważam, że nie można narysować niczego poza głównym wątkiem. Sprawdź to: http://android-developers.blogspot.com.br/2009/05/painless-threading.html – Bilthon

+0

Tak, masz rację, ale dodam nakładki w wątku UI, a następnie zadzwoń do postInvalidate na mapView, jest tylko obliczenia w osobnym wątku. – Bracadabra

+0

prawdopodobnie potrzebujesz "uruchom" gdzieś w okolicy – njzk2

Odpowiedz

21

Sposób getHandler powraca null ponieważ widok nie jest przyłączony:

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

mAttachInfo jest w dispatchAttachedToWindow i zerowany w dispatchDetachedFromWindow.

Zamiast mapView.getHandler().post() można użyć bezpośrednio mapView.post() (co wydaje się używać getHandler().post() lub ViewRootImpl.getRunQueue().post()).

+0

Dzięki! Korzystanie z postów staje się bardzo proste i użyteczne. – yuku

Powiązane problemy