Поворот экрана, вызывающий прекращение обновления TextViews - PullRequest
1 голос
/ 10 января 2012

Мое приложение получает данные с устройства BlueTooth 4 раза в секунду, анализирует их и затем отображает на экране. Все работает нормально, пока ориентация экрана не изменится, тогда textViews вернутся к значениям по умолчанию, установленным в моем onCreate, и не будут меняться оттуда.

Я все еще получаю данные из моего обработчика сообщений из потока Bluetooth, и синтаксический анализ работает нормально, но мой метод updateUI () ничего не делает. Все, что есть в updateUI (), - это установить текст TextView в значение, например, tv_text.setText (doubleValue) ;. Опять же, это прекрасно работает, прежде чем экран поворачивается или спит.

Меняется ли идентификатор представления при повороте экрана, поэтому мой TextView неправильный? Как мне обойти это? Я видел других людей с проблемами потери TextView своих данных, но я не уверен, что это та же проблема, потому что я не могу снова установить текст после поворота.

Спасибо.

РЕДАКТИРОВАТЬ: я обнаружил странное поведение.

  1. Если я поверну экран перед подключением к устройству BT, он будет работать при подключении. Но потом он останавливается, когда я снова поворачиваюсь.

  2. Когда я поворачиваюсь, текстовое представление отображает значение, которое было ему назначено в последний раз ПЕРЕД подключением. Например, если сделать tv.setText («10»), он отобразит 10. Затем я подключаюсь, и он обновляется с правильными значениями. Затем я поворачиваюсь, и это возвращается к отображению 10 ...

  3. Единственный раз, когда я устанавливаю текстовые значения в моем коде 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;
                }
         }

    };

Это будет работать, если я отсоединяюсь и снова подключаюсь каждый раз при повороте экрана, но это прерывает работу функции регистрации данных приложения, поэтому я не хочу этого делать ... Если я заблокирую ориентацию на пейзаж, экран явно не вращается и вызывает эту проблему, но если телефон спит, когда он просыпается в портретном режиме, он поворачивается в ландшафтный режим, и проблема возникает.

Ответы [ 3 ]

2 голосов
/ 17 января 2012

На всякий случай, если у кого-то еще возникла эта проблема, я нашел исправление.

Я закончил тем, что переместил свой Bluetooth-приемник в службу, и когда он получает данные от устройства BT, он затем передает ихи получен моим пользовательским интерфейсом.

Дополнительную информацию можно найти в моем другом вопросе здесь: Фоновая задача Android и жизненный цикл

1 голос
/ 10 января 2012

Я не уверен, как это повлияет на связь Bluetooth, но если вы добавите android:configChanges="orientation|keyboardHidden" в свой файл AndroidManifest.xml для действия, в котором вы хотите получать уведомления об изменениях, вы можете справиться с этими изменениями конфигурации в onRetainNonConfigurationInstance(). Этот метод будет вызван до того, как ваша деятельность будет уничтожена и перестроена.

Следует отметить, что этот метод устарел, если вы ориентируетесь на Honeycomb или более позднюю версию, и что вам следует использовать Fragment.setRetainInstance(boolean).

0 голосов
/ 10 января 2012

Где вы устанавливаете свою ссылку для textView, скорее всего, ссылка на ваше textview была потеряна.

Вы также можете попробовать

((TextView)findViewById(yourtextviewid)).setText(doubeValue)

Таким образом, вы не будете статически удерживать ссылку.

Не видя свой код;в частности, жизненный цикл вашей деятельности - это удар в темноте.

РЕДАКТИРОВАТЬ: вы можете попробовать сделать статический обработчик и ваш объект Bluetooth таким образом, чтобы они были общими для всех экземпляров класса ... Однако я бы порекомендовал взглянуть на реализацию службы для подключения Bluetooth.

...