Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用处理程序接收消息?_Android - Fatal编程技术网

Android 如何使用处理程序接收消息?

Android 如何使用处理程序接收消息?,android,Android,我尝试了很多方法来使用处理程序在后台线程上接收消息,但都没有成功 有没有可靠的方法来测试这一点?是否有一个示例代码可以用来查看它是如何完成的?在非UI线程上?您只需在该线程上创建一个循环器,然后在其上创建处理程序。这将自动导致该处理程序与该活套关联。然后运行Looper.loop 所以 myHandler将在线程上。是的,请通过@FoamyGuy进行尝试。在示例代码中,他发回了一条空消息。我正在扩展他的代码来传递字符串。如果要将一些消息发送回处理程序(例如:string),可以按如下方式发送一些

我尝试了很多方法来使用处理程序在后台线程上接收消息,但都没有成功


有没有可靠的方法来测试这一点?是否有一个示例代码可以用来查看它是如何完成的?

在非UI线程上?您只需在该线程上创建一个循环器,然后在其上创建处理程序。这将自动导致该处理程序与该活套关联。然后运行Looper.loop

所以

myHandler将在线程上。

是的,请通过@FoamyGuy进行尝试。在示例代码中,他发回了一条空消息。我正在扩展他的代码来传递字符串。如果要将一些消息发送回处理程序(例如:string),可以按如下方式发送一些字符串或其他内容:

Handler h = new Handler(){
    @Override
    public void handleMessage(Message msg){
        if(msg.what == 1){
           //Success
           String msg = (String)msg.obj;
           Log.d("", "Msg is:"+msg);
        }else{
           //Failure
           String msg = (String)msg.obj;
           Log.d("", "Msg is:"+msg);    
        }
    }
};

Thread t = new Thread() {
    @Override
    public void run(){
        doSomeWork();
        if(succeed){
            //we can't update the UI from here so we'll signal our handler. and it will do it for us.
               Message m = h.obtainMessage(1, "Success message string");
               m.sendToTarget();
        }else{
               Message m = h.obtainMessage(0, "Your Failed!");
               m.sendToTarget();
        }
    }   
}

这就是为什么google人员创建了HandlerThread以避免所有这些步骤,她仍然需要创建处理程序,无论是在run函数中,还是在其他地方,使用HandlerThread中的Looper作为构造函数中的Looper参数。因此,就工作而言,这是六分之一,六分之一。但无论哪种方式都可以,HandlerThread只是没有出现在我的脑海中,我从来没有真正使用过它。下一个问题是:我什么时候可以使用myHandler来发送消息?就在线程启动()之后,或者我需要等待一段时间。。。?我希望您能看到这个问题?@pskink使用HandlerThread时也存在同样的问题。在调用循环之前,将消息传递给循环器仍然是无效的,这发生在HandlerThread的run函数的末尾。仅仅因为它是在框架中完成的,并不意味着它的代码不同。@pskink事实上,我发现使用HandlerThread有一个很多新手都不会遇到的问题-如果您确实尝试为它创建一个实际的处理程序,那么您需要在调用.start()之后再这样做。否则,对getLooper()的调用将尝试等待looper初始化(在运行中发生),如果同一线程希望调用start,则它会死锁。事实上,如果我没有真正查看AOSP代码,我永远也不会想到这一点。这就是为什么当事情有3行长时,我自己做——所以我知道问题出在哪里。@Gabeschen,是的,我曾经用Android的内置消息尝试过一些事情,但我要么做得非常错误,要么我对它的记忆不好。它确实不是很多锅炉铭牌代码。我仍然推荐任何人使用:这是一个非常好的Android事件总线。问题是他是否需要它。有些东西需要一个事件总线。对其他人来说,这是可怕的过度杀戮。例如,我对奥托的一个担忧是它的同步性。这通常与我想要的相反——如果我想要同步,我就不会使用线程。这很公平,尽管Otto可以很容易地更改,以便在多个线程上发布和接收消息,这就是我所做的。
Handler h = new Handler(){
    @Override
    public void handleMessage(Message msg){
        if(msg.what == 1){
           //Success
           String msg = (String)msg.obj;
           Log.d("", "Msg is:"+msg);
        }else{
           //Failure
           String msg = (String)msg.obj;
           Log.d("", "Msg is:"+msg);    
        }
    }
};

Thread t = new Thread() {
    @Override
    public void run(){
        doSomeWork();
        if(succeed){
            //we can't update the UI from here so we'll signal our handler. and it will do it for us.
               Message m = h.obtainMessage(1, "Success message string");
               m.sendToTarget();
        }else{
               Message m = h.obtainMessage(0, "Your Failed!");
               m.sendToTarget();
        }
    }   
}