在Android中连续运行处理程序任务

3

目前我在处理我的Android应用程序时遇到了问题。

为了解释:

首先,我想逐个字符地在TextView中显示文本。这是我当前的代码:

tvIntro.setText("");
        final Handler textHandler = new Handler();

        for(int i=0; i<intro.length();i++){

            final int finalCount = i;
            textHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    tvIntro.setText(tvIntro.getText() + (intro.charAt(finalCount)+""));
                }
            }, 150 * i);

        }

在整个文本显示完毕后,我希望播放声音并持续5秒钟改变屏幕的颜色。为此,我的代码如下:

myBackground.setBackgroundColor(Color.RED);// set initial colour
        final Thread blink =  new Thread(new Runnable() {
            public void run() {
                while (getRunning()) {
                    try {
                        Thread.sleep(100);
                        if(start[0] !=1){
                            mp.start();
                            start[0] = 1;

                        }


                    }
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    updateColor(myBackground);
                    whichColor = !whichColor;
                }
            }
        });

private void updateColor(final RelativeLayout myBackground) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (whichColor)
                myBackground.setBackgroundColor(Color.RED);
            else
                myBackground.setBackgroundColor(Color.GREEN);
        }
    });
}

所有功能都在工作,但我想在执行第二个处理程序之前完成第一个处理程序。此外,第二个处理程序应该在x秒后停止。

我有一些问题不理解处理程序和线程的工作原理。如果你们中的某个人有解决方案,那就太好了。


如果你想结束一个处理程序,将其设置为null,例如:"textHandler = null;",否则它会一直存在,直到其活动被结束。 - ThaiPD
1个回答

1
为了延迟任务的执行直到指定的线程(或线程)完成,将此行添加到您希望等待的线程之后:
myThread.join();

并且紧接着它完成后立即跟随你想要运行的代码。
对于您的第二个问题,您可以设置一个变量为等待线程结束前的时间值(以毫秒为单位),然后每次代码运行时将该值减少100(或任何您选择告诉它休眠的数量)。检查该值是否小于或等于零,如果该条件返回true,则使用中断结束线程。所以基本上是这样的:
long timeToRun = 5000, sleepTime = 100;

// Your code here...

Thread.sleep(sleepTime);
timeToRun -= sleepTime;
if(timeToRun <= 0) {
myThread.interrupt();
}

可能有更优雅的方法来实现这一点,但至少这应该解决了你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接