【问题标题】:Android wait till async task has finished to do specific methodAndroid 等到异步任务完成再做具体的方法
【发布时间】:2013-06-19 19:45:45
【问题描述】:

我一直在寻找答案,但没有人真正回答,因为为此使用异步任务毫无意义。在 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,您的用户会感到不安。

标签: java android android-asynctask


【解决方案1】:

是的,你使用AsyncTaskonPostExecute 方法来做任何你想做的事。在doInBackground 完成后调用该方法

【讨论】:

  • 但是如果我返回一些东西(它是另一个类中的方法)我不能从 onPostExecute 返回它...
  • 那就别退货了。获取您将使用返回值运行的代码并将其移动到 onpostexecute
  • 你想返回什么?
  • 所以创建一个回调到你想在任务完成时发送任何东西的类
  • @DrDebug:你不能做你想做的事。 “返回数据的东西”需要由onPostExecute()触发。您不能在这样的方法中隐藏AsyncTask,并且 让该方法返回一个值。这里的一个典型方法是让getJSONFromUrl() 将某种回调作为参数,其中回调将处理结果处理。当然,在这种情况下,您更容易将所有这些替换为 Retrofit 或其他 HTTP 包装库。
【解决方案2】:

如果操作不会花费很长时间(少于几秒钟),您可以使用进度条来阻止用户执行任何操作。在你的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 的方法中的任何代码运行

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多