2012-11-06 41 views
7

Tôi gặp vấn đề sau. Tôi drawning tuyến đường trên MapView trong chủ đề riêng biệt như thế này:Tại sao getHandler() trả về 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(); 
     } 

Nhưng khi tôi nhận được xử lý nó sẽ trả về null, mặc dù trong chế độ gỡ lỗi điều khiển trở lại và thông báo lỗi sẽ được hiển thị. các vấn đề có thể là gì?

PS Có thể đó là cách không chính xác để có được Trình xử lý, nhưng tôi không thể tìm thấy thông tin về nó.

+0

Tôi tin rằng bạn không thể vẽ bất kỳ thứ gì bên ngoài chuỗi chính. Kiểm tra điều này: http://android-developers.blogspot.com.br/2009/05/painless-threading.html – Bilthon

+0

Có, bạn nói đúng, nhưng tôi thêm lớp phủ trong chuỗi giao diện người dùng và sau đó gọi postInvalidate trên mapView, có chỉ tính toán trong chuỗi riêng biệt. – Bracadabra

+0

bạn có thể cần một 'chạy' ở đâu đó xung quanh – njzk2

Trả lời

21

Phương pháp getHandler trả null vì xem không kèm theo:

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

mAttachInfo được thiết lập trong dispatchAttachedToWindow và nulled trong dispatchDetachedFromWindow.

Thay vì mapView.getHandler().post() bạn có thể sử dụng trực tiếp mapView.post() (mà dường như sử dụng getHandler().post() hoặc ViewRootImpl.getRunQueue().post()).

+0

Cảm ơn! Sử dụng bài đăng, điều này trở nên thực sự đơn giản và hữu ích. – yuku

Các vấn đề liên quan