Есть ли в Java класс, похожий на android.os.Handler в Android? - PullRequest
6 голосов
/ 05 марта 2012

Обработчик в 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, или я должен реализовать свой собственный обработчик?

Ответы [ 2 ]

3 голосов
/ 13 августа 2015

По умолчанию нет ни одного. Но вы можете создать свой собственный класс, который будет делать то же самое. Я сделал один такой:

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

Вы можете использовать этот обработчик для связи из фонового потока с потоком пользовательского интерфейса, не слишком нарушая поток пользовательского интерфейса.

Вы можете использовать этот класс совершенно так же, как в Android: Сначала вы создаете экземпляр в своем классе пользовательского интерфейса:

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

Я проверил этот метод на примере программы апплета, которую я сделал, и, похоже, она работает отлично Хотя я не являюсь опытным программистом Java, поэтому в этом могут быть некоторые недостатки, о которых я не особо осведомлен. Если это так, я хотел бы услышать обоснованное объяснение, почему это не хорошо.

Надеюсь, это кому-нибудь поможет.

ПРИМЕЧАНИЕ. Указанные выше классы Handler и Message (мой код) не обеспечивают полную функциональность Android.Handler и Android.Message.

1 голос
/ 06 мая 2013

Я полагаю, что вы ищете что-то наподобие Pattern Observer, которое облегчает связь объекта с другим.

См. >>> http://www.javaworld.com/javaqa/2001-05/04-qa-0525-observer.html

Также >>> http://www.oodesign.com/observer-pattern.html

Надеюсь, я помог ...

...