10

我对android编程很陌生,所以请原谅我的菜鸟。我正在尝试创建一个非常简单的活动,它将在布局中间有一个 TextView,并且每隔几秒钟让它切换到不同的文本。例如,TextView 会说“text1”,暂停几秒钟,然后说“text2”,然后再次暂停。最终,我想添加更多文本并让它们一个接一个地循环。我知道这看起来像一个超级简单的事情,但我现在主要是想了解线程和处理程序。无论如何,我已经阅读了我们应该如何在 UI 线程上保留冗长的内容以防止错误,所以我想我会使用处理程序简单地在屏幕上的两个文本之间切换。不幸的是,我无法让它工作。这是一些代码:

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”相同,因此它可以与数组中的字符串之一相同,但这会给我一个错误。我已经坚持了好几个小时,而且我在网上找到的其他示例对于像我这样主要想在处理其他事情之前先了解基础知识的人来说似乎太复杂了。任何有关这方面的任何帮助都将不胜感激。谢谢你。

4

2 回答 2

19

postDelayed是非阻塞的,这意味着它会将其添加到我稍后会执行此操作的队列中。因此,您可能看到的是所有文本更新都在第 7 秒同时发生。我这样说是因为你是postDelayonCreate方法中学习的,而实际上你可能想要从onResume或者甚至是onPostResume

此外,没有理由创建一个线程来将可运行对象添加到发布队列。您的代码应该看起来更像这样:(注意延迟乘数的时间)

@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));
    }
}
于 2013-08-15T06:17:34.083 回答
2

这是因为您的循环将所有处理程序设置为在 7 秒后运行,而不是在 7 秒后运行,而是在 7 秒后运行。您可以添加postDelayed方法或使用postAtTimehandler 中的方法。

此外,您不需要在线程中执行此操作,您可以完全摆脱它。

于 2013-08-15T06:14:44.527 回答