0
protected void onCreate(Bundle savedInstanceState) {
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.queue);
    overridePendingTransition(0,0);

    final TextView encounter = (TextView) findViewById(R.id.output);
    Button b1 = (Button) findViewById(R.id.start);

    int counterA = 100;
    int counterB = 100;

    encounter.setText("Counter A : " + Integer.toString(counterA) + "\nCounter B : " + Integer.toString(counterB));

    b1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

        }
    });
}

嗨,我或多或少是 android 新手。我正在尝试使用 2 个计数器和一个 textView 运行一个小模拟,其中显示了计数器的当前值。

现在,当我按下一个按钮时,我想在计数器 A 和计数器 B 上交替将值减小 10,直到一个达到 0,并且在每次减小之间我想等待 1 秒并使用新值更新 textView。

我用线程尝试了一些东西,但我得到的只是值减少了,但是 textView 直到最后才更新(当一个命中 0 时)。

有人可以帮助我吗?

4

4 回答 4

1

使用处理程序。

     Handler m_handler;
     Runnable m_handlerTask ;
     TextView encounter;
     int countA=100,countB=100;  

在你的 onCreate

     encounter = (TextView) findViewById(R.id.output);
     m_handler = new Handler();  

点击按钮

     m_handlerTask = new Runnable()
     {
         @Override 
         public void run() { 
            if(countA>=0 && countB>=0)
            {     
            encounter.setText("Count A ="+countA+" "+"Count B ="+countB);
            countA=countA-10;
            countB=countB-10;
            }
            else
            {
                m_handler.removeCallbacks(m_handlerTask);
            } 
              m_handler.postDelayed(m_handlerTask, 1000);    

         }
    };
    m_handlerTask.run(); 
于 2013-06-13T11:24:05.027 回答
1

使用 AsyncTask 类代替传统的线程和可以刷新 UI的方法onProgressUpdate (在 UI 线程中调用)。

注意:必须将 AsyncTask 子类化才能使用。

使用publishProgressinsidedoInBackground触发onProgressUpdate

publishProgress(counter1, counte2);

然后定义 onProgressUpdate 必须做什么:

protected void onProgressUpdate(Integer... counters) {
    // Update UI using counters[0] and counters[1] // Update the TextView
}
于 2013-06-13T11:24:06.093 回答
0

您可以使用CountDownTimer类。

这是一个例子:

new CountDownTimer(30000, 1000) {

             public void onTick(long millisUntilFinished) {
                 tv.setText("seconds remaining: " + millisUntilFinished / 1000);
             }

             public void onFinish() {
                 tv.setText("done!");
             }
          }.start();

这是构造函数的参数:

start()30000 - 从调用到倒计时完成并被调用的未来毫秒数onFinish()
1000 - 沿途接收onTick(long)回调的间隔。

于 2013-06-13T11:23:55.033 回答
0

我没有对此进行测试,但它应该可以工作,布尔值将计数器更改为减少,处理程序使其休眠 1000 毫秒。

protected void onCreate(Bundle savedInstanceState) {
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.queue);
    overridePendingTransition(0,0);

    final TextView encounter = (TextView) findViewById(R.id.output);
    Button b1 = (Button) findViewById(R.id.start);

    int counterA = 100;
    int counterB = 100;
    boolean countera=true;


    encounter.setText("Counter A : " + Integer.toString(counterA) + "\nCounter B : " + 

    Integer.toString(counterB));
    b1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
      //switch counters
         if(countera){
          countera=false;
          countera-=10;
        }else{
          counterb-=10;
          coutnera=true;
         }
        }
  Handler h = new Handler(); 
  h.postDelayed(new Runnable() { 
     public void run() { 
          encounter.setText("Counter A : " + Integer.toString(counterA) + "\nCounter B  : " + Integer.toString(counterB));
     } 
}, 1000); 
    });
}
于 2013-06-13T11:38:18.440 回答