Android等待异步任务完成后执行特定方法

5
我将为您翻译中文:

我一直在寻找答案,但没有人真正回答,因为使用异步任务没有意义。在Android API 11或更高版本中,它将强制您在主线程上进行网络请求,因此我必须使用异步任务。所以,问题来了:有没有可能等待异步任务完成后再继续呢?因为我需要调用方法等数据都已经准备好了。

这是我的代码:

public JSONObject getJSONFromUrl(String url) {
        this.url = url;
        new loadURL().execute();



        // Do this when ASYNC HAS FINISHED 
        return jObj;



    }

    class loadURL extends AsyncTask <Void, Void, Void> {

        protected void onPreExecute() {

        }

        protected Void doInBackground(Void... unused) {
            //do stuff in background 

            return (null);
        }

    }   
}

如果有任何问题需要回答,请留下评论。感谢您的帮助。


向您的布局中添加一个不确定进度条(阻塞您的内容),或在异步任务的onPostExecute()被调用之前显示一个加载对话框。如果您尝试在整个网络请求期间阻止主线程,Android将会给出一个ANR错误,您的用户将会感到沮丧。 - natez0r
4个回答

6

你可以使用AsyncTask中的onPostExecute方法来在后续执行任何想要的操作。该方法会在doInBackground方法完成后被调用。


但是如果我要返回某些东西(它是另一个类中的方法),我不能从onPostExecute中返回它... - Charlton Santana
2
不要返回它,而是将您本应使用返回值运行的代码移动到onpostexecute。 - natez0r
你想要返回什么? - tyczj
我需要它返回到另一个类。在调用该方法之后,它需要对返回的数据进行一些操作。 - Charlton Santana
1
创建一个回调函数,以便在任务完成时将任何内容发送到您想要发送的类。 - tyczj
1
@DrDebug:您无法做您想做的事情。 "返回数据的某些内容" 需要由 onPostExecute() 触发。您不能将 AsyncTask 隐藏在此类方法中,并同时使该方法返回值。这里的一种典型方法是,在 getJSONFromUrl() 中使用某种回调作为参数,其中回调将处理结果处理。当然,在这种情况下,更简单的方法是将所有这些替换为 Retrofit 或另一个 HTTP 包装库。 - CommonsWare

0
如果操作不会太长(少于几秒钟),您可以使用进度条来防止用户进行任何操作。在您的AsyncTask中设置类似以下内容的东西。
ProgressDialog progress = ProgressDialog.show(LoginScreen.this, "Downloading Users", "Please wait while users are downloaded");

    @Override
    protected void onPreExecute()
    {
        progress.setCancelable(false);
        progress.isIndeterminate();
        progress.show();
    }

你仍需要从onPostExecute()中调用你的方法,因为这只会阻止用户除了等待之外无法执行任何操作,但不会阻止任何在你从中调用AsyncTask的方法中运行的代码。


0

这可以通过wait()notify()notifyAll()方法来实现objects。或者您可以通过interfaces使用自定义回调。当您完成获取所需数据时,只需通过回调调用适当的方法即可。


-1

你可以在doInBackground()方法中执行网络相关操作,因为在Android中,onPostExecute()方法仅用于UI更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接