我对android编程很新,所以请原谅我的noobie-ness。我正在尝试创建一个非常简单的活动,它将在布局中间放置一个TextView,并让它每隔几秒切换到一个不同的文本。例如,TextView将显示“text1”,暂停几秒钟,然后说“text2,然后再次暂停。最后,我想添加更多文本并让它们一个接一个地循环。我知道这似乎是一个超级简单的事情,但我现在主要是试图了解线程和处理程序。无论如何,我已经读过我们应该如何保持UI线程中冗长的东西以防止错误,所以我想我会使用一个处理程序简单地在屏幕上切换2个文本。不幸的是,我无法让它工作。这是一些代码:
public class MainActivity extends Activity {
String[] myarray = {"text1" , "text2"};
int arraylength = myarray.length;
int count;
Handler handler = new Handler();
TextView mytexts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mytexts = (TextView)findViewById(R.id.my_texts);
mytexts.setText(myarray[0]);
Thread t = new Thread( new Runnable(){
public void run() {
for (int count = 0; count < arraylength; count++){
handler.postDelayed(new Runnable(){
public void run() {
mytexts.setText(myarray[1]);
}
}, 7000);
}
}
});
t.start();
}
}
从我在logcat中看到的,处理程序似乎一个接一个地运行postDelayed(在我的代码的情况下,它不等待7秒,postDelay做另一个postDelayed)。另外,我想在“mytexts.setText(myarray [1])中创建1;”与for循环中的“count”相同,因此它可以与数组中的某个字符串相同,但这会给我一个错误。我已经被困在这几个小时了,我在网上发现的其他例子似乎对像我这样的人来说太复杂了,他们主要想要在我能解决其他问题之前先掌握基础知识。任何这方面的任何帮助都将非常感激。谢谢。
答案 0 :(得分:19)
postDelayed
是非阻塞的,这意味着它会将它添加到队列中,我稍后会这样做。所以你可能看到的是所有文本更新在第7秒一起发生。我之所以这样说,是因为您postDelay
方法onCreate
,实际上您可能希望从onResume
甚至onPostResume
进行此操作。
此外,没有理由创建一个线程来将runnables添加到post队列。您的代码看起来应该更像这样: (注意延迟乘数的时间)
@Override
protected void onResume() {
super.onResume();
for (int count = 0; count < arraylength; count++){
handler.postDelayed(new Runnable(){
@Override
public void run() {
mytexts.setText(myarray[count]);
}
}, 7000 * (count + 1));
}
}
答案 1 :(得分:2)
这是因为你的循环设置所有处理程序在7秒后运行,而不是在7秒后运行,但是从现在起7秒后运行。您可以添加postDelayed
方法,也可以在处理程序中使用postAtTime
方法。
另外,你不需要在一个帖子中这样做,你可以完全摆脱它。