[英]Passing Parameters from handleMessage to a button upon a click
我在Android上定义了一个按钮,点击该按钮后,我需要读回一些数据。 这样做的步骤如下所示:
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的值正确设置为一个! [请注意,将up_idle_status_byte定义为全局变量]
那么,为什么我不能在按钮单击中同时看到在handleMessage中创建的任何参数[对不起,如果这是一个新手问题,但我又没有提出其他要求!...]?
非常感谢您的意见和建议。
这就是问题所在:没有与消息处理程序并行运行的“按钮活动”。 按钮的onClick()代码在主处理程序上的消息内部运行,就像读取状态的代码一样。
您在这里试图做的事情-发出网络请求并在同一按钮侦听器中接收该请求的结果-是不可能的。 主线程上的每个工作单元必须很小,因此您将需要让按钮发出请求,然后在请求完成时(可能在消息处理程序中)由一个单独的部分来完成剩余的工作。
如果您要参考我们的书(必填: Big Nerd Ranch Android编程指南 ),我强烈建议根据说明并理解其工作原理,为第26和27章构建示例练习。 这样做与尝试阅读和挑选樱桃之间的理解之间存在很大的差异。
好吧,我真的认为您应该考虑此应用程序的以下架构。 主要包括三个步骤:
如果您使用PendingIntents,则在该服务生效后,您将使用onActivityResult在Activity中获得回调。 在onActivityResult中,您将知道结果是因为从按钮启动服务时,您发送了一个唯一的int值来标识调用者。 因此,您可以根据呼叫者是谁,以不同的方式处理每个结果的返回。
就代码而言,我再次向您推荐http://blog.vaporstream.com/blog/2013/07/09/concurrency-patterns-intent-service/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.