2012-03-04 157 views
5

Android中的Handler用于在类之间发送消息。例如:Java中是否有类似android中的android.os.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类似的技术,或者我应该实现自己的处理程序?

+3

'Handler'主要被设计为允许后台线程安排在主应用程序线程上完成工作(例如UI更新)。或者,引用[the documentation](http://developer.android.com/reference/android/os/Handler.html),“处理程序有两个主要用途:(1)安排消息和可运行子程序作为未来的某个点执行;以及(2)排队要在不同于你自己的线程上执行的动作。“将Handler用于其他目的是很糟糕的做法。 – CommonsWare 2012-03-04 21:07:56

+0

@CommonsWare感谢您的建议。我只想使用Handler中使用的机制(即我想通过'Foo'类重定向套接字消息,并在Main类中使用它)。 – 2012-03-04 21:17:44

+0

大多数OO开发人员只需从'Foo'的实例调用'Main'方法。 – CommonsWare 2012-03-04 21:25:59

回答

2

没有一个默认。但是你可以让自己的自定义类来做类似的事情。 我做了一个这样的:

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

然后你提供这个处理程序实例您的后台线程:

mHandler.obtainMessage(0).sendToTarget(); 
Thread thread = new T1(handler); 
thread.start(); 

而在去年,您的方式发送消息10

我在一个样本applet程序上测试了这个方法,它看起来很完美。虽然我不是专家级的java程序员,但可能会有一些缺点,但我并没有真正意识到。如果是这样,我很乐意听到一个有教养的解释,为什么这不好。

希望这可以帮助别人。

注意:上述处理程序和消息类(我的代码)不提供Android.Handler和Android.Message的完整功能。

+1

这实际上并不是预期的行为。在android中,handleMessage将在Handler被创建的线程上执行(因为Handler被绑定到线程所在的位置)。 即使看起来用法类似,您提出的示例的运行方式也会与Android中的Handler不同。更明确地说,handleMessage中的代码部分将在线程(T1)上运行,而不是在创建处理程序的线程上运行! – 2017-06-15 12:07:20

相关问题