0

私のプロセスは、Handler. を使用して UI スレッドの ProgressBar を更新しますが、このようなエラーが発生します。
null オブジェクト参照の .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(メッセージ);

4

2 に答える 2

3

Threadコードには、呼び出された の独自の実装がありますMyThread。この実装では、グローバル変数の参照を使用していますhandler

問題は次のとおりです。変数をインスタンス化するMyThread前にインスタンス化しようとしていhandlerます。あなたが電話するときもそうhandlerですnullthread.start()

ソリューションは静かでシンプルです:

初期化後にスレッドを開始する必要がありますHandler

于 2017-01-06T13:58:01.363 に答える
1

handler=new Handler()の前に新しいスレッドを開始しているためhandler、最初は null になります。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();
} 
于 2017-01-06T13:59:00.890 に答える