2012-11-25 33 views
0

我最近重構了一箇舊項目,發現某個特定部分不再想要正常運行,無論我做什麼。基本上,我有一個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內部處理程序和線程的內部工作並不十分了解,所以任何指針都會非常受歡迎。

回答

2

您正在靜態創建處理程序,它會在加載程序線程中創建它。在onCreate()中創建處理程序,並將其綁定到UI線程,並解決您的問題。此外,而不是Thread.sleep,每當你收到一條消息,你就可以做handler.sendEmptyMessageDelayed,併發送一個初始消息來解決問題。我認爲處理程序中的Thread.sleep可能會堵塞一個線程。

+0

謝謝!這解決了異常,但我仍然有問題讓它暫停。我不想發送空的消息,但是會顯示一條附帶字符串的消息。這現在正在工作,但正如你所說,Thread.sleep不能按我的意願工作。有幾個循環中使用處理程序,它應該運行十幾次左右。我所得到的只是第一個字符串,然後它立即繼續運行,而該線程繼續在後臺運行,即使沒有任何事情可做。那或者它會把所有東西都轉儲並立即轉移。 – user1017413

+0

啊,沒關係。我現在正在工作。我意識到我需要將運行最終檢查的方法放在run()方法而不是主線程中。 – user1017413