2012-03-04 13 views
5

Androidのハンドラは、クラス間でメッセージを送信するために使用されます。たとえば:アンドロイドのAndroidのようなJavaのクラスはありますか?

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

「ハンドラ」は、主にアプリケーションスレッド(例えば、UI更新)上で達成される作業をバックグラウンドスレッドが手配できるように設計されています。 [ドキュメント](http://developer.android.com/reference/android/os/Handler.html)を引用すると、 "Handlerには主に2つの用途があります。(1)メッセージと実行可能ファイルをスケジュールする(2)自分のスレッドとは別のスレッドで実行されるアクションをエンキューする」という2つの方法があります。 'Handler'を他の目的のために使うのは貧弱な習慣です。 – CommonsWare

+0

@CommonsWareアドバイスをいただきありがとうございます。ハンドラで使用されているメカニズムを使用したいだけです(つまり、ソケットメッセージを 'Foo'クラスを介してインターネットに送り、' Main'クラスで使用する)。 –

+0

ほとんどのオブジェクト指向開発者は、 'Foo'のインスタンスから' Main'メソッドを呼び出すだけです。 – CommonsWare

答えて

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

を次にあなたがバックグラウンドスレッドに、このハンドラインスタンスを供給:

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

そして最後に、あなたは手段でメッセージを送信します

mHandler.obtainMessage(0).sendToTarget(); 

私が行ったサンプルアプレットプログラムでこのメソッドをテストしたところ、完全に動作しているようです。私は専門のJavaプログラマーではありませんが、これにはいくつかの欠点があります。もしそうなら、私はなぜこれが大丈夫ではないのかについての教育的な説明を聞きたいと思う。

これは誰かを助けることを望みます。

注:上記のハンドラクラスとメッセージクラス(私のコード)は、Android.HandlerとAndroid.Messageのすべての機能を提供していません。

+1

これは実際には予想される動作ではありません。 android handleMessageはハンドラが作成されたときにスレッド上で実行されます(ハンドラが作成されたスレッドにバインドされているため) 使い方が似ていても、提案した例はAndroidからのハンドラとは異なりますより明示的に、handleMessageのコードの一部は、ハンドラが作成されたスレッドではなくスレッド(T1)上で実行されます。 –

関連する問題