Java中有没有类似于android中android.os.Handler的类



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中寻找类似的技术,或者我应该实现自己的处理程序吗?

我相信您正在寻找类似Observer Pattern的东西,它可以简化一个对象与另一个对象的通信。

请参见>>http://www.javaworld.com/javaqa/2001-05/04-qa-0525-observer.html

此外>>http://www.oodesign.com/observer-pattern.html

我希望我帮过。。。

默认情况下没有。但是,您可以创建自己的自定义类来执行类似的操作。我做了一个这样的:

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

然后您还需要一个自定义的Message类,如下所示:

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

然后将这个Handler实例提供给后台线程:

Thread thread = new T1(handler);
thread.start();

最后,您通过以下方式发送消息:

mHandler.obtainMessage(0).sendToTarget();

我在我做的一个示例小程序上测试了这个方法,它似乎工作得很好。虽然我不是一个专业的java程序员,所以这可能有一些缺点,但我并没有真正意识到。如果是这样的话,我很想听到一个有教育意义的解释,解释为什么这不好

希望这能帮助到别人。

注意:上面的Handler和Message类(我的代码)并没有提供Android.HHandler和Android.Message.

的全部功能

最新更新