Android等待AsyncTask完成

我有一个函数, AppHelper.isOnline(Context context) ,我在我的应用程序的各个部分调用,以检查一个会话没有超时之前,提出一个HTTP请求。

 public void onClick(View v) { Intent intent = null; switch (v.getId()) { case R.id.buttonPagamenti: if (AppHelper.isOnline(this)) { //here AppHelper.isOnline should have finished it's async task intent = new Intent(this, OrdineCreaActivity.class); this.startActivityForResult(intent, R.id.buttonPagamenti); } break; ... 

AppHelper.isOnline()里面,我正在执行一个AsyncTasklogin,从而产生一个networking请求,这个请求不能在UI上运行,否则我会得到一个exception。 我需要等待它完成之前恢复与if内的代码。 我怎样才能做到这一点 ?

问题是活动首​​先启动,然后执行AsyncTask ,所以当活动期望有效的login会话时,它会中断。

你有两个select:

或者使用AsyncTaskget(long timeout, TimeUnit unit)

 task.get(1000, TimeUnit.MILLISECONDS); 

这将使你的主线程等待最多1000毫秒AsyncTask的结果(根据@ user1028741评论:实际上也有infinetly等待方法 – AsyncTask#get()这也可能在某些情况下为你工作)。

或者,您可以在asynchronous任务中显示进度对话框,直到完成。 看到这个线程 (不需要我复制过去的代码)。 基本上,进度对话框显示在asynchronous任务运行时,并在完成时隐藏。

你甚至有第三种select:“如果Thread足够满足你的需要,你可以使用它的join方法,但是如果任务需要很长时间,你仍然需要显示一个进度对话框,否则你会得到一个exception,因为主线程停用时间太长。

尝试使用

 if (AppHelper.isOnline(this)) { while(!task.isCancelled()){ // waiting until finished protected String[] doInBackground(Void... params) } intent = new Intent(this, OrdineCreaActivity.class); this.startActivityForResult(intent, R.id.buttonPagamenti); } 

有关更多信息,请阅读http://developer.android.com/reference/android/os/AsyncTask.html

 intent = new Intent(this, OrdineCreaActivity.class); context.startActivityForResult(intent, R.id.buttonPagamenti); 

在你的AysncTask的onPostExecute()中写上面的代码。 因为如果我们使用AsyncTask,它不会在那里等待,直到任务完成。

Rafiq的回应并不适用于我 – 应用程序被挂起。 我认为原因与isCancelled()的性质有关:“如果在正常完成之前取消该任务,则返回true”。 如果任务正常完成(即未取消),那么while(!task.isCancelled()) { }将永远循环。

为了解决这个问题,可以创build一个布尔标志,将其设置为false ,然后在task.onPostExecute()中将其task.onPostExecute()true 。 然后在切换活动之前做while(!flag) { } 。 另外,如果你想给主线程一个“rest”让AsyncTask进程稍快一点,你可以试试这个:

 while (!flag) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } 

这似乎对我很好。