处理程序/可运行程序不与循环一起使用

发布于 2024-11-29 05:49:38 字数 548 浏览 0 评论 0原文

我试图让我的 TextView 在单独的线程中更新,这样它就不会减慢我的 UI 速度。它有效,但是当我添加 while 循环来控制它时,它会将程序挂在黑屏中。

代码:

handler.post(new Runnable(){
           @Override
            public void run() {

            while(media[6].isPlaying()) {

            TextView myText = (TextView)findViewById(R.id.timerT);   

            myText.setText(getTimeString(media[1].getCurrentPosition()));        


            handler.postDelayed(this,10);
                                        }
        }

    });

我认为可运行创建了一个新线程,这意味着这不会发生?或者我错了?

I am trying to get my TextView to update in a separate thread so that it doesn't slow down my UI. It works, but when I add in a while loop to control it, it hangs the program in a black screen.

Code:

handler.post(new Runnable(){
           @Override
            public void run() {

            while(media[6].isPlaying()) {

            TextView myText = (TextView)findViewById(R.id.timerT);   

            myText.setText(getTimeString(media[1].getCurrentPosition()));        


            handler.postDelayed(this,10);
                                        }
        }

    });

I thought that the runnable creates a new thread, meaning that this wouldn't happen? Or am I going badly wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜无邪 2024-12-06 05:49:38

使用 CountDownTimer 类,如下所示:

// Function arguments are in milliseconds. 
CountDownTimer timer = new CountDownTimer(6000, 1000) {

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

        // Do your stuff here.

        TextView myText = (TextView)findViewById(R.id.timerT);

        myText.setText(getTimeString(media[1].getCurrentPosition()));
    }

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

timer.start();

Use CountDownTimer class like below:

// Function arguments are in milliseconds. 
CountDownTimer timer = new CountDownTimer(6000, 1000) {

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

        // Do your stuff here.

        TextView myText = (TextView)findViewById(R.id.timerT);

        myText.setText(getTimeString(media[1].getCurrentPosition()));
    }

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

timer.start();
九八野马 2024-12-06 05:49:38

你的黑屏是因为你在事件调度线程上运行任意持续时间的 while 循环:永远不要这样做。对于此类事情,您需要使用 AsyncTask 或在单独的线程中启动 Runnable,然后使用 View.post 仅发送计时器更新。

Your black screen is because you are running an arbitrary duration while loop on the event dispatch thread: never do this. For something of this sort you want to use AsyncTask or start your Runnable in a separate thread and then use View.post to send the timer updates only.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文