1

私はAndroidが初めてで、メインビューを更新し続けるには、さまざまなプロセスを処理するスレッドを作成してから、更新をメインビューに戻す必要があることがわかりました。これを行うには、Handler クラスを使用することにしました。この例のビューには、コードをアクティブ化するためのボタンと、受信したメッセージを表示するためのテーブル レイアウト (プロセスの段階を表す) があります。

問題は、8 つの異なるメッセージを送信し、8 つのメッセージがハンドラーに戻ってくるのを確認できますが、8 つすべてがメッセージ 8 のみと同じ内容を持っていることです。

ハンドラーがメッセージを順番に取得することを期待していました。

これを行うためのより良い方法に関する提案は、いつでも学ぶことを歓迎します。

コードは次のとおりです。

`

public class messageHandlerTest extends Activity {

protected TextView textView;
protected Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            String[] status = (String[]) msg.obj;
            createTableRow(status);
            Log.e("Got a new message",status[0]+":"+status[1]);
        }
    };

Button btnStartProgress;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.statusText);
    textView.setText("");
    //Getting response from server with Network SSID and Password

    Button connectButton = (Button)findViewById(R.id.connectButton);
    addListenerOnButton();
} // End of create

protected class connectWiFi extends Thread implements Runnable {
    //tokens1 = new String[0];
    public void run(){
    try {
        String[] messageString = new String[2];
        Message message = handler.obtainMessage();
        messageString[0]="OK";
        messageString[1]="Number 1";
        message.obj = messageString;
        handler.sendMessage(message);

        message = handler.obtainMessage();
        messageString[0]="OK";
        messageString[1]= "Number 2";
        message.obj = messageString;
        handler.sendMessage(message);
        message = handler.obtainMessage();
        messageString[0]="OK";
        messageString[1] = "Number 3";
        message.obj = messageString;
        handler.sendMessage(message);
        message = handler.obtainMessage();
        messageString[0]="OK";
        messageString[1] = "Number 4";
        message.obj = messageString;
        handler.sendMessage(message);

                    message = handler.obtainMessage();
                    messageString[0] = "OK";
                    messageString[1] = "Number 5";
                    message.obj = messageString;
                    handler.sendMessage(message);

                    message = handler.obtainMessage();
                    messageString[0] = "OK";
                    messageString[1] = "Number 6";
                    message.obj = messageString;
                    handler.sendMessage(message);

                    message = handler.obtainMessage();
                    messageString[0] = "OK";
                    messageString[1] = "Number 7";
                    message.obj = messageString;
                    handler.sendMessage(message);

                    message = handler.obtainMessage();
                    messageString[0] = "OK";
                    messageString[1] = "Number 8";
                    message.obj = messageString;
                    handler.sendMessage(message);

    } catch (Exception e) {
        e.printStackTrace();
        Log.e("Exception found","bugger");
    }
    }// End or run
}// End of class

public void addListenerOnButton() {

    btnStartProgress = (Button) findViewById(R.id.connectButton);
    btnStartProgress.setOnClickListener(
            new OnClickListener() {
                @Override
                public void onClick(View v) {
                connectWiFi connectwifi = new connectWiFi();
                connectwifi.start();
                }

            });

}
private void createTableRow(String[] stage) {
    TableLayout tl = (TableLayout) findViewById(R.id.statusTable);
    TableRow tr = new TableRow(this);
    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    tr.setLayoutParams(lp);
    tr.setBackgroundColor(0xFFFFFFFF);
    TextView tvStatus = new TextView(this);
    tvStatus.setLayoutParams(lp);
    tvStatus.setPadding(2,1,1,2);
    tvStatus.setTextColor(0xFF000000);
    tvStatus.setText(stage[0]); // Status
    TextView tvStage = new TextView(this);
    tvStage.setLayoutParams(lp);
    tvStage.setPadding(2,1,1,2);
    tvStage.setTextColor(0xFF000000);
    tvStage.setText(stage[1]); // Stage
    tr.addView(tvStatus);
    tr.addView(tvStage);
    tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}
@Override
protected void onDestroy() {
    super.onDestroy();
}

}

このコードの結果は次のようになります。

ここに画像の説明を入力

4

5 に答える 5

8

ハンドラを介してデータを送信するには、ハンドラに送信するメッセージ オブジェクトのデータとして bundle を使用できます。このコードのように:

// receieve message in handleMessage method of handler of your controller (e.g. on UI thread)
handler = new Handler() { 
    @Override
    public void handleMessage(Message msg) {
        Bundle b = msg.getData();
        Integer value = b.getInt("KEY");
        ...
    }
};

// Sending message in a background thread
new Thread(new Runnable() {
    @Override
    public void run() {
        final Message msg = new Message();
        final Bundle b = new Bundle();
        Integer value = 1;
        b.putInt("KEY", value);
        msg.setData(b);
        handler.sendMessage(msg);    
    }
).start();
于 2014-05-04T07:24:16.767 に答える
1

これを適切な場所で行っているかどうかはわかりませんが、ここで受け取ったヘルプに基づいてリファクタリングされたコードを投稿すると、他の人に役立つかもしれないと思いました. これは私にとってはうまく機能し、コードは非常にきれいに見えますが、これを改善または効率化する方法についてのフィードバックはいつでも歓迎されます. また、間違った場所でこれを行っている場合はお知らせください。

public class messageHandlerTest2 extends Activity {

protected TextView textView;
protected Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        createTableRow((mymessageObject) msg.obj);
    }
};  //Set-up handler to be used later

Button btnStartProgress;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button connectButton = (Button) findViewById(R.id.connectButton);
    addListenerOnButton();
} // End of create

protected class connectWiFi extends Thread {
    public void run() {
        try {
            sendMessage(true,"Number 1"); // send if OK and a stage message
            sendMessage(true,"Number 2");
            sendMessage(true,"Number 3");
            sendMessage(true,"Number 4");
            sendMessage(true,"Number 5");
            sendMessage(true,"Number 6");
            sendMessage(true,"Number 7");
            sendMessage(true,"Number 8");
            sendMessage(true,"Number 9");
            sendMessage(true,"Number 10");
            sendMessage(true,"Number 11");
            sendMessage(true,"Number 12");

        } catch (Exception e) {
            e.printStackTrace();
            Log.e("Exception found", "bugger");
        }
    }// End or run
}// End of class

public void addListenerOnButton() {

    btnStartProgress = (Button) findViewById(R.id.connectButton);
    btnStartProgress.setOnClickListener(
            new OnClickListener() {
                @Override
                public void onClick(View v) {
                    connectWiFi connectwifi = new connectWiFi();
                    connectwifi.start();
                }

            });
}

private void createTableRow(mymessageObject stage) {
    String statusString;
    TableLayout tl = (TableLayout) findViewById(R.id.statusTable);
    TableRow tr = new TableRow(this);
    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    tr.setLayoutParams(lp);
    tr.setBackgroundColor(0xFFFFFFFF);
    TextView tvStatus = new TextView(this);
    tvStatus.setLayoutParams(lp);
    tvStatus.setPadding(2, 1, 1, 2);
    tvStatus.setTextColor(0xFF000000);
    if (stage.Status) {statusString = "OK";} else {statusString = "No";};
    tvStatus.setText(statusString); // Status
    TextView tvStage = new TextView(this);
    tvStage.setLayoutParams(lp);
    tvStage.setPadding(2, 1, 1, 2);
    tvStage.setTextColor(0xFF000000);
    tvStage.setText(stage.statusMessage); // Stage
    tr.addView(tvStatus);
    tr.addView(tvStage);
    tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}

@Override
protected void onDestroy() {
    super.onDestroy();
}
private class mymessageObject {  // Creates object of status flag and stage message
    boolean Status;
    String statusMessage;
    mymessageObject(boolean newStatus, String newMessage){
        Status = newStatus;
        statusMessage = newMessage;
    }
}
private void sendMessage (boolean status, String stageMessage) { // Handle sending message back to handler

    Message message = handler.obtainMessage();
    message.obj = new mymessageObject(status,stageMessage);
    handler.sendMessage(message);
}

}

于 2013-08-17T10:26:38.540 に答える
-2

これを試して

Message m = Message.obtainMessage();

いいえ

Message m = handler.obtainMessage();
于 2013-08-16T14:58:03.223 に答える