2012-03-02 53 views
2

我希望每5秒更新一次屏幕上的文本,我已經創建了一個定時器來完成這個任務。但是,在第一次更新之後,它不會再次更新該框。我假設我需要刷新視圖或什麼,但我現在肯定如何,任何想法?用動態文本更新用戶界面

public class HomeActivity extends Activity implements OnClickListener { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     textTitle = (TextView) findViewById(R.id.textTitle); 
     textArtist = (TextView) findViewById(R.id.textArtist); 
     timedMeta(); 
} 
static void timedMeta() 
{ 
    timer.scheduleAtFixedRate( 
     new TimerTask() { 
      public void run() { 
       try{  
        textTitle.setText(title); 
        textArtist.setText(artist); 
        } 
       Thread.sleep(UPDATE_INTERVAL); 
       catch (Exception e) 
       { 
       }, 
       DELAY_INTERVAL, 
       UPDATE_INTERVAL); 
      } 
     } 
    ) 
} 
+0

文本是否會每5秒更新一次應用程序的整個生命週期?或者只需5秒鐘一分鐘(例如)? – Rawr 2012-03-02 20:10:25

+0

首先刪除Thread.sleep,那麼它應該工作...不依賴於你如何設置標題和藝術家字段....編輯:是的,羅爾得到正確的這樣做每5秒會殺死電池 – Selvin 2012-03-02 20:12:15

回答

4

我會使用一個Handler。

private static final int WHAT = 1; 
private static final int TIME_TO_WAIT = 5000; 

Handler regularHandler = new Handler(new Handler.Callback() { 
    public boolean handleMessage(Message msg) { 
     // Do stuff 

     regularHandler.sendEmptyMessageDelayed(msg.what, TIME_TO_WAIT); 

     return true; 
    } 
}); 

regularHandler.sendEmptyMessageDelayed(WHAT, TIME_TO_WAIT); 

作爲一個例子,這將「每隔5000毫秒做一次」。您可以通過將WHAT作爲不同的整數傳入並處理handleMessage函數中的處理,來使處理程序對不同的事件作出反應。

編輯:我通常放置的常量和成員在類中的處理程序,並在對的onResume regularHandler.sendEmptyMessageDelayed(...)(){}

我還要把這個的onPause(){ }

regularHandler.removeMessages(WHAT) 

EDIT2:例:

public class HomeActivity extends Activity implements OnClickListener { 
    private static final int WHAT = 1; 
    private static final int TIME_TO_WAIT = 5000; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     textTitle = (TextView) findViewById(R.id.textTitle); 
     textArtist = (TextView) findViewById(R.id.textArtist); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     regularHandler.sendEmptyMessageDelayed(WHAT, TIME_TO_WAIT); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     regularHandler.removeMessages(WHAT); 
    } 

    Handler regularHandler = new Handler(new Handler.Callback() { 
     public boolean handleMessage(Message msg) { 
      // Do stuff 

      regularHandler.sendEmptyMessageDelayed(msg.what, TIME_TO_WAIT); 

      return true; 
     } 
    }); 
} 

你需要做的是在的onResume(),並在onPause(),因爲如果你不把它的onPause處理程序將繼續循環W¯¯你的活動不在前臺。當它回到前臺(因此onResume())時,你會希望循環再次啓用。

+0

你能舉一個小例子我如何將它與計時器整合在一起,它們幾乎相互衝突 – Brianjs 2012-03-02 20:05:31

+0

完全移除Timer,這就是Handler的用處。 – Knossos 2012-03-02 20:06:40

2

使用處理程序是一個很好的策略,但您並不需要自定義回調。相反,您可以使用postDelayedRunnable。有關實施的詳細信息,請參見此Android doc

2
runOnUiThread(new Runnable() { 
    public void run() { 
     textTitle.setText(title); 
    } 
}); 

您無法從後臺線程更新UI。每當你想修改UI時,建議使用UI線程