Android 最大时间异步任务

Android asynctask for max time

我正在尝试从物理设备读取数据。 为了获取数据,我使用异步任务来避免 UI 阻塞。 当我点击一个按钮时,我应该做两次(对于最小值和最大值): 等待 5 秒; 获取数据1秒。 所以代码写在按钮的OnClickListener中。 对于第一个任务,我使用此方法:

    new android.os.CountDownTimer(5000, 1000) {
        public void onTick(long millisUntilFinished) {  }
          public void onFinish() {     }
    }.start();

第二次我使用的是异步任务,在它的 doInBackground 方法中我有

while(booleanValueMax || booleanValueMin) {
   //code
}

(booleanValueMax 和 booleanValueMin 是可变布尔值)。现在我使用定时器(在异步任务之外)将这两个设置为 false:

Timer min = new Timer();    
min.schedule(new TimerTask() {          
    @Override
    public void run() {
        booleanValueMin = false;      
    }
}, 1000);

(最大值相同)

现在我想使用相同的异步任务来存储最大值和最小值。所以我知道我正在获取哪些数据来检查布尔值(在 doInBackground 方法中)。

if(booleanValueMax)
   //store max
else
   //store min

问题是这些变量总是错误的。我也不知道为什么。

除了使用 Timer、CountDownTimer 等之外,还有其他方法可以实现我的目标吗?我'

您没有显示启动异步任务的代码,但是:所有异步任务共享同一个线程池。在最简单的情况下,它只是一个线程。最有可能的是,您的 asynctask 在设置任何变量之前开始和完成。异步任务适用于不需要等待的长时间操作。如果您希望您的代码等待某个事件,最好使用 Thread。 (好吧,有可能 post messages/runnables 到线程,参见 LooperHandler。)

只需制作两个单独的 asynchtask 并根据您的值调用它们,即 而(booleanValueMax || booleanValueMin){ //代码 }

这是一个例子:

private void executeBigTask(){
    BigTask bigTask = new BigTask();
    bigTask.execute();

    // Check
    Handler handler = new Handler();
    handler.postDelayed(new Runnable(){
        @Override
        public void run() {
            if (bigTask.getStatus() == AsyncTask.Status.RUNNING){
                bigTask.cancel(true);
            }
        }
    }, 10000);
}


protected class BigTask extends AsyncTask<String, String, Integer> {
    @Override
    protected Integer doInBackground(String... params) {

        /**
        LONG TASK
        */

        return 0;
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        Toast.makeText(MainActivity.this, getString(R.string.task_too_long), Toast.LENGTH_LONG).show();
    }
}