Android:在AsyncTask.doInBackground中,循环被强制破坏

时间:2015-12-18 13:18:52

标签: android android-asynctask

public void start(final int timeInMS){
    AsyncTask<Void, Void, Void> timer = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            long timeWhenStart = System.nanoTime();
            long now;
            do {
                now = System.nanoTime();
            } while ((now - timeWhenStart) < (timeInMS * 1000000));

            System.out.println((now - timeWhenStart) < (timeInMS * 1000000));
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            IntensityArc.this.setVisibility(View.INVISIBLE);
        }
    };

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        timer.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
    } else {
        timer.execute((Void[]) null);
    }
}

此代码的输出为:false

当条件不满足时,程序应跳出循环。但是当程序停止时,(now - timeWhenStart)的值大约为1,400,000,000,而(timeInMS * 1000000)的值为10,000,000,000。条件显然仍然令人满意。怎么会这样?

我使用此计时器使自定义视图在时间用完时消失。

P.S。我试着创建一个扩展AsyncTask类的类,所以它不再是匿名的。这次它奏效了。我不明白为什么。

2 个答案:

答案 0 :(得分:1)

您的周期重复,条件为真。 因此,当条件为 false 并打印时,循环结束。

更新问题后编辑:

timeInMS是int,int的最大值是2 147 483 647。 如果time timeInMS是10 000,那么10 000 * 1 000 000大于int的最大值。 因为它不适合32位,所以结果int是1 410 065 408。

你可以通过乘以长值来使它变长。

long timeInNs = timeInMS * 1000000L;

答案 1 :(得分:1)

使用长数据类型而不是所有整数值。 如果使用numaric值,则使用如下:100000L