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()
里面,我正在执行一个AsyncTask
login,从而产生一个networking请求,这个请求不能在UI上运行,否则我会得到一个exception。 我需要等待它完成之前恢复与if内的代码。 我怎样才能做到这一点 ?
问题是活动首先启动,然后执行AsyncTask
,所以当活动期望有效的login会话时,它会中断。
你有两个select:
或者使用AsyncTask
的get(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(); } }
这似乎对我很好。
- Android的ViewPager setCurrentItem后onResume不工作
- 使用Fragments在Android中为每个选项卡单独备份堆栈
- Appcompat v21工具栏高度预棒棒糖
- Android WebView JellyBean – >不应该发生:找不到基于rect的testing节点
- Android和IOS需要什么样的字体文件?
- Android模拟器是不可见的,我怎样才能移动它?
- 什么是工具:模型,工具:mockup_crop和工具:mockup_opacity
- 我可以从Dalvik和Android工具链中获得什么样的优化?
- 这个应用程序没有configurationAndroid密钥散列。 – 使用Facebook SDK进行login