Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中实现一个简单的循环_Java_Android_Loops - Fatal编程技术网

Java 在Android中实现一个简单的循环

Java 在Android中实现一个简单的循环,java,android,loops,Java,Android,Loops,因此,我来自java世界,通常当我想要循环时,我可以使用如下内容: while(true) { //code here till false } 但在Android中,我注意到这种循环,至少在我的onCreate()方法中,会导致应用程序无法运行。我想使用的循环非常短,并调用一些简单的UI更新(更改背景颜色) 如何在Android中实现调用UI更改的循环?我把这个环放在哪里?(显然不是onCreate)示例/示例代码将不胜感激。您可能需要重新思考您的设计。您不希望像在活动的onCrea

因此,我来自java世界,通常当我想要循环时,我可以使用如下内容:

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


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

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

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

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

您可能已经知道这一点,但是如果您使用
while(true)
循环,您还应该在其中包含
线程.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()
在活动中,您可以访问以下必要的项目:

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()

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

您可能已经知道这一点,但是如果您使用
while(true)
循环,您还应该在其中包含
线程.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()
在活动中,您可以访问以下必要的项目:

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()

您还可以尝试寻找一个已经存在的可以重写/扩展的方法,比如onDraw或onLayout。有关更多参考信息,请参阅文档。

您还可以尝试寻找一种可以覆盖/扩展的现有方法,如onDraw或onLayout。更多参考请参阅文档。

我建议使用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();
可能有助于:


希望这有帮助。干杯

我建议使用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();
可能有助于:


希望这有帮助。干杯

您是否需要定期对UI进行更改?如果您在幕后进行GUI工作,您是否看过Fragment类?即使在幕后,我也不想让它开始一个循环,改变背景颜色,然后直到布尔值为false才停止。你需要定期更改UI吗?如果你在幕后做GUI工作,你有没有看过Fragment类?即使不是在幕后,我只是希望它开始一个循环,改变背景颜色,然后直到布尔值为false时才停止