android sendEmptyMessage()和sendMessage()误用导致handleMessage出现错误
2017-02-08 10:15
399 查看
在项目当中有电池管理的部分,当通过485接口发送指令给电池矩阵并正确返回数据后是调用了代码中的onDataReceived方法,通过里面的子线程获得数据,然后通过handler将数据发送到主线程做分析和UI修改等工作,但由于不注意sendMesage的使用,在代码当中开始这样编写:
Message mMessage = cmdHander.obtainMessage();
String receiveStr = new String("adbjjdd");
tempData += receiveStr;
// mMessage.what = 1000;
cmdHander.sendEmptyMessage(1000);
mMessage.obj = tempData;
Log.d("TIEJIANG", "tempData-1 = " + tempData);
cmdHander.sendMessage(mMessage);
Log.d("TIEJIANG", "tempData-2 = " + tempData);
Log.d("TIEJIANG", "onDataReceived---receiveStr-send = " + receiveStr);
然后在handleMessage当中进行处理,
private Handler cmdHander = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.d("TIEJIANG", "cmdHandler");
super.handleMessage(msg);
// Log.d("TIEJIANG", "tempData = " + tempData);
// Log.d("TIEJIANG", "tempData length = " + tempData.length());
Log.d("TIEJIANG", "(String) msg.obj-1 = " + msg.obj);
}
};
发现收到了null!具体Log信息:
02-08 10:02:18.193 9166-9166/ D/TIEJIANG: tempData-1 = adbjjdd
02-08 10:02:18.193 9166-9166/ D/TIEJIANG: tempData-2 = adbjjdd
02-08 10:02:18.193 9166-9166/ D/TIEJIANG: onDataReceived---receiveStr-send = adbjjdd
02-08 10:02:18.226 9166-9166/ D/TIEJIANG: cmdHandler
02-08 10:02:18.226 9166-9166/ D/TIEJIANG: (String) msg.obj-1 = null
02-08 10:02:18.226 9166-9166/ D/TIEJIANG: cmdHandler
02-08 10:02:18.226 9166-9166/ D/TIEJIANG: (String) msg.obj-1 = adbjjdd 从中可见,msg.obj先是null然后才有了数据。仔细观察子线程里面的代码才发现,我首先通过cmdhandler发送了一个message,即:
cmdHander.sendEmptyMessage(1000);
然后才使用了cmdHander.sendMessage(mMessage);
所以导致第一次并没有从“obj”里面拿到正确的数据。而正确的通过handler发送字符到主线程应该这样:
Message mMessage = cmdHander.obtainMessage();
String receiveStr = new String("adbjjdd");
tempData += receiveStr;
mMessage.what = 1000;
// cmdHander.sendEmptyMessage(1000);
mMessage.obj = tempData;
Log.d("TIEJIANG", "tempData-1 = " + tempData);
cmdHander.sendMessage(mMessage);
Log.d("TIEJIANG", "tempData-2 = " + tempData);
Log.d("TIEJIANG", "onDataReceived---receiveStr-send = " + receiveStr);
相关文章推荐
- 【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区
- android的Handler中sendEmptyMessage与sendMessage的区别
- 【Android】sendMessage与sendEmptyMessage的异同
- android的Handler中sendEmptyMessage与sendMessage的区别
- android handler sendEmptyMessage与sendMessage
- 【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区别
- 【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区别
- 【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区别
- sendemptymessage 和sendmessage的区别
- Handler 的sendEmptyMessage(int what)和sendMessage(Message msg)有啥区别?
- sendMessage和sendEmptyMessage的区别
- Handler 的sendEmptyMessage(int what)和sendMessage(Message msg)的区别?
- Android中Handler的sendEmptyMessage的理解
- Android加载so出现dlopen failed: empty/missing DT_HASH in "libx.so" (built with --hash-style=gnu?)错误
- android eclipse 图片查看器 post与sendEmptyMessage更新主线程的区别
- handler.handleMessage(msg) 和 handler.sendEmptyMessage()运行在主线程吗?
- Handler 的sendEmptyMessage(int what)和sendMessage(Message msg)有啥区别?
- sendEmptymessage 和sendMessage的区别
- android中导入开源项目,常出现的导致编译错误的解决方法
- sendMessage&sendEmptyMessage异同