我最近重構了一箇舊項目,發現某個特定部分不再想要正常運行,無論我做什麼。基本上,我有一個TextView的活動。該視圖以相同類中調用的線程的定時間隔更新。暫停通過Thread.sleep完成,Handler用於觸發UI的更新。事情是,現在我要麼得到一個CalledFromWrongThreadException,說我無法操作來自另一個線程的視圖,長時間的停頓,所有的文本立即觸及視圖,或者它看起來立即失效,根本沒有睡覺。我曾經這樣做過(包括相關部分):Android線程和處理程序不工作
public class Updated extends Activity implements Runnable {
private TextView textView;
private String text;
private Handler handle = new Handler(){
@Override
public void handleMessage(Message msg){
textView.append(text);
}
};
//onCreate and other such things...{
new Thread(this).start();
}
public void run(){
//A healthy chunk of logic/conditionals
text = "Blah blah";
handle.sendEmtpyMessage(0);
try {
Thread.sleep(1500l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
這就是我以前使用的,它工作得很好的要點。但是,我真的不喜歡設置類變量的做法,然後讓Handler稍後抓取它。我修改它來傳遞一個消息,將.obj字段設置爲一個字符串,然後將其剝離並附加到TextView。這會因上述例外而炸燬。我試着離開處理程序聲明,但將邏輯內部移動到另一個處理程序將.post(Runnable(){})的方法;有同樣的膽量,但是這隻會在經過很長時間的等待之後失速並追加它。我對Java/Android內部處理程序和線程的內部工作並不十分了解,所以任何指針都會非常受歡迎。
謝謝!這解決了異常,但我仍然有問題讓它暫停。我不想發送空的消息,但是會顯示一條附帶字符串的消息。這現在正在工作,但正如你所說,Thread.sleep不能按我的意願工作。有幾個循環中使用處理程序,它應該運行十幾次左右。我所得到的只是第一個字符串,然後它立即繼續運行,而該線程繼續在後臺運行,即使沒有任何事情可做。那或者它會把所有東西都轉儲並立即轉移。 – user1017413
啊,沒關係。我現在正在工作。我意識到我需要將運行最終檢查的方法放在run()方法而不是主線程中。 – user1017413