如何强制AsyncTask等待

时间:2015-12-18 09:03:46

标签: android asynchronous android-asynctask

我希望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();

2 个答案:

答案 0 :(得分:1)

你应该在UI线程上执行AsyncTask,所以使用get() - 这将阻止它没有意义 - 它可能会让你得到ANR错误。

如果你在HONEYCOMB上,那么AsyncTasks会在单个执行程序线程上串行执行 - 所以你的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
    }
  }); 

答案 1 :(得分:0)

你可以这样做:

AsyncTask的

doInBackground

@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;
}

外部功能,您需要强文 otify AsyncTask发布 等待状态

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

   }

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

此处我在 2秒之后通过CountDownTimer 通知了 AsyncTask。

希望这会对你有所帮助。