在安卓中实现while循环

12

我看不懂在Android中while循环的实现。

每当我在onCreate()包中实现一个while循环时(如下所示的代码),

public void onCreate(Bundle icicle) {       
  super.onCreate(icicle);
  setContentView(R.layout.main);
  TextView=(TextView)findViewById(R.id.TextView);
  while (testByte == 0)
      updateAuto(); 
}

电脑没有启动,程序过了一会儿就进入了“挂起”状态,但我不知道为什么。Testbyte如下:

byte testByte == 0;

updateAuto() 应该每秒更新一次代码并显示在 textView 部分。我一直在使用下面所示的 setText 在 updateAuto() 中,一切正常工作,但是一旦我实现 while 循环,我只看到一个黑屏幕,然后在几秒钟后由于 "未响应" 而出现强制关闭选项。

TextView.setText(updateWords);

我已经将它更改为按钮格式(这意味着现在必须点击该按钮才能更新),但我希望它能自动更新,而不是手动点击。

我是否以错误的方式实现了while循环?

我还尝试将while循环调用到另一个函数中,但仍然得到了一片黑色无物的屏幕。

我一直在阅读关于Handler服务的内容...它是做什么的? Handler服务能否以更安全或更高效的方式更新我的TextView

非常感谢,如果有人能给我指点一下该怎么做。


  1. 代码不是 byte testByte == 0; 否则它将无法编译。
  2. 您从未更新 testByte 的值,那么您为什么期望循环会结束呢?
- Kirk Woll
实际上应该是testByte = 0; 这意味着您想将值0赋给变量testByte。在您的示例中所做的是测试相等性(byte testByte == 0;),显然此语句评估为true,因此您的while循环将始终为true,因此您将被困在无限循环中。 - tdavisjr
是的,我以为那样做会起作用。但现在我知道我需要创建另一个线程来单独处理它,以免陷入无限循环。 - Kyle Yeo
2个回答

36

做好准备,认真跟随,这对开发人员来说是非常宝贵的。

while循环确实应该只在单独的线程中实现。单独的线程就像在您的应用程序中运行的第二个进程。之所以强制关闭是因为您在UI线程中运行了循环,使UI无法执行除了通过该循环的任何操作之外的任何操作。您必须将该循环放入第二个线程中,以便UI线程可以自由运行。在线程处理时,除非在UI线程中,否则不能更新GUI。在这种情况下,以下是如何完成的:

首先,您创建一个Runnable,其中包含在其run方法中循环的代码。在该Runnable中,您必须创建一个第二个Runnable,用于发布到UI线程。例如:

 TextView myTextView = (TextView) findViewById(R.id.myTextView); //grab your tv
 Runnable myRunnable = new Runnable() {
      @Override
      public void run() {
           while (testByte == 0) {
                Thread.sleep(1000); // Waits for 1 second (1000 milliseconds)
                String updateWords = updateAuto(); // make updateAuto() return a string
                myTextView.post(new Runnable() { 
                     @Override
                     public void run() {
                          myTextView.setText(updateWords);
                     });
           }
      }
 };

接下来,只需使用Runnable创建您的线程并启动它。

 Thread myThread = new Thread(myRunnable);
 myThread.start();

你现在应该看到你的应用程序循环而没有强制关闭。


谢谢!我无法想象如何感谢你,我以为我永远无法解决这个错误,但是你详细的解释让像我这样的初学者也能够理解。再次感谢!:D - Kyle Yeo
4
很高兴为您服务。当您成为专家时,请务必分享知识。 :D - Zaid Daghestani
如果你正在处理小于毫秒级别的数据,那么使用thread.sleep和try catch会严重拖慢进程。 - smoothumut
1
@smoothumut 你应该看看线程池。创建线程的成本很高,而Runnable的成本相对较低。线程池允许你创建线程池并提交尽可能多的Runnables。这应该可以解决你的性能问题。 - Zaid Daghestani

1
你可以为while循环创建一个新的Thread
这段代码将创建一个新的线程,等待布尔值改变其状态。
private volatile boolean isClickable = false;

new Thread() {
    @Override
    public void run() {
        super.run();
        while (!isClickable) {
            // boolean is still false, thread is still running
        }
        // do your stuff here after the loop is finished
    }
}.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接