1

假设我有一个 TextView 并且我想用随机数连续更新它的文本,从应用程序开始到它终止。

执行此类任务的方法是什么?一定要定时吗?(即每秒更新一次等)不能使用带有while(true) 的语句,因为android 中只有一个UI 线程,而这样的语句会永远阻塞它。

编辑:感谢您提供快速准确的答案。在看到答案并稍微思考之后,我想出了一个棘手的方法来实现这一点。这种技术有什么缺点吗?

    TextView tv;
Handler myHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);     
    tv=(TextView) findViewById(R.id.textView1);     
    myHandler=new Handler();
    myHandler.post(new Nani());
}

    private class Nani implements Runnable{
    int i=0;
    @Override
    public void run() {
        tv.setText(Integer.toString(i));
        myHandler.post(this);
        i++;
    }       
}

简单地说,Runnable 自己排队..

4

4 回答 4

2

在不知道更多关于你到底在做什么的情况下,例如何时或为什么,你会想要使用HandlerpostAtTime(). 文档的这一部分更多地讨论了如何根据您的需要处理这些事情

于 2013-03-21T22:51:01.260 回答
1

这可以通过使用 Looper 类来实现:http: //developer.android.com/reference/android/os/Looper.html

一个很好的使用教程,可以在这里找到:http: //pierrchen.blogspot.dk/2011/10/thread-looper-and-handler.html

于 2013-03-21T22:52:33.367 回答
0

我认为最好的方法是使用带有计时器的处理程序。但请确保您在进行一项或其他活动时不得杀死或终止跑步者

例如:

   private void timer() {
      mRunnable = new HandlerManger();
      mHandler = new Handler();
      mHandler.postDelayed(mRunnable, 1000*10);
   }

可运行的

 private class HandlerManger implements Runnable {

      @Override
      public void run() {
        // your business logic method here;
      }
   }

活动

 private Handler mHandler;
   private Runnable mRunnable;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.act...);
      timer();
   }
于 2013-03-21T22:49:49.040 回答
0

This example approach with self-restarting CountDownTimer would do. Though this might be not the best approach, it will work

     public class CountDown extends Activity {

      TextView tv; 

       /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

       tv = new TextView(this);
       this.setContentView(tv);

      //5000 is the starting number (in milliseconds)
      //1000 is the number to count down each time (in milliseconds)
      MyCount counter = new MyCount(5000,1000);

      counter.start();

         }

         public class MyCount extends CountDownTimer{

      public MyCount(long millisInFuture, long countDownInterval) {
         super(millisInFuture, countDownInterval);
         }

          @Override
         public void onFinish() {
         this.start();
         }

       @Override
        public void onTick(long millisUntilFinished) {
       tv.setText("your values here");

      }

     }
    }
于 2013-03-21T22:53:41.753 回答