所以我来自java世界,通常当我想循环时,我可以使用类似的东西:
while(true) {
//code here till false
}
但在Android中我注意到这种循环,至少在我的onCreate()
方法中导致应用程序无法运行。我想要使用的循环非常简短,并调用一些简单的UI更新(更改背景颜色)。
如何在Android中实现调用UI更改的循环?我在哪里放这个循环? (显然不是onCreate
)非常感谢示例/示例代码。
答案 0 :(得分:2)
您可能想重新考虑您的设计。您不希望像活动的onCreate()
方法那样执行阻塞循环。您正在阻止任何UI更新,最终可能只是挂起您的应用程序。您可能希望将循环移动到AsyncTask
。
答案 1 :(得分:2)
平均来说,这个循环执行了多少次?如果它是用于持续监视某些内容的循环,那么您应该使用新线程来执行此操作。您可以使用单例并同步访问几个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 :(得分:0)
您也可以尝试查找可以覆盖/扩展的现有方法,例如onDraw或onLayout。有关详细参考,请参阅View文档。
答案 3 :(得分:0)
我建议使用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
希望这有帮助。干杯!!!