请帮我做这个。我创建了一个进度条,并在应用程序启动时以编程方式每100毫秒更新一次进度(是的,这听起来很奇怪,但只是为了搞乱而已)。但每次运行它时,我都会收到NullPointerException。有人能帮我吗?日志指示在下面的“custom_handler.sendMessage(message);”处发生NullPointerException。非常感谢。
private Handler custom_handler, main_handler; private int progress = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //TextView to display the text_view = (TextView)findViewById(R.id.text_view); progress progress_bar = (ProgressBar)findViewById(R.id.progress_bar); //Instantiate a new worker thread //but somehow its handler is not instantiated //by the time the compiler reaches the "custom_handler.sendMessage(message);" //at all, keep getting NullPointerException //please look at the comment below the next code block. new MyThread().start(); main_handler = new Handler(Looper.getMainLooper()) { public void handleMessage(Message message) { progress_bar.setProgress(message.arg1); text_view.setText(message.arg1 + "%"); } }; Message message = Message.obtain(); message.obj = "Battery fully charged"; //keep getting the exception here custom_handler.sendMessage(message); } class MyThread extends Thread { public void run() { Looper.prepare(); custom_handler = new Handler(Looper.myLooper()) { public void handleMessage(Message message) { Toast.makeText(MainActivity.this, message.obj.toString(), Toast.LENGTH_SHORT).show(); } }; while (progress < 100) { try { Thread.sleep(100); } catch (Exception e) { System.out.println("PSSSHH"); } progress++; Message message = Message.obtain(); message.arg1 = progress; main_handler.sendMessage(message); } Looper.loop(); } }
方法 Thread#start() 是异步和非阻塞的。这意味着你的 custom_handler 将被实例化(在 MyThread ) 但是 创建一个新线程比运行两个简单的指令要慢。在运行时处理时
Thread#start()
custom_handler
MyThread
custom_handler.sendMessage(message);
这个 自定义处理程序 尚未实例化。 您可以通过在该行之前设置一个断点来确认,然后等待几秒钟,然后继续执行。它不会崩溃。
自定义处理程序
要实际修复它,您应该实例化 自定义处理程序 在调用它之前,最好是在拥有它的线程中。