UI线程是块,秒表工具

时间:2014-02-06 21:40:29

标签: android multithreading

我试着在我的Android应用程序中停止观看。

当我使用此代码时,我的UI线程被阻止(app isforzen)

我无法弄清楚为什么因为我的Log调用检查线程睡眠是好的。

这是我的代码,感谢您的帮助。

public void startStopWatch()
    {
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
            while(stopThread == false)  
            {   

            try {
                Thread.sleep(1000);
                Log.i("sleep", "sleep");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            workoutTime++;

            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    workoutTimeText.setText(getResources().getString(R.string.starting_wrokout_time) + getWorkoutTime());
                }
            });

            }
            }
        }).run();

    }

修改

我这样解决了:

public void stopWatchTest()
    {
        Handler handler = new Handler();

        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                workoutTime++;

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        workoutTimeText.setText(getResources().getString(R.string.starting_wrokout_time) + getWorkoutTime());

                        stopWatchTest();
                    }
                });
            }
        }, 1000);

    }

2 个答案:

答案 0 :(得分:2)

你应该调用.start()方法。

当你直接调用.run()方法时,你在调用线程而不是你正在创建的新线程中运行它。

也就是说,创建一个线程并让它睡眠可能不是实现目标的最佳方法。

答案 1 :(得分:0)

通常,人们会做类似的事情:

public void startStopWatch() {
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (!stopThread) {
                handler.postDelayed(this, 1000);
            }
            workoutTime++;
            workoutTimeText.setText(getResources().getString(R.string.starting_wrokout_time) + getWorkoutTime());
        }
    }, 1000);
}

由于发布到处理程序可能会有一些偏差,因此有一些方法可以确保您在合适的时间发布。