2014-12-03 64 views
1

我想使用CountDownTimer從後臺線程更新UI線程中的文本,只計算剩餘時間。從Android中的後臺線程使用CountDownTimer

我子類一個線程,並在其構造函數傳遞的主線程處理程序,並創造了run方法新CountDownTimer到如下更新主UI線程文本視圖:

class MyCounter extends Thread 
{ 
    private Handler uiHandler; 
    private long timeToCount; 

    public MyCounter(Handler handler, long time) 
    { 
    this.uiHandler = handler; 
    this.timeToCount = time; 
    } 

public void run() 
{ 
    new CountDownTimer(timeToCount, 1000){ 
     public void onTick(long millisUntilFinished) { 
      Message msg = Message.obtain(); 
      String timeString = //....here I conver millisUntilFinished to String format 
      msg.obj = timeString; 
      uiHandler.sendMessage(msg); 
     } 

     .... //Other method of CountDownTimer 
    }.start(); 
    } //end of run 
} //end of thread class 

創建MyCounter線程,並呼籲開始我的活動UI(主線程)傳遞在主線程中創建的處理程序。在我的主要活動中調用start後,似乎CountDownTimer沒有被調用。

任何想法?

回答

3

我覺得序更新一個TextView在活動ü必須使用runOnUiThread 如:

 runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 


        textview1.setText(content); 

     }); 
0

我相信這個典型案例,即用固定的間隔運行的東西,定時器是比較合適的。下面是一個簡單的例子:

myTimer = new Timer(); 
myTimer.schedule(new TimerTask() {   
@Override 
public void run() { 
     // If you want to modify a view in your Activity 
     MyActivity.this.runOnUiThread(new Runnable() 
     public void run(){ 
       tv.append("Hello World"); 
     } 
     ); 
} 
}, 1000, 1000); // initial delay 1 second, interval 1 second 

使用定時器有幾個優點:初始延遲和間隔可以在日程安排功能參數易於確定 定時器可以通過簡單地調用myTimer.cancel() 如果您停止想只有一個線程在運行,記得打電話myTimer.cancel()安排一個新的(如果myTimer不爲null)之前

0
new CountDownTimer(timeToCount, 1000){ 
    public void onTick(long millisUntilFinished) { 
    runOnUiThread(new Runnable() { 

     public void run() 
    { 
     Message msg = Message.obtain(); 
     String timeString = //....here I conver millisUntilFinished to String format 
     msg.obj = timeString; 
     uiHandler.sendMessage(msg); 
    } 
    }); 
    } 
    }.start(); 
-1

OK找到了我的錯誤。在我的CountDownTimer上調用啓動方法後,我忘記添加Looper.loop()