我的应用程序每秒钟从BlueTooth设备接收4次数据,解析它然后将其显示在屏幕上。一切正常,直到屏幕方向改变,然后textViews恢复到我的onCreate中设置的默认值,并且不会从那里改变。
我仍然从蓝牙线程接收来自我的消息处理程序的数据,并且解析工作正常,但我的updateUI()方法什么都不做。 updateUI()中的所有内容都是将TextView的文本设置为值,如tv_text.setText(doubleValue);.再次,这在屏幕旋转或睡眠之前工作正常。
当屏幕旋转时,视图ID是否会改变,因此我的TextView是错误的?我该如何解决这个问题?我看到其他人遇到TextView丢失数据的问题,但我不确定这是否是同样的问题,因为我无法在轮换后再次设置文本。
感谢。
编辑:我发现了一些奇怪的行为。如果在连接到BT设备之前旋转屏幕,则在连接时它将起作用。但是当我再次旋转时它会停止。
旋转时,文本视图显示连接前最后分配给它的值。例如,如果执行tv.setText(“10”),它将显示10.然后我连接,并使用正确的值更新。然后我旋转,它回到显示10 ...
我唯一一次在updateUI()代码中设置文本值,并在收到并解析消息后调用。
现在我真的很困惑......
编辑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;
}
}
};
如果我每次旋转屏幕时都断开连接并重新连接,它会起作用,但这会中断应用程序数据记录功能的功能,所以我不想这样做...如果我将方向锁定到横向,屏幕显然不会旋转并导致此问题,但如果手机睡眠,当它以更多的肖像醒来时,它会旋转到横向模式,然后问题就出现了。
答案 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)
这样您就不会静态保留引用。
没有看到你的代码;特别是你的活动生命周期功能这是在黑暗中刺伤。
编辑: 您可以尝试使处理程序和蓝牙对象保持静态,这样它们将在类的实例之间共享......但是,我建议您查看蓝牙连接的服务实现。