Я пишу приложение для Android, которое подключается к устройству Bluetooth, считывает данные, отправленные с устройства, добавляет их в график AChartEngine, и отображает данные в TextView.
Мой код Bluetooth очень похож на поточную реализацию в примере кода BluetoothChat (он поставляется с SDK). Я вижу в LogCat, что цикл ConnectedThread
выполняется и, следовательно, получает новые данные, но мой TextView перестает обновляться после 7 строк и график периодически приостанавливается (не говоря уже о том, что он только периодически реагирует на взаимодействие). В LogCat не отображаются ошибки. Кроме того, если я удалю график, проблема с TextView сохраняется.
Почему мой поток пользовательского интерфейса не работает при обновлении из других моих потоков?
Ниже приведены соответствующие части моего кода. Каждая строка, отправленная по 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;
}
}
}
Что дает? Если потребуется больше кода, дайте мне знать.