Bluetoothデバイスに接続し、デバイスから送信されたデータを読み取り、それをAChartEngineグラフに追加し、そのデータをTextViewに表示するAndroidアプリを作成しています。
私のBluetoothコードは、BluetoothChatサンプルコードのスレッド化された実装と非常によく似ています(SDKに付属しています)。LogCatでConnectedThread
ループが実行されているため、新しいデータが取得されていることがわかりますが、TextViewは7行後に更新を停止し、グラフは断続的に一時停止します(相互作用に断続的に応答するだけであることは言うまでもありません)。LogCatに表示されているエラーはありません。また、グラフを削除しても、TextViewの問題は解決しません。
他のスレッドから更新したときにUIスレッドが機能しないのはなぜですか?
以下は私のコードの関連部分です。Bluetoothを介して送信された各文字列は、に受信されConnectedThread
て送信され、クラスからBluetoothController.addToGraph()
実行されます。NewPoints
AsyncTask
viewer
private class ConnectedThread extends Thread {
public ConnectedThread(BluetoothSocket socket, String socketType) { ... } // Initialize input and output streams here
public void run() {
while (true) {
Log.i(TAG, "READ mConnectedThread");
// Read from the InputStream
byte[] buffer = new byte[1024];
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(BluetoothController.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
Log.i(TAG, "LOOPEND mConnectedThread");
}
}
}
public class BluetoothController extends Activity {
private viewer plotter;
public static final int MESSAGE_READ = 2;
// The Handler that gets information back from the BluetoothClass
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
// construct a string from the valid bytes in the buffer
String readMessage = new String(readBuf, 0, msg.arg1);
addToGraph(readMessage);
break;
}
}
};
protected void addToGraph(String result) {
// process the string, create doubles x and y that correspond to a point (x,y)
plotter.new NewPoints().execute(x, y);
}
}
public class viewer extends Activity {
// initialize graph, etc.
@Override
protected void onResume() {
// Create handlers for textview
textHandler = new Handler();
// Set scrolling for textview
myTextView.setMovementMethod(new ScrollingMovementMethod());
protected class NewPoints extends AsyncTask<Double, Void, Void> {
@Override
protected Void doInBackground(Double... values) {
mCurrentSeries.add(values[0], values[1]); // x, y
if (mChartView != null) {
mChartView.repaint();
}
final Double[] messages = values;
textHandler.post(new Runnable() {
@Override
public void run() {
myTextView.append("(" + messages[0].toString() + ", " + messages[1].toString() + ") \n");
}
});
return null;
}
}
}
何が得られますか?さらにコードが必要な場合は、お知らせください。