繁体   English   中英

Android等待AsyncTask完成

[英]Android wait AsyncTask to finish

我有一个函数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 ,从而发出一个网络请求,这个请求无法在UI上运行,否则我会收到异常。 在使用if中的代码恢复之前,我需要等待它完成。 我怎样才能做到这一点 ?

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

您有两种选择:

要么使用AsyncTask的方法get(long timeout, TimeUnit unit) ,请执行以下操作:

task.get(1000, TimeUnit.MILLISECONDS);

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

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

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

尝试使用

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

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

要解决此问题,请创建一个布尔标志,将其设置为false ,然后在task.onPostExecute()其翻转为true 然后在切换活动之前执行while(!flag) { } 另外,如果你想给主线程一个'break'让AsyncTask进程加快一点,你可以试试这个:

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

它似乎对我有用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM