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

时间:2012-03-04 21:01:28

标签: java android design-patterns listener handler

Android中的Handler用于在类之间发送消息。例如:

public class Foo
{

    private Handler handler;

    public Foo(Handler handler)
    {
        this.handler = handler;

        // ...
    }

    public void fooMethod()
    {
        // ...
        handler.obtainMessage("blah blah").sendToTarget();
    }

}

主要

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

2 个答案:

答案 0 :(得分:3)

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

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

我在我做过的示例applet程序上测试了这个方法,它似乎完美无缺。虽然我不是一个专业的java程序员,所以可能会有一些缺点,我真的不知道。如果是这样的话,我很乐意听到一个有教育的解释为什么这不好。

希望这有助于某人。

注意:上面的Handler和Message类(我的代码)不提供Android.Handler和Android.Message的完整功能。

答案 1 :(得分:1)

我相信您正在寻找像Observer Pattern这样的东西,这样可以轻松地将对象传达给另一个。

请参阅&gt;&gt;&gt; http://www.javaworld.com/javaqa/2001-05/04-qa-0525-observer.html

另外&gt;&gt;&gt; http://www.oodesign.com/observer-pattern.html

我希望我帮助过......