屏幕旋转导致TextViews停止更新

时间:2012-01-10 01:47:32

标签: android textview orientation

我的应用程序每秒钟从BlueTooth设备接收4次数据,解析它然后将其显示在屏幕上。一切正常,直到屏幕方向改变,然后textViews恢复到我的onCreate中设置的默认值,并且不会从那里改变。

我仍然从蓝牙线程接收来自我的消息处理程序的数据,并且解析工作正常,但我的updateUI()方法什么都不做。 updateUI()中的所有内容都是将TextView的文本设置为值,如tv_text.setText(doubleValue);.再次,这在屏幕旋转或睡眠之前工作正常。

当屏幕旋转时,视图ID是否会改变,因此我的TextView是错误的?我该如何解决这个问题?我看到其他人遇到TextView丢失数据的问题,但我不确定这是否是同样的问题,因为我无法在轮换后再次设置文本。

感谢。

编辑:我发现了一些奇怪的行为。

  1. 如果在连接到BT设备之前旋转屏幕,则在连接时它将起作用。但是当我再次旋转时它会停止。

  2. 旋转时,文本视图显示连接前最后分配给它的值。例如,如果执行tv.setText(“10”),它将显示10.然后我连接,并使用正确的值更新。然后我旋转,它回到显示10 ...

  3. 我唯一一次在updateUI()代码中设置文本值,并在收到并解析消息后调用。

  4. 现在我真的很困惑......

    编辑2

    好的,我做了一些测试,我想我可能找到了原因。当我试图断开蓝牙连接时,我发现它没有断开连接。所以然后我尝试在旋转之前断开连接,然后再次连接并且工作正常。

    所以我相信当onCreate再次运行时,它会复制我的蓝牙通信线程并忽略旧线程。问题是我不知道如何以一种方式初始化BTComm对象,它在活动被销毁和重新创建时仍然可以工作,它仍然可以工作并且可以与UI通信。这是一些代码:

    @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 comm class(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 个答案:

答案 0 :(得分:2)

以防其他人遇到此问题我找到了解决办法。

我最终将我的蓝牙监听器移动到服务,当它从BT设备接收数据时,它然后广播它并由我的UI活动接收。

在我的另一个问题中可以找到更多信息,例如:Android background task and lifecycle

答案 1 :(得分:1)

我不确定它会如何影响蓝牙通信,但是如果您将android:configChanges="orientation|keyboardHidden"放在AndroidManifest.xml文件中以查找要通知更改的活动,则可以处理这些配置onRetainNonConfigurationInstance()中的更改。在销毁和重建活动之前,将调用此方法。

应该注意的是,如果您定位Honeycomb或更高版本并且您应该使用Fragment.setRetainInstance(boolean),则不推荐使用此方法。

答案 2 :(得分:0)

您在哪里设置textView的引用机会是对textview的引用已丢失。

您也可以尝试

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

这样您就不会静态保留引用。

没有看到你的代码;特别是你的活动生命周期功能这是在黑暗中刺伤。

编辑: 您可以尝试使处理程序和蓝牙对象保持静态,这样它们将在类的实例之间共享......但是,我建议您查看蓝牙连接的服务实现。