我正在
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();
}
}
答案 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执行之前初始化处理程序。