Java中是否有类似于android中的android.os.Handler的类?

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(

Android中的处理程序用于在类之间发送消息。例如:

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?