【问题标题】:Android asynctask for max time最长时间的Android异步任务
【发布时间】:2015-01-14 12:08:29
【问题描述】:

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

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

第二次我使用的是 asynctask 并且在它的 doInBackground 方法中我有

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

(booleanValueMax 和 booleanValueMin 是可变布尔值)。现在我使用 Timer(在 asynctask 之外)将这两个设置为 false:

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

(最大值相同)

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

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

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

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

【问题讨论】:

  • 发布您的完整代码。似乎是简单的计时问题

标签: java android android-asynctask boolean


【解决方案1】:

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

【讨论】:

  • 也许这不是最优雅的方式,但它很有效,而且速度很快,可以满足我的需求。谢谢。
【解决方案2】:

您没有显示启动 asynctask 的代码,但是:所有 asynctask 共享同一个线程池。在最简单的情况下,它只是一个线程。最有可能的是,您的 asynctask 在设置任何变量之前开始和结束。 Asynctasks 用于不需要等待的长时间操作。如果您希望您的代码等待事件,最好使用Thread。 (嗯,可以将消息/runnables 发布到线程,请参阅 Looper 和 Handler。)

【讨论】:

    【解决方案3】:

    这是一个例子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多