我的應用程序每秒從藍牙設備接收數據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