Java中是否有类似于android中的android.os.Handler的类?
Android中的处理程序用于在类之间发送消息。例如:Java中是否有类似于android中的android.os.Handler的类?,java,android,design-patterns,listener,handler,Java,Android,Design Patterns,Listener,Handler,Android中的处理程序用于在类之间发送消息。例如: public class Foo { private Handler handler; public Foo(Handler handler) { this.handler = handler; // ... } public void fooMethod() { // ... handler.obtainMessage(
public class Foo
{
private Handler handler;
public Foo(Handler handler)
{
this.handler = handler;
// ...
}
public void fooMethod()
{
// ...
handler.obtainMessage("blah blah").sendToTarget();
}
}
Main:
public class Main
{
private Handler handler;
public Main()
{
handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
// handle the message that is sent from Foo
}
};
Foo f = new Foo(handler);
// ...
}
}
因此,我正在寻找Java中的类似技术,或者我应该实现自己的处理程序吗?我相信您正在寻找类似观察者模式的东西,它可以简化对象与另一个对象的通信 请参见>>> 也>>>
我希望我已经帮了…默认情况下没有。但是您可以创建自己的自定义类来完成类似的事情。 我做了一个这样的:
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;
}
}
};
然后将此处理程序实例提供给后台线程:
Thread thread = new T1(handler);
thread.start();
最后,您通过以下方式发送消息:
mHandler.obtainMessage(0).sendToTarget();
我在自己编写的一个示例applet程序上测试了这个方法,它似乎工作得很好。虽然我不是一名java程序员,但这可能有一些缺点,我并没有真正意识到。如果是这样的话,我很想听到一个受过教育的解释,为什么这不好
希望这对别人有帮助
注意:上述处理程序和消息类(我的代码)不提供Android.Handler和Android.Message的全部功能。
处理程序
主要用于允许后台线程安排在主应用程序线程上完成的工作(例如,UI更新)。或者,引用“处理程序有两种主要用途:(1)将消息和可运行程序安排在将来某个时间执行;(2)将要在不同线程上执行的操作排队。”将处理程序用于其他目的是一种糟糕的做法。@commonware感谢您的建议。我只想使用Handler中使用的机制(即,我想重定向通过Foo
类在internet上传递的套接字消息,并在Main
类中使用它)。大多数OO开发人员只需从Foo
@commonware的一个实例调用Main
上的方法,我没有想到这一点。我将在Foo构造函数中传递Main的实例,然后在Foo中调用Main的方法。再次感谢:)@Eng.Fouad您已经写了:我将在Foo构造函数中传递Main的实例,然后在Foo中调用Main的方法
我尝试了您的建议,但没有成功!我在后台线程中从URL加载了图像。所以我用垃圾代替了正确的图片。这实际上不是预期的行为。在android中,handleMessage将在创建处理程序的线程上执行(因为处理程序被绑定到创建它的线程上。即使看起来用法类似,您提出的示例也将运行不同于android中的处理程序。更明确的是,handleMessage中的部分代码将在线程上运行(T1)不是在创建处理程序的线程上!谢谢。至少,对于从Android到纯Java的快速迁移来说,这已经足够了。接下来我应该考虑等效的。也许是rxJava?