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();
}
}
}