...私は助けてきました願っています。しかし、あなたは同様のことをする独自のカスタムクラスを作ることができます。 は、私はこのようなものを作った:
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のすべての機能を提供していません。
「ハンドラ」は、主にアプリケーションスレッド(例えば、UI更新)上で達成される作業をバックグラウンドスレッドが手配できるように設計されています。 [ドキュメント](http://developer.android.com/reference/android/os/Handler.html)を引用すると、 "Handlerには主に2つの用途があります。(1)メッセージと実行可能ファイルをスケジュールする(2)自分のスレッドとは別のスレッドで実行されるアクションをエンキューする」という2つの方法があります。 'Handler'を他の目的のために使うのは貧弱な習慣です。 – CommonsWare
@CommonsWareアドバイスをいただきありがとうございます。ハンドラで使用されているメカニズムを使用したいだけです(つまり、ソケットメッセージを 'Foo'クラスを介してインターネットに送り、' Main'クラスで使用する)。 –
ほとんどのオブジェクト指向開発者は、 'Foo'のインスタンスから' Main'メソッドを呼び出すだけです。 – CommonsWare