0

スレッドからハンドラーにメッセージを渡そうとしていますが、ハンドラーのswitchステートメントのハンドラーアクションが処理されていません。

これは私のハンドラーです:

private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        super.handleMessage(msg);
        switch(msg.what) {

        case SUCCESS:
            ConnectedThread connectedThread = new ConnectedThread((BluetoothSocket)msg.obj);
            String s = "Successfully Connected";
            connectedThread.write(s.getBytes());
            break;
        case MESSAGE_READ:
            byte[] readBuff = (byte[])msg.obj;
            String string = new String(readBuff);
            Toast.makeText(getApplicationContext(), string, 0).show();
        }
    }

};

これは、メッセージがハンドラーに渡されるThread run()メソッドです。Threadは内部クラスです。

public void run() {
        if (D) Log.e(TAG, "-- ConnectThread --");
        // Cancel discovery because it will slow down the connection
        mBtAdapter.cancelDiscovery();

        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }

        // Do work to manage the connection (in a separate thread)

        mHandler.obtainMessage(SUCCESS, mmSocket).sendToTarget();
        if (D) Log.e(TAG, "--SUCCESS--");
    }

なぜこれらの行動が実行されていないのかわかりません。

4

1 に答える 1

0

コードを見て何が悪いのかを判断するのは困難です。基本的に、2 番目のスレッドは最初のスレッドのハンドラへの参照を必要とします。ただし、2 番目のスレッドの mHandler 参照とメイン スレッドの mHandler オブジェクトの関連付けは不明です。彼らは同じクラスに属していますか?2 番目のスレッドは、mHandler オブジェクトを含むクラスの内部クラスですか?

自分で Handler Message の実​​装を行うことに興味があったので、小さな例を書きました。次の例が役立つかもしれません。

public class MessageHandlerActivity extends Activity {

public TextView tv;
private static final int SUCCESS = 0;
private static final int FAIL = 1;
private MessageActivityHandler mHandler = new MessageHandlerActivity.MessageActivityHandler(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    tv = new TextView(this);
    tv.setText("waiting!");
    setContentView(tv);
    new Thread(new MessageSenderActivity()).start();
}

static class MessageActivityHandler extends Handler {

    private final WeakReference<MessageHandlerActivity> mActivity;

    MessageActivityHandler(MessageHandlerActivity activity) {
        mActivity = new WeakReference<MessageHandlerActivity>(activity);
    }

    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch(msg.what){
        case SUCCESS:
            mActivity.get().tv.setText("juhu!");
            break;
        case FAIL:
            mActivity.get().tv.setText("fail!");
            break;
        }

    }

};

private class MessageSenderActivity implements Runnable {
    @Override
    public void run() {
        mHandler.obtainMessage(SUCCESS).sendToTarget();
    }
}

}
于 2013-01-05T21:31:52.263 に答える