如何在Android UI中显示计数器

时间:2013-09-07 12:26:36

标签: android multithreading

我可以使用线程来增加计数器并将其显示在Android活动的框架中。

Public class MainActivity extendsActivity {
        TextView counter;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            counter = (TextView) findViewById(R.id.TV_counter);
            Thread t = new Thread() {
                public void run() {
                    runOnUiThread(new Runnable() {
                        public void run() {
                            for (int i = 0; i < 5; i++) {
                                try {
                                    counter.setText("" + i);
                                    System.out.println("Value of i= " + i);
                                    sleep(100);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                }
            };
            t.start();
        }
    }

我编写了这段代码,但它在控制台中正常运行,但是文本视图在终端中显示i=4,我修改了睡眠时间(3000)并且问题仍然存在。

2 个答案:

答案 0 :(得分:1)

首先,您不希望将睡眠置于UI线程中,导致无响应的用户界面,这永远不会好。您应该只使用它来更新您的图形。尝试用此

替换您的代码
  Thread t = new Thread() {
        public void run() {             
            for (int i = 0; i < 5; i++) {                   
                try {
                    final int a = i;
                    runOnUiThread(new Runnable() {
                        public void run() {                        
                            counter.setText("" + a);                            
                        }                       
                    });
                    System.out.println("Value of i= " + i);
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    t.start();

你会注意到睡眠和for循环在UIThread和你的第一个线程之外,所以基本上所有的数学都在外面完成,你只需显示结果。

这只是对您的代码的更正和进一步思考的建议

编辑:为了让你更好地理解你的代码无法正常工作,你在TextView上设置了一些值,并在你将UIThread设置为睡眠后立即使用UIThread阻止而不是花时间完成更新图形,睡觉你设置新值,他永远不会更新前一个,所以最后你只看到最后一个。

希望这有助于并享受您的工作。

答案 1 :(得分:0)

您可以使用CountDownTimer,并在onTick()方法中更新您的UI(此方法在UI线程上执行):

int i=0;
        CountDownTimer timer = new CountDownTimer(5000,1000) {

            @Override
            public void onTick(long millisUntilFinished) {
                // this method will be executed every second ( 1000 ms : the second parameter in the CountDownTimer constructor)
                i++;
                txt.setText(i);

            }

            @Override
            public void onFinish() {
                // TODO Auto-generated method stub

            }
        };
        timer.start();