我的应用程序每秒从蓝牙设备接收数据4次,解析并将其显示在屏幕上。一切正常,直到屏幕方向改变,然后textViews恢复到我的onCreate中设置的默认值,并不会从那里改变。屏幕旋转导致TextViews停止更新
我仍然从蓝牙线程接收来自我的消息处理程序的数据,并且解析工作正常,但是我的updateUI()方法什么都不做。所有在updateUI()中的是将TextView的文本设置为值,如tv_text.setText(doubleValue);.再次,这个工作正常之前,屏幕旋转或睡觉。
当屏幕旋转时View ID是否改变,所以我的TextView是错误的?我如何解决这个问题?我已经看到其他TextView问题的人失去了它的数据,但我不确定这是否是同样的问题,因为我无法在旋转后再次设置文本。
谢谢。
编辑:我发现了一些奇怪的行为。
如果我在连接到BT设备之前旋转屏幕,它将在我连接时起作用。但是当我再次旋转时它会停止。
当我旋转时,文本视图显示在连接之前最后分配给它的值。例如,如果执行tv.setText(“10”),它将显示10.然后我连接,并使用正确的值更新。然后我旋转,它回到显示10 ...
我唯一一次在我的updateUI()代码中设置文本值,并且在收到并解析消息后调用它。
现在我真的很困惑......
EDIT 2
OK,我做了一些更多的测试ANS我想我可能已经找到了原因。当我试图断开蓝牙连接时,我发现它并未断开连接。所以然后我在旋转之前尝试断开连接,然后再次连接并工作。
所以我相信,当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通讯类接收(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;
}
}
};
如果我断开,每次屏幕被重新连接它的工作邮件处理程序旋转,但这会中断应用程序的数据记录功能的功能,所以我不想这样做...如果我锁定方向到风景,屏幕显然不会旋转并导致此问题,但如果手机睡觉时,当它以更多的肖像醒来时,它会旋转到风景模式,问题就会发生。
为了解决我的TextView(在ScrollView中)没有使用快速流式文本更新的问题,我尝试了其他所有在SO上讨论过的其他方法:(post)invalidate,requestLayout,runoOnGuiThread等。只有BroadcastReceiver工作。我也没有需要一个服务,只是一个简单的意图b'cast从线程告诉活动更新TextView。 – PVS 2013-05-24 15:36:01