1

2つのボタンがあるアンドロイドアプリを開発しています。 これら二つのボタンは、新しいスレッド2を開始する)だから私は1だスレッド によって返されたデータ上で動作する)ボタンを無効にする3)ここでルーチン を呼び出すと、そのJavaのスレッドとフラグ間で複数のオブジェクトを交換する

new Thread(new Runnable(){ 
      public void run() { 
       getPolls(); 
       answer.setEnabled(false); 
       review.setEnabled(false); 

      } 
     }).start(); 

最初1.Myのコードです質問はどのようにして子スレッドが完了してボタンを再び有効にできるかを知ることができますか? 2.スレッドで呼び出されたgetPolls()メソッドは、arrayListを生成します。

//Sending the filled poll questions data to the main thread 
     Message qemsg = messageHandler.obtainMessage(); 

     qemsg.obj=poll; 

     messageHandler.sendMessage(qemsg); 

//Message Handler to get messages from the thread 
    private Handler messageHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      polldata=(ArrayList<PollQuestion>) msg.obj; 

     } 
    }; 

私の疑問は、私がメッセージハンドラを使用して2つの異なるオブジェクトを送信することができる方法であるが、以下のようにメッセージハンドラコードは、次のように私は、ハンドラを経由して、それを返すのですか?

私を助けてください。

答えて

0

それをデコードすることができますMessageオブジェクトは2つの組み込み整数フィールドarg1arg2whathttp://developer.android.com/reference/android/os/Message.htmlを参照)を持っています。それらを使用して、ハンドラ内で異なる種類のメッセージを区別します。例:スレッドが完了したことを通信する

public static final int TYPE1 = 1; // use a better name ... 
public static final int TYPE2 = 2; 
public void handleMessage(Message msg) { 
    switch(msg.what) { 
     case TYPE1: polldata=(ArrayList<PollQuestion>) msg.obj; break; 
     case TYPE2: ... 
     } 
} 

whatを使用してちょうど別のメッセージフラグタイプ(スレッド終了)を用いて検討してください。

2

私はa singletonを作成し、コールバックでは終了時に表示するブール値を設定します。コードの任意の部分からこのシングルトンにアクセスして、シングルトンが完了しているかどうかを確認することができます。もう一つの方法はタイマーです。タイマーを設定して、完了したかどうかを確認し、ボタンを更新します。

0

getPolls()で初期化する静的なArrayListを使用します。 handleMessageメソッドでは、polldataを静的なArrayListに設定します。例えば、定数というクラスを作成します。

//Message Handler to get messages from the thread 
private Handler messageHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     polldata=Constants.constPolls; 

    } 
}; 

・ホープ、このことができます:getPollsで

public class Constants{ 
    static ArrayList<PollQuestions> constPolls; 
} 

を()次に、メッセージを処理Constants.constPolls

Message qemsg = messageHandler.obtainMessage(); 

    //qemsg.obj=poll; 
    // no need to set an object. 

    messageHandler.sendMessage(qemsg); 

を設定します。

1

私は、James Hollowayのシングルトンの提案と一緒に行くと、あなたが話しているスレッドを何らかの形で制御することができます。

彼らはハンドラで

qemsg.what = MY_CONST_ID; 

Message.whatフィールドで識別することができます異なるメッセージを送信するためとして、あなたは、あなたが送信されたメッセージの種類を見つけて、それに応じて

public void handleMessage(Message msg){ 
    switch (qmsg.what) 
    { 

    case MY_CONST_ID: 
     //process your message here 
     break; 
    } 



} 
関連する問題