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
类的类,所以它不再是匿名的。这次它奏效了。我不明白为什么。
答案 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