Android等待AsyncTask完成

max*_*ver 38 multithreading android 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;
...
Run Code Online (Sandbox Code Playgroud)

在里面AppHelper.isOnline(),我正在执行一个AsyncTask登录,从而发出一个网络请求,无法在UI上运行,否则我得到一个例外.在使用if中的代码恢复之前,我需要等待它完成.我怎样才能做到这一点 ?

问题是活动开始第一次,然后AsyncTask执行,所以当活动期望有效的登录会话时,它会中断.

Bor*_*jev 81

您有两种选择:

使用这样AsyncTask的方法get(long timeout, TimeUnit unit):

task.get(1000, TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以在异步任务中显示进度对话框,直到完成为止.看到这个帖子(我不需要复制代码).基本上,当异步任务运行时会显示进度对话框,并在完成时隐藏.

你甚至有第三个选择:"如果Thread你的需求足够你可以使用它的join方法.但是,如果任务需要很长时间你仍然需要显示进度对话框,否则你会得到一个例外,因为主要线程处于非活动状态的时间太长

  • 异步任务确实有一个进度对话框,但它不会阻止新活动启动 (2认同)
  • 你也可以在没有参数的情况下执行task.get(),这样它就会等待整个计算完成,然后才继续. (2认同)