0

我有一个加载屏幕,我想显示 loadingMessage1 3 秒,而不是显示加载消息 2。我只希望加载消息 2 出现一次,但是当我尝试这样做时,加载消息 2 一直在无限循环中附加。

所以我尝试在每个加载消息 2 附加后增加一个计数变量,但它不起作用。我哪里出错了,还有其他解决方案吗?

final TextView loadingMessage1 = (TextView)this.findViewById(R.id.loadingMessage1);
int count = 0;
final Handler handler = new Handler();

if (count == 0){
    handler.post(new Runnable(){    
            @Override
            public void run(){
                loadingMessage1.append("Loading Message 2");
                handler.postDelayed(this, 3*1000L);
            }   
    }); 
    count++;
}
4

2 回答 2

1

您需要避免在每次执行后发布另一个事件。也许更像这样:

void showMessage1() {
    // ... code to show message 1 ...

    handler.postDelayed(new Runnable(){    
        @Override
        public void run(){
            showMessage2();
        }   
    }, 3*1000L); 
}

void showMessage2() {
    // ... code to show message 2 ... 
}

请注意,消息显示代码每条消息仅执行一次。

于 2012-07-30T13:56:27.537 回答
1

您在以下行中犯了一个错误:

handler.postDelayed(this, 3*1000L);

在这里,您Runnable在处理时将此对象发送给处理程序this。这意味着当您第一次执行时Runnable,最后您将它再次添加到处理程序的消息循环中。因此,您获得了一个无限循环。类似的东西会解决你的问题:

final TextView loadingMessage1 = (TextView)this.findViewById(R.id.loadingMessage1);
int count = 0;
final Handler handler = new Handler();

handler.postDelayed(new Runnable(){    
        @Override
        public void run(){
            loadingMessage1.append("Loading Message 2");
        }   
}, 3*1000L); 

编辑:

要使所有这些东西灵活,请执行以下操作:

// inner class
class TextChanger implements Runnable {
    private final String message;

    public TextChanger(String message) {
        this.message = message;
    }

    @Override
    public void run() {
        loadingMessage1.append(message);
    }

}

然后在你的代码中的某个地方:

public static final long TIME_CONSTANT = 3*1000L;

final TextView loadingMessage1 = (TextView)this.findViewById(R.id.loadingMessage1);
int count = 0;
final Handler handler = new Handler();

handler.postDelayed(new TextChanger("Whatever 1"), TIME_CONSTANT);
handler.postDelayed(new TextChanger("Whatever 2"), 2 * TIME_CONSTANT);

等等。诀窍是不要this像以前那样引用,因为它会创建一个无限循环。

于 2012-07-30T14:00:48.080 回答