1

TextView があり、アプリケーションの開始から終了まで、そのテキストを乱数で継続的に更新したいとしましょう。

そのようなタスクを実行する方法は何ですか? それは時間を計る必要がありますか?(つまり、1 秒に 1 回更新するなど) Android には UI スレッドが 1 つしかなく、そのようなステートメントはそれを永久にブロックするため、while(true) を含むステートメントは使用できません。

編集:迅速かつ正確な回答をありがとう。答えを見て少し考えた後、これを達成するためのトリッキーな方法を思いつきました。そのような技術の欠点はありますか?

    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

いつ、なぜ、何をしているのかを正確に知らなくても、Handlerを で使用したいと思うでしょうpostAtTime()ドキュメントのこの部分では、必要なものに応じてこれらを処理する方法について詳しく説明します

于 2013-03-21T22:51:01.260 に答える
0

自己再起動CountDownTimerを使用したこの例のアプローチで十分です。これは最善のアプローチではないかもしれませんが、うまくいきます

     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 に答える
0

最良の方法は、タイマーでハンドラーを使用することだと思います。ただし、1 つまたは他のアクティビティを実行しているときに、ランナーを殺したり終了したりしないように注意してください。

例えば:

   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 に答える