【问题标题】:how to force the AsyncTask to wait如何强制 AsyncTask 等待
【发布时间】:2015-12-18 09:03:46
【问题描述】:

我希望 AsyncTask 等到它完成。所以我写了下面的代码,我使用 .get() 方法如下,代码如下所示

    mATDisableBT = new ATDisableBT();

但在运行时,.get() 不会强制 ATDisableBT 等待,因为在 logcat 中我收到了从 ATDisableBT 和 ATEnableBT 发出的混合顺序的消息 这意味着 ATDisableBT 上的 .get() 并没有强迫它等待

如何强制AsyncTask等待

代码

//preparatory step 1
    if (this.mBTAdapter.isEnabled()) {
        mATDisableBT = new ATDisableBT();
        try {
            mATDisableBT.execute().get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    //enable BT.
    this.mATEnableBT = new ATEnableBT();
    this.mATEnableBT.execute();

【问题讨论】:

  • 如果你想让 AsyncTask 阻塞,为什么还要使用它?
  • @Fildor 请告诉我在这种情况下你推荐什么
  • 很难推荐一些东西。 sn-p 有点脱离上下文。启用/禁用 BT 听起来像“蓝牙”......所以这看起来你正在尝试禁用和启用蓝牙,无论出于何种原因。对吗?
  • @Fildor yes..correct
  • 纠正我,如果我是仪式与否。你想先执行mATDisableBT 然后完成mATDisableBT 你想执行mATEnableBT ??如果是这样的话,那就很容易了

标签: android asynchronous android-asynctask


【解决方案1】:

您应该在 UI 线程上执行 AsyncTask,因此使用 get() - 这将阻止它没有意义 - 它可能会导致 ANR 错误。

如果您使用 HONEYCOMB 及更高版本,则 AsyncTask 将在单个执行程序线程上串行执行 - 因此您的 mATEnableBT 应该在 mATDisableBT 之后执行。更多信息请看这里:

http://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...)

您也可以从 AsyncTask 切换到 Executors。 AsyncTask 是使用执行器实现的。通过创建单线程执行器,您可以确保任务将被串行执行:

ExecutorService executor = Executors.newSingleThreadExecutor();
//...

  executor.submit(new Runnable() {
    @Override
    public void run() {
      // your mATDisableBT code
    }
  });
  executor.submit(new Runnable() {
    @Override
    public void run() {
      // your mATEnableBT code
    }
  }); 

【讨论】:

  • 他也可以将两个阻塞操作都放入 doInBackground 并在完成时通知 UI,不是吗?我们将有一个单独的 ATRestartBT 或类似的东西......这将是我的(天真的)方法。
  • 你的意思是第三个AsyncTask?我想它会起作用的。
【解决方案2】:

你可以这样做:

doInBackground of AsyncTask

@Override
protected Void doInBackground(String... params) {
   Log.i("doInBackground", "1");

    synchronized (this) {
    try {
          mAsyncTask.wait();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
   Log.i("doInBackground", "2");

 return null;
}

这个函数之外,你必须从强大的文本通知AsyncTask从释放等待状态

new CountDownTimer(2000, 2000) {
 @Override
 public void onTick(long l) {

   }

  @Override
  public void onFinish() {
      synchronized (mAsyncTask) {
       mAsyncTask.notify();
     }
   }
}.start();

这里我有 通知 AsyncTask 由 CountDownTimer 2 秒

希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 2012-04-09
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多