for loop&虽然循环不在android中的asynctask doInBackground中工作?

时间:2012-06-09 06:22:23

标签: android for-loop while-loop android-asynctask do-while

我在项目中面临一个非常愚蠢的问题而无法解决问题。我正在使用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打印计数器时它的工作正常,但没有它不工作..

欢迎所有建议。

3 个答案:

答案 0 :(得分:4)

此循环

while (counter <= 100000 || flag);
只要任何条件成立,

就会继续,因此当计数器&lt; = 10000或flag为真时将继续。如果flagfalsecounter小于100000则会继续。如果您打算在flagfalse时终止循环,则需要执行以下操作:

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循环之前