没有一个默认。但是你可以让自己的自定义类来做类似的事情。 我做了一个这样的:
import java.util.ArrayList;
public class Handler extends Object{
ArrayList<Message> messages;
public Handler(){
messages = new ArrayList<>();
}
public final Message obtainMessage(int what, Object obj){
Message message = new Message(what, obj, this);
messages.add(message);
return message;
}
public final Message obtainMessage(int what){
Message message = new Message(what, this);
messages.add(message);
return message;
}
public void handleMessage(Message msg){
messages.remove(msg);
}
public final boolean hasMessages(){
return !messages.isEmpty();
}
}
那么你就还需要一个自定义邮件类是这样的:
public class Message extends Object{
int mWhat;
Object mObj;
Handler mTarget;
public Message(int what, Object obj){
mWhat = what;
mObj = obj;
}
public Message(int what, Object obj, Handler target){
mWhat = what;
mObj = obj;
mTarget = target;
}
public Message(int what, Handler target){
mWhat = what;
mTarget = target;
}
public Message(int what){
mWhat = what;
}
public void sendToTarget(){
mTarget.handleMessage(this);
}
}
您可以使用此处理从后台线程到UI线程进行通信,而无需干扰UI线程太多。
,你会在Android中你可以使用这个类在完全同样的方式: 首先,你在你的UI类创建一个实例:
final int MESSAGE_RECEIVED = 0;
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.mWhat){
case MESSAGE_RECEIVED:
System.out.println("Message received.");
updateStatus("Message received.");
break;
}
}
};
然后你提供这个处理程序实例您的后台线程:
mHandler.obtainMessage(0).sendToTarget();
:
Thread thread = new T1(handler);
thread.start();
而在去年,您的方式发送消息10
我在一个样本applet程序上测试了这个方法,它看起来很完美。虽然我不是专家级的java程序员,但可能会有一些缺点,但我并没有真正意识到。如果是这样,我很乐意听到一个有教养的解释,为什么这不好。
希望这可以帮助别人。
注意:上述处理程序和消息类(我的代码)不提供Android.Handler和Android.Message的完整功能。
'Handler'主要被设计为允许后台线程安排在主应用程序线程上完成工作(例如UI更新)。或者,引用[the documentation](http://developer.android.com/reference/android/os/Handler.html),“处理程序有两个主要用途:(1)安排消息和可运行子程序作为未来的某个点执行;以及(2)排队要在不同于你自己的线程上执行的动作。“将Handler用于其他目的是很糟糕的做法。 – CommonsWare 2012-03-04 21:07:56
@CommonsWare感谢您的建议。我只想使用Handler中使用的机制(即我想通过'Foo'类重定向套接字消息,并在Main类中使用它)。 – 2012-03-04 21:17:44
大多数OO开发人员只需从'Foo'的实例调用'Main'方法。 – CommonsWare 2012-03-04 21:25:59