2012-03-04 156 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

相關問題