我希望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();
答案 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。
希望这会对你有所帮助。