使用处理程序时出错尝试调用虚拟方法'boolean android.os.Handler.sendMessage

时间:2017-03-21 21:36:59

标签: android handler sendmessage

我正在

E/AndroidRuntime: FATAL EXCEPTION

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Handler.sendMessage(android.os.Message)' on a null object reference at com.example.android.slidenerd180handler.MainActivity$MyThread.run(MainActivity.java:37)

我不确定为什么它不起作用,我在youtube上为Android处理程序做了本教程视频中所说的一切,但它仍然不起作用。

第37行是handler.sendMessage(message);

    class MyThread implements Runnable {


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

        }

3 个答案:

答案 0 :(得分:1)

如果在发送邮件之前未确保Handler已初始化,则无效。

为此,您可以在发送消息之前让线程休眠几毫秒(如2毫秒)。事实是,当UIThread正在运行thread.start()时,辅助线程(实现Runnable的线程)将启动。

run()方法中的循环开始,并且在handler.sendMessage(message)可以读取指令handler = new Handler()之前,辅助线程执行指令UIThread

您无法确定它是否会以这种方式发生,因此您必须确保首先初始化Handler。您可以将Thread.sleep(100);放入辅助线程的run()部分。

答案 1 :(得分:0)

此错误表示您尝试发送空消息。换句话说,消息是空的。检查获取消息的位置,并确保消息不可能为空。

在发送消息之前,您应该添加if语句。尝试用以下代码替换代码:

class MyThread implements Runnable {

@Override
public void run() {
    for(int i =0;i<100;i++){
        Message message = Message.obtain();
        if(message != null){
            message.arg1=i;
            handler.sendMessage(message);
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

希望这有帮助!

答案 2 :(得分:0)

您在初始化处理程序之前启动MyThread(我猜测来自活动的onCreate())。在MyThread执行之前初始化处理程序。

相关问题