2012-03-15 39 views
0

我想安排一個任務來每秒更新一次TextView。只要我有線,並且在評論之後,註釋掉了,一切正常。 logcat的顯示成才,如:計劃的定期任務在第二次凍結TextView.setText()

Task 
IN 
OUT 
Task 
IN 
OUT 
... 

但是,如果我去掉了statusLabel.setText(),這是我所看到的:

Task 
IN 
OUT 
TASK 
IN 

這五個行是我得到的。出於某種原因,它似乎停止了,當它試圖再次設置文本時。


我的代碼:

public class MyActivity extends Activity { 

    TextView statusLabel; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.control); 
     statusLabel = (TextView) findViewById(R.id.statusLabel); 

     ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
     scheduler.scheduleAtFixedRate(
       new Runnable() { 
        public void run() { 
         Log.d("Datalogger","Task"); 
         updateStatus(); 
        } 
       }, 0, 1, TimeUnit.SECONDS); 
    } 

    private void updateStatus() { 
     Log.d("Datalogger","IN"); 
     statusLabel.setText("X"); // !! If I comment out this line, 
     Log.d("Datalogger","OUT"); // everything works 
    } 
} 

回答

2

問題是您正嘗試從UI(主)線程以外的線程更新UI。在runnable中,使用runOnThread(Runnable action)和一個新的runnable來調用updateStatus()。

1

您無法更新從後臺線程的用戶界面。在你的日誌中甚至應該有一個錯誤。使用Activity#runOnUiThread(Runnable)

+0

我想這裏可能有錯誤...因爲日誌充滿了不必要的東西,我過濾了除了我自己的消息外的所有東西:)我想我應該去睡覺了...... – varesa 2012-03-15 22:07:09