代码之家  ›  专栏  ›  技术社区  ›  Biu

带Looper的NullPointerException

  •  -3
  • Biu  · 技术社区  · 10 年前

    请帮我做这个。我创建了一个进度条,并在应用程序启动时以编程方式每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();
        }
    }
    
    1 回复  |  直到 10 年前
        1
  •  5
  •   Leandro    10 年前

    方法 Thread#start() 是异步和非阻塞的。这意味着你的 custom_handler 将被实例化(在 MyThread ) 但是 创建一个新线程比运行两个简单的指令要慢。在运行时处理时

    custom_handler.sendMessage(message);
    

    这个 自定义处理程序 尚未实例化。 您可以通过在该行之前设置一个断点来确认,然后等待几秒钟,然后继续执行。它不会崩溃。

    要实际修复它,您应该实例化 自定义处理程序 在调用它之前,最好是在拥有它的线程中。