我有一个加载屏幕,我想显示loadingMessage1 3秒而不是显示加载消息2.我只想加载消息2出现一次,但是当我尝试这样做时,加载消息2继续附加在一个无尽的循环。
所以我尝试在每个加载消息2追加后添加一个count变量,但它不起作用。哪里出错了,还有其他解决办法吗?
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++;
}
答案 0 :(得分: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 ...
}
请注意,显示消息的代码每封邮件只执行一次。
答案 1 :(得分: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
,因为它会创建一个无限循环。