【问题标题】:Implementing a simple loop in Android在 Android 中实现一个简单的循环
【发布时间】:2011-06-07 17:35:02
【问题描述】:

所以我来自 java 世界,通常当我想循环时,我可以使用类似的东西:

while(true) {
    //code here till false
}

但在 Android 中,我注意到这种循环,至少在我的 onCreate() 方法中会导致应用程序无法运行。我要使用的循环非常短,并且会调用一些简单的 UI 更新(更改背景颜色)。

如何在 Android 中实现调用 UI 更改的循环?我把这个循环放在哪里? (显然不是onCreate)示例/示例代码将不胜感激。

【问题讨论】:

  • 是否需要定期更改 UI?
  • 如果你在幕后做 GUI 的事情,你有没有看过 Fragment 类? developer.android.com/reference/android/app/Fragment.html
  • 甚至不在幕后,我只是希望它启动一个改变背景颜色的循环,然后直到布尔值为 false 才停止

标签: java android loops


【解决方案1】:

平均而言,此循环执行多少次?如果它是一个用于持续监视某事的循环,您可能应该使用一个新线程来执行此操作。您可以使用单例并同步访问几个 getter/setter 来来回传递数据。

您可能已经知道这一点,但如果您使用while(true) 循环,您还应该在其中有一个Thread.sleep(...),以免锁定CPU。

你可以这样做:

public class SingletonClass implements Runnable {

    private boolean someValue;

    public static final SingletonClass INSTANCE = new Test();

    private Test() {
      Thread t = new Thread(this);
      t.setDaemon(true);
      t.start();
    }

    public synchronized boolean getValue() {
      return someValue;
    }

    public synchronized void setValue(boolean value) {
      someValue = value;
    }

    @Override
    public void run() {
      while (true) {
        // ... do your work here...

        // Monitor something and set values
        setValue(true);

        Thread.sleep(500);
    }
  }
}

在您的活动中,您可以像这样访问必要的项目:

SingletonClass.INSTANCE.getValue()

【讨论】:

    【解决方案2】:

    您可能需要重新考虑您的设计。您不想在活动的onCreate() 方法中执行这样的阻塞循环。您正在阻止任何 UI 更新,最终可能只是挂起您的应用程序。您可能希望将循环移动到 AsyncTask

    【讨论】:

      【解决方案3】:

      您也可以尝试寻找可以覆盖/扩展的现有方法,例如 onDraw 或 onLayout。请参阅View 文档以获取更多参考。

      【讨论】:

        【解决方案4】:

        我会推荐使用 Handler 和 Runnable。

        private Handler mHandler = new Handler();
        private boolean isDone = false;
        private Runnable indefinateTask = new Runnable() {
        @Override
        public void run() {
            if(isDone){
                mHandler.removeCallbacks(this);
            } else {
                //Perform Your Operation Over Here
                mHandler.postDelayed(indefinateTask, 1);
            }
        
        
        }
        

        };

        并在 onCreate 调用中

        new Thread(indefinateTask).start();
        

        可能会有所帮助: http://developer.android.com/resources/articles/painless-threading.html

        希望对您有所帮助。干杯!!!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-31
          • 1970-01-01
          • 2013-10-12
          • 2011-09-19
          • 1970-01-01
          • 1970-01-01
          • 2021-12-23
          相关资源
          最近更新 更多