2012-06-09 88 views
0

我在我的项目中遇到了一个非常愚蠢的问题,无法解决它。我使用AsyncTask来获取用户的当前位置。在那我用了一个计数器作为定时器工作。在doInBackground里面,我正在递增该计数器,如果它大于x值,那么我取消异步任务。for循环&while循环不工作在android中的asynctask doInBackground?

这里是代码片段: -

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其工作正常,但没有它不工作..

所有的建议,欢迎。

回答

4

这个循环,只要任何一个条件成立,

while (counter <= 100000 || flag); 

将继续,因此它会继续而计数器< = 10000或标志为真。如果flagfalse但是counter小于100000它将继续。如果您有意终止循环的时候flagfalse,那么你需要做的,而不是:

while (counter <= 100000 && flag); 

更新:它从你的评论似乎是您所期望的counter变量的十万递增采取大约20 -30秒。当天处理器是的方式比那更快。我甚至不会提到处理器之间的速度差异,因为无论如何它可以忽略不计。您可以等待这个循环真正的30秒虽然是一个忙着等待环(就像你的原意),而不是做些有意思的事:

final long startTime = System.currentTimeMillis(); 
do { 
    ... 
} while(System.currentTimeMillis() - startTime <= 30 * 1000); 
+0

while循环之前,但在循环不是working.I也想你的建议,... 我想是等待10-20秒然后我需要打破循环,但循环打破所有的时间,并转到onPostExecute方法。然后,为了调试我sysout柜台在那个时候它的工作非常好.. – Scorpion

+0

@Scorpion:似乎'纬度和经度'是0? –

+0

现在我改变了条件,我只使用计数器..基本上我想要的是等待20-30秒获取位置,如果在此期间没有找到,然后转到下一个屏幕......所以我使用计数器变量作为计时器... – Scorpion

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; 
     } 

希望这会有所帮助。

0

只需使用

Looper.prepare(); 

在doInBackground方法