Мое приложение получает данные с устройства BlueTooth 4 раза в секунду, анализирует их и затем отображает на экране. Все работает нормально, пока ориентация экрана не изменится, тогда textViews вернутся к значениям по умолчанию, установленным в моем onCreate, и не будут меняться оттуда.
Я все еще получаю данные из моего обработчика сообщений из потока Bluetooth, и синтаксический анализ работает нормально, но мой метод updateUI () ничего не делает. Все, что есть в updateUI (), - это установить текст TextView в значение, например, tv_text.setText (doubleValue) ;. Опять же, это прекрасно работает, прежде чем экран поворачивается или спит.
Меняется ли идентификатор представления при повороте экрана, поэтому мой TextView неправильный? Как мне обойти это? Я видел других людей с проблемами потери TextView своих данных, но я не уверен, что это та же проблема, потому что я не могу снова установить текст после поворота.
Спасибо.
РЕДАКТИРОВАТЬ: я обнаружил странное поведение.
Если я поверну экран перед подключением к устройству BT, он будет работать при подключении. Но потом он останавливается, когда я снова поворачиваюсь.
Когда я поворачиваюсь, текстовое представление отображает значение, которое было ему назначено в последний раз ПЕРЕД подключением. Например, если сделать tv.setText («10»), он отобразит 10. Затем я подключаюсь, и он обновляется с правильными значениями. Затем я поворачиваюсь, и это возвращается к отображению 10 ...
Единственный раз, когда я устанавливаю текстовые значения в моем коде updateUI (), и он вызывается после получения и анализа сообщения.
Теперь я действительно запутался ...
РЕДАКТИРОВАТЬ 2
ОК, я провел еще несколько тестов и, думаю, мог найти причину. Когда я попытался отключить соединение Bluetooth, я обнаружил, что оно не отключается. Затем я попытался отключиться перед вращением, а затем снова подключился, и это сработало.
Так что я считаю, что при запуске onCreate он дублирует мой поток связи Bluetooth и игнорирует старый. Проблема в том, что я не знаю, как заставить инициализировать объект BTComm таким образом, чтобы он все еще работал, когда действие уничтожено и создано заново, оно все еще работает и может взаимодействовать с пользовательским интерфейсом. Вот некоторый код:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (btc == null){
btc = new BTComm(this, messageHandler);
}
tv_temp1 = (TextView) findViewById(R.id.tv_temp1);
tv_temp2 = (TextView) findViewById(R.id.tv_temp2);
tv_temp1Label = (TextView) findViewById(R.id.tv_temp1Label);
tv_temp2Label = (TextView) findViewById(R.id.tv_temp2Label);
tv_status = (TextView) findViewById(R.id.tv_status);
}
и обработчик, который обрабатывает сообщения, полученные от класса связи BT (btc)
Handler messageHandler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.what){
case BTComm.MESSAGE_CONNECTED:
Toast.makeText(LambdaActivity.this, "Connected!", Toast.LENGTH_SHORT).show();
tv_status.setText("Connected.");
mode = MODE_CONNECTED;
break;
case BTComm.MESSAGE_READ:
parse(msg.getData().getString("results"), msg.getData().getLong("time"));
break;
case BTComm.MESSAGE_DISCONNECTED:
Toast.makeText(LambdaActivity.this, "Disconnected!", Toast.LENGTH_SHORT).show();
tv_status.setText("Not connected...");
mode = MODE_NOT_CONNECTED;
break;
}
}
};
Это будет работать, если я отсоединяюсь и снова подключаюсь каждый раз при повороте экрана, но это прерывает работу функции регистрации данных приложения, поэтому я не хочу этого делать ... Если я заблокирую ориентацию на пейзаж, экран явно не вращается и вызывает эту проблему, но если телефон спит, когда он просыпается в портретном режиме, он поворачивается в ландшафтный режим, и проблема возникает.