Handler.sendMessage(new Message) 须发送新对象
Handler.sendMessage(new Message). 这个方法是指 Handler 在发送消息的时候,需要发送一个新的对象。也就是每次在发送消息时,在更新了 Date 后,需要重新构造 Message 对象,而不是利用已经构建的对象,否则会报错:
例如以下的代码:
- class UpdateProgressBarThread implements Runnable{
- @Override
- public void run() {
- Message msg = new Message();
- int progress = 0;
- while(progress <= 100){
- msg.arg1 = progress;
- handler.sendMessage(msg);
- progress += 10;
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- msg.arg1 = -1;
- handler.sendMessage(msg);
- }
- }
看似没错,但其实在运行时会报错。
正确的代码应该是:
- class UpdateProgressBarThread implements Runnable{
- @Override
- public void run() {
- int progress = 0;
- while(progress <= 100){
- Message msg = new Message();
- msg.arg1 = progress;
- handler.sendMessage(msg);
- progress += 10;
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- Message msg = handler.obtainMessage();//同 new Message();
- msg.arg1 = -1;
- handler.sendMessage(msg);
- }
- }
若是了解 Handler 的消息队列机制,就会明白为什么会报“This message is already in use.”的错误了,因为 Handler 每次 sendMessage() 时,都会将一个消息送到一个消息对队列中,所以必须必须是一个新的 Message 对象才行。

浙公网安备 33010602011771号