0

私のアプリケーションでは、Bluetooth 経由でいくつかの文字列を受信し、ハンドラーを使用してそれらを UI スレッドに戻したいと考えています。Handler オブジェクトを使用して、データをメイン UI スレッドに戻しました。

mHandler.obtainMessage(MainActivity.MESSAGE_READ, length, 0, a).sendToTarget();

注意: aは、Bluetooth InputStream から取得したバイト配列です。

私のUIスレッドには、次のものがありました。

private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
                    byte[] b = (byte[]) msg.obj;
            String str = new String(b, 0, msg.arg1);
            Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();
            Log.i(TAG, "mHander: " + str);
                }
}

たとえば、単純な文字列「cfm123245」を他の Bluetooth デバイス (マイクロ コントローラーによって制御される Bluetooth モジュール) から Android フォンに送信すると、Toast は正確に「cfm12345」を画面に表示します。しかし、Logcat では、次の醜い文字列が表示されます。

MainActivity         mHander: cfm��������

Toast と Logcat で 1 つの String オブジェクトの表示が異なる理由はわかりません。そして、その文字列をさらに処理するためにその文字列を取得すると、醜いcfm��������ものを取得したように見えます。だから間違ったデータです。

なぜこれが起こるのか、誰かが私に説明できますか? これを修正する方法は?それについて私を助けてください。

前もって感謝します!

4

2 に答える 2

0

おそらく、エンコーディングの問題が原因でした。これを試して、役立つかどうかを確認してください

String str = new String(b, "US-ASCII");

上記が機能しない場合は、UTF-8エンコーディングを試すこともできます。

于 2012-09-08T17:59:08.260 に答える
0

mHandler.obtainMessage(FileBrowserActivity.MESSAGE_READ, length, 0, a).sendToTarget();

a上記のToast は何らかのタイプのオブジェクトであると信じています....そして、その toString() メソッドをオーバーライドしたことを願っています...

次に、トーストに行くa.toString()a + ""トーストに行きます。

于 2012-09-08T18:25:07.100 に答える