-2

我可以使用线程来增加计数器并将其显示在 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),问题仍然存在。

4

2 回答 2

2

首先,您永远不想让 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();

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

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

编辑:为了让您更好地理解为什么您的代码不起作用,您在 TextView 上设置了一些值,并且在您将 UIThread 设置为睡眠后,UIThread 立即阻止而不是给它时间来完成更新图形,在他完成睡眠后您设置新的价值,他从来没有更新前一个,所以最后你只看到最后一个。

希望这对您有所帮助并享受您的工作。

于 2013-09-07T12:48:46.320 回答
0

您可以使用CountDownTimer, 并在方法中更新您的 UI onTick()(此方法在 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();
于 2013-09-07T13:13:34.317 回答