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