使用线程时android中的null对象引用错误

时间:2017-01-26 09:24:02

标签: java android multithreading

我正在尝试动态更改按钮颜色,所以我创建了一个线程来执行此操作,但后续错误即将到来

  

W / System.err:java.lang.NullPointerException:尝试调用   虚方法'void android.widget.Button.setBackgroundColor(int)'on   空对象引用

以下是我的代码

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.hellotape.hdl.test_bomber.MainActivity">

    <Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginStart="51dp"
        android:layout_marginTop="127dp"
        android:id="@+id/button"
        android:visibility="visible" />

    <Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="52dp"
        android:id="@+id/button2" />

    <Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button"
        android:layout_alignEnd="@+id/button"
        android:layout_marginTop="113dp"
        android:id="@+id/button3" />

    <Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button3"
        android:layout_alignEnd="@+id/button2"
        android:id="@+id/button4"
        android:elevation="5dp" />

</RelativeLayout>

}

{{1}}

调试时,我一进入线程t1就得到了,按钮变量b1,b2,b3,b4变为空,这个错误的原因是什么以及如何解决?

2 个答案:

答案 0 :(得分:0)

您有2个MainActivity对象。首先,您的应用将启动onCreate(),您的字段将被初始化。然后你调用new Thread(new MainActivity()),这意味着你创建了一个MainActivity的新对象。然后,您可以访问未初始化的主题按钮,因为如果您致电new MainActivity,则onCreate()将被调用。

答案 1 :(得分:0)

基本上,MainActivity在UI线程中运行,所有按钮都可以在UI线程中访问。由于我们开始了新的线程并且我们正在尝试修改按钮属性,因此无法访问按钮。如果我们要修改任何UI元素,我们必须使用 Handler或runOnUiThread 来执行此操作,如下所示

someActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
           // Code here will run in UI thread
        }
});

new Handler().post(new Runnable() {
    @Override
    public void run() {
        // Code here will run in UI thread
    }
});

在run()中更新UI元素。