Handler.sendMessage(new Message) 须发送新对象

Handler.sendMessage(new Message). 这个方法是指 Handler 在发送消息的时候,需要发送一个新的对象。也就是每次在发送消息时,在更新了 Date 后,需要重新构造 Message 对象,而不是利用已经构建的对象,否则会报错:

06-27 09:25:39.073: ERROR/AndroidRuntime(1170): android.util.AndroidRuntimeException: { what=0 when=3496212 arg1=10 obj=android.graphics.drawable.AnimatedRotateDrawable@44f4b1a8 } This message is already in use.
 

例如以下的代码:

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 对象才行。

 

你可能感兴趣的:(Android学习记录)