在android中暂停处理程序和postDelayed

时间:2013-08-15 06:09:31

标签: android multithreading handler postdelayed

我对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”相同,因此它可以与数组中的某个字符串相同,但这会给我一个错误。我已经被困在这几个小时了,我在网上发现的其他例子似乎对像我这样的人来说太复杂了,他们主要想要在我能解决其他问题之前先掌握基础知识。任何这方面的任何帮助都将非常感激。谢谢。

2 个答案:

答案 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方法。

另外,你不需要在一个帖子中这样做,你可以完全摆脱它。

相关问题