0

プロジェクトで非常にばかげた問題に直面しており、解決できません。ユーザーの現在の場所を取得するために AsyncTask を使用しています。その中で、1つのカウンターを使用してタイマーとして機能させました。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);
        }

    }

しかし、ここでは while 条件が機能していません。while の代わりに for ループも試しましたが、それもうまくいきません。また、sysoutを使用してカウンターを印刷すると、正常に機能しますが、機能しないと、非常に奇妙な問題に直面します..

すべての提案を歓迎します。

4

3 に答える 3

4

このループ

while (counter <= 100000 || flag);

いずれかの条件が満たされている限り続行されるため、counter <= 10000 または flag が true である間は続行されます。flagあるfalseが、それcounter未満の場合100000は継続します。isのときにループを終了する場合flagfalse、代わりに次のことを行う必要があります。

while (counter <= 100000 && flag);

更新:あなたのコメントから、変数の 10 万回の増分にはcounter約 20 ~ 30 秒かかると思われるようです。現在のプロセッサはそれよりもはるか高速です。とにかく無視できるので、プロセッサ間の速度の変動については言及しません。このループで実際の 30 秒間待つことができますが、ビジー待機ループ (元の意図と同様) であり、良いことではありません。

final long startTime = System.currentTimeMillis();
do {
    ...
} while( System.currentTimeMillis() - startTime <= 30 * 1000 );
于 2012-06-09T06:24:54.553 に答える
1

Time bound task can be done using the TimerTask. Check the following:

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

Hope this helps.

于 2012-06-09T06:51:36.963 に答える
0

使うだけ

Looper.prepare();

doInBackground メソッドの while ループの前

于 2017-04-02T07:28:33.347 に答える