【问题标题】:Thread cannot modify layout [duplicate]线程无法修改布局[重复]
【发布时间】:2015-12-07 20:40:29
【问题描述】:

onCreate() 方法中,我有以下代码:

protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mapview);

    setupGui();
    mHandler = new Handler();

    mv = new MapView();
    (new Thread(){
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                    mHandler.post(new Runnable() {

                        @Override
                        public void run() {

                          mv.createPlane(true);
                        }
                    });
                } catch (Exception e) {
                }
            }
        }
    }).start();
}

其中 mv 是我所在的类的名称,其中包含一个 createPlane(boolean) 方法,用于将一些新元素放置到 UI 上。这个方法:

public void createPlane(boolean left) {
    linL = (LinearLayout) findViewById(R.id.ll);
}

这不起作用。 (NullPointerExceptionfindViewById()

【问题讨论】:

  • 发布createPlane方法,我们可以帮助你
  • @vspallas 在检查了问题的确切位置之后,这一行是有问题的行,所以我认为没有理由发布其他数百行。在此之后它立即停止工作。
  • @L.Bajczi 请发布有效的代码版本。最短的例子。否则,除了我发布的内容外,我无能为力。
  • 要么是布局膨胀的问题(在膨胀的布局中找不到视图),要么是您从 UI 线程以外的线程修改 UI,这是被禁止的。在第二种情况下,对修改 UI 以修复问题的行使用 runOnUIThread 方法
  • 你想对 linL 做什么?添加一个孩子或其他需要 UiThread 的东西?

标签: android multithreading user-interface nullpointerexception findviewbyid


【解决方案1】:

很可能,问题出在您的事情顺序上。在尝试按 ID 在该视图中查找视图之前,您必须先扩充视图。在你膨胀任何东西之前,你正在尝试findViewById!你所拥有的只是MapView 对象。

您需要确保在运行线程之前,包含R.id.ll 的视图是膨胀的。

【讨论】:

  • 就在setContentView(R.layout.mapview);之后其中确实包含此元素。
  • @L.Bajczi 在我继续提供帮助之前,请添加更多代码 - 一个完整、简短的工作代码集。否则,这将是一场猫捉老鼠的游戏,我猜你确认或否认,这是行不通的。
  • 我已经编辑了这个问题,我希望这样可以理解。对不起。
  • @L.Bajczi 是的 - 您正在调用 mv.makePlane() - mv 是 MapView 的特定实例。我不认为它已经膨胀了。问题也可能是弗拉基米尔对您的问题的评论。也探索这条路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 2016-04-27
  • 2012-12-12
  • 2016-12-11
  • 2010-10-21
  • 2018-12-13
相关资源
最近更新 更多