为什么getHandler()返回null?

12

我有一个问题。我正在像这样在地图视图上的一个独立线程中绘制路线:

 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();
      }

但是当我获取处理程序时,它返回null,尽管在调试模式下处理程序已经返回并显示错误信息。问题可能是什么?

PS也许这不是获取Handler的正确方式,但我找不到相关信息。


我相信你不能在主线程之外绘制任何东西。看看这个链接:http://android-developers.blogspot.com.br/2009/05/painless-threading.html - Bilthon
是的,你说得对。但我在 UI 线程中添加了叠加层,然后调用了 mapView 的 postInvalidate 方法,在单独的线程中只执行计算。 - Bracadabra
你可能需要在某个地方加上一个run - njzk2
以及一个最终的MapView - njzk2
谢谢,但这只是伪代码来描述问题。我的代码是有效的,实际问题是为什么getHandler返回null。 - Bracadabra
2
很有可能是mapView在窗口中没有被附加,因此您的线程正在完成之前。 - nandeesh
1个回答

31

getHandler 方法返回 null,因为视图未附加:

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

mAttachInfodispatchAttachedToWindow 中设置,在 dispatchDetachedFromWindow 中置空。

可以直接使用 mapView.post(),而不是 mapView.getHandler().post()(似乎后者使用了 getHandler().post()ViewRootImpl.getRunQueue().post())。


谢谢!使用post,这变得非常简单和有用。 - Randy Sugianto 'Yuku'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接