android 处理程序给出 Null 对象引用错误

android Handler gives Null object reference error

我的进程使用 Handler.but 更新了 UI 线程中的 ProgressBar,它给出了这样的错误。
.Handler.sendMessage(android.os.Message)' 在空对象引用上
请检查我的代码

public class MainActivity extends AppCompatActivity {
    Handler handler;
    Thread thread;
    ProgressBar prb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        prb=(ProgressBar) findViewById(R.id.progress);
        thread=new Thread(new MyThread());
        thread.start();
        handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                prb.setProgress(msg.arg1);
            }
        };
    }


    class MyThread implements Runnable{

        @Override
        public void run() {
            for (int i=1;i<10;i++) {
                Message message = Message.obtain();
                message.arg1=i;
                handler.sendMessage(message);
                try {
                    thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

这里很明显是错误,

handler.sendMessage(留言);

在您的代码中,您有自己的 Thread 实现,称为 MyThread。 在此实现中,您使用的是全局变量 handler.

的引用

问题是:您试图在实例化 handler 变量之前实例化 MyThread。 所以当你调用 thread.start()

handlernull

解决方案非常简单:

您需要在初始化 Handler

后启动线程

由于您在 handler=new Handler() 之前开始新线程,因此 handler 在开始时将为空。将 onCreate 更改为此

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    prb=(ProgressBar) findViewById(R.id.progress);

    // moved handler initialization
    handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            prb.setProgress(msg.arg1);
        }
    };


    thread=new Thread(new MyThread());
    thread.start();
}