繁体   English   中英

单击后将参数从handleMessage传递到按钮

[英]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章构建示例练习。 这样做与尝试阅读和挑选樱桃之间的理解之间存在很大的差异。

好吧,我真的认为您应该考虑此应用程序的以下架构。 主要包括三个步骤:

  1. 单击按钮后,将(特定于按钮的)信号发送到IntentService
  2. IntentService根据OPCODE执行适当的操作
  3. IntentService完成工作后,将结果返回给调用方Activity

如果您使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM