我在项目中面临一个非常愚蠢的问题而无法解决问题。我正在使用AsyncTask来获取用户的当前位置。在那我用一个计数器作为计时器。在doInBackground中我正在递增该计数器,如果它大于x值,那么我取消异步任务。
以下是代码段: -
class CurrentPositionTask extends AsyncTask<String, Void, Void> {
long counter = 0;
boolean flag = true;
@Override
public void onPreExecute() {
// TODO Auto-generated method stub
}
@Override
public Void doInBackground(String... params) {
// TODO Auto-generated method stub
do {
counter++;
if (latitude != 0 && longitude != 0) {
flag = false;
}
} while (counter <= 100000);
return null;
}
@Override
public void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
但是这里的条件不起作用。我也试过for循环而不是while,但这对我来说也不适用。还面临着非常奇怪的问题,当我使用sysout打印计数器时它的工作正常,但没有它不工作..
欢迎所有建议。
答案 0 :(得分:4)
此循环
while (counter <= 100000 || flag);
只要任何条件成立,就会继续,因此当计数器&lt; = 10000或flag为真时将继续。如果flag
为false
但counter
小于100000
则会继续。如果您打算在flag
为false
时终止循环,则需要执行以下操作:
while (counter <= 100000 && flag);
更新:从您的评论中可以看出,您希望counter
变量的十万增量大约需要20-30秒。当前的处理器方式比这更快。我甚至没有提到处理器之间的速度变化,因为它无论如何都可以忽略不计。你可以用这个循环等待真正的30秒,虽然它是一个忙等待的循环(就像你原来的意图一样)而不是一件好事:
final long startTime = System.currentTimeMillis();
do {
...
} while( System.currentTimeMillis() - startTime <= 30 * 1000 );
答案 1 :(得分:1)
可以使用TimerTask完成时间限制任务。请检查以下内容:
boolean timeExpired = false;
@Override
protected Void doInBackground(Void... params) {
Timer t =new Timer();
TimerTask tk = new TimerTask() {
@Override
public void run() {
timeExpired = true;
}
};
t.schedule(tk, 500);
while(!timeExpired){
if (latitude != 0 && longitude != 0) {
t.cancel();
tk.cancel();
break;
}
}
return null;
}
希望这有帮助。
答案 2 :(得分:0)
只需使用
Looper.prepare();
在doInBackground方法中的while循环之前