我在Android上定义了一个按钮,点击后我需要 来读取一些数据。在这样做的步骤如下所示:将handleMessage中的参数传递给点击后的按钮
1-的OnStart(),我打电话给一个线程如下:
mConnectedThread = new ConnectedThread(mmSocket);
mConnectedThread.start();
2-“运行”以上线程的公共函数使得一些计算,然后将结果发送回消息处理程序如下所示:
msg_handler.obtainMessage(READ_BUF_HAS_UP_STATUS, num_of_read_bytes, -1).sendToTarget();
3-消息处理程序已经被定义为在的onCreate如下:
msg_handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
// if received buffer has any data, then process it here:
case READ_BUF_HAS_UP_STATUS:
up_idle_status_byte = readBuf[0];
n_bytes = msg.arg1;
Log.d(TAG, "....We have received the up status! And it is: "+up_idle_status_byte);
break;
}
}
;
};
4-从上述线程读取状态的“readStatus”按钮在“onCreate”中定义如下。如下面所示,为了mConnectedThread.readStatusReg()的调用将导致状态被读取从其随后被移交给上述消息处理线程的“运行”过程回:
readStatus.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
mConnectedThread.readStatusReg();
while (!msg_handler.hasMessages(READ_BUF_HAS_UP_STATUS)) {
try {
Log.d(TAG, "There is NO message from msg_handler yet");
TimeUnit.MILLISECONDS.sleep(80);
} catch (InterruptedException e) {
String msg = "clicked readStatus and an exception occurred when sleeping for some time" + e.getMessage();
errorExit("Fatal Error", msg);
}
}
}
if (up_idle_status_byte == (byte) 0x01){
//do something
}
else{
//do something else
}
});
的问题是由消息处理程序捕获的“up_idle_status_byte”值不会被此按钮事件看到[它总是在上面的“else”语句中结束)。如果消息处理程序与按钮活动并行 - 我怀疑是这样 - 我会想象按钮处理程序应该能够最终看到正确的状态值。但事实并非如此,消息处理程序似乎是按顺序运行的。这意味着无论我在按钮处理程序循环中暂停多少次,我都不会看到通过“if(up_idle_status_byte ==(byte)0x01)”正在执行的路径。 只要按钮活动退出,消息处理程序的顺序方式就会显示up_idle_status_byte的值被正确设置为1! [请注意,up_idle_status_byte被定义为全局变量]
那么,为什么我不能看到在handleMessage中创建的任何参数,同时在按钮中单击[单击[抱歉,如果这是一个新手问题,但我再也没有声明!! ...]
非常感谢您的意见和建议。
我对你使用此方法有点困惑。所以你想完成的是一些后台工作,然后让它可以访问UI?为什么当你点击readStatus时要等待实际的工作? –
我正在尝试读取设备的状态,可能需要一段时间。但无论如何,问题不在于我在等待某些读取数据,但我为什么消息处理程序设置此全局“up_idle_status_byte”,而按钮活动(或您所说的UI)无法设置检测到。 – user3637785
从你的代码看来,处理程序和点击处理程序都在同一个线程上运行 - 因此被同一个Looper消息队列服务,这就是为什么它们按照你说的行事。总的来说,我不知道这是你尝试实现的伟大架构。你可以考虑使用类似于IntentService的东西来处理阻塞调用,然后使用PendingIntent在完成时通知主Activity活动线程。 –