常见问题
This message is already in use.
08-12 12:02:42.678: E/AndroidRuntime(5417): android.util.AndroidRuntimeException: { when=-318ms what=0 arg1=1 target=com.tomchen.smsbomb.view.FastChangeTextView$1 } This message is already in use.
Solution
加上 msg = mHandler.obtainMessage();
@Override
public void handleMessage(Message msg) {
switch (msg.arg1) {
case UPDATE:
if (currentValue < value) {
Log.i(tag, "in mHandler UPDATE CASE");
setText(df.format(currentValue));
currentValue = currentValue + rate;
//add this line
msg = mHandler.obtainMessage();
msg.arg1 = UPDATE;
sendMessageDelayed(msg, 30);
} else {
setText(df.format(value));
}
break;
default:
break;
}
super.handleMessage(msg);
}
};
Handler 谷歌 官方文档学习
sendMessageDelayed 和sendEmptyMessageDelayed
sendMessageDelayed(Message msg, long delayMillis)
Enqueue a message into the message queue after all pending messages before (current time + delayMillis).
sendEmptyMessageDelayed(int what, long delayMillis)
Sends a Message containing only the what value, to be delivered after the specified amount of time elapses.
简单说, 就是sendMessageDelayed 发送 Message, sendEmptyMessageDelayed 发送一个只包含what
的Message
上文把代码可以改成sendEmptyMessageDelayed
switch 也要改成从
what
取出标记值
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE:
if (currentValue < value) {
setText(df.format(currentValue));
currentValue = currentValue + rate;
sendEmptyMessageDelayed(UPDATE, 30);
} else {
setText(df.format(value));
}
break;
default:
break;
}
super.handleMessage(msg);
}
};
Note
sendEmptyMessageDelayed 不需要
obtainMessage()