【问题标题】:android -How to return value from asyncTaskandroid - 如何从 asyncTask 返回值
【发布时间】:2015-08-23 06:17:43
【问题描述】:

我想在 asynctask 完成后获取它返回的值。这是我的代码:

class asyncGet extends AsyncTask<Void, String, String> {
    Boolean goterror = false;
@Override
protected String doInBackground(Void... params) {
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(url);
    HttpResponse response;
    try {
        request.setHeader("Cache-Control", "no-cache");
        request.setHeader("Cache-Control", "no-store");
        response = client.execute(request);
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        response.setHeader("Pragma", "no-cache");
        InputStream in = response.getEntity().getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder str = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            str.append(line);
        }
        in.close();
        return str.toString();
    } catch (Exception e) {
        goterror = true;
    }

    return null;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    if (pDialog != null && pDialog.isShowing())
        pDialog.dismiss();

    if (result != null && goterror == false) {

}


}

异步在另一个类中,我想在它完成后显示结果。

如何从 async 返回结果?

谢谢

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    如果你想让它保持异步,那么它已经在你的代码中实现了, 使用 onPostExecute 方法,“result”包含返回的数据。

    或者,如果您希望它同步返回数据,请使用如下扩展的 asynctask:

            try {
              String result = new asyncGet().execute().get();
            } catch (InterruptedException e) {
                e.printStackTrace(); //handle it the way you like
            } catch (ExecutionException e) {
                e.printStackTrace();//handle it the way you like
            }
    

    【讨论】:

    • 是的,这里的get() 将使执行同步。
    • 如果它是异步的,你为什么需要异步任务。没有意义。我从未在生产应用中使用过 get
    • 只是一点:小心使用.get() 函数执行AsyncTask。它阻塞了 UI 线程。
    • 是的,它会阻塞UI线程,提供这样的功能没有任何意义,但有些人出于特殊原因使用它,这就是为什么我写清楚它是同步的。
    【解决方案2】:

    你可以创建一个界面,如下:

    public interface OnStringListener {
    
        void onStringCompleted(String s);
    
        void onStringError(String error);
    }
    

    您必须使用OnStringListener 作为参数创建AsyncTask 的构造函数:

    class asyncGet extends AsyncTask<Void, String, String> {
        Boolean goterror = false;
    
        private final OnStringListener mListener;
    
        public asyncGet(OnStringListener listener) {
            mListener = listener;
        } 
    
        //The rest of your code
    

    并且在您的onPostExecute 方法中,您可以返回String 通过onStringCompleted 方法发送它:

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (pDialog != null && pDialog.isShowing())
            pDialog.dismiss();
    
        if (result != null && goterror == false) {
    
        }
    
        if (mListener != null) {
              mListener.onStringCompleted(result);
         } 
    }
    

    当然,您的方法onStringCompletedonStringError必须在您想要获得AsyncTask 的结果的Activity 中创建。从那里,您将能够在其他课程中使用您的结果。

    希望对你有帮助!

    【讨论】:

    • onPostExecution在调用activity中直接可用时,为什么要实现接口?
    • @KishorPawar asynctask 与活动不在同一类中。还使用没有 ui 的片段(具有 asynctask )并保留它会更好地处理方向更改。您可以在重新创建片段并实现回调时附加片段将有助于轻松更新 ui
    • @KishorPawar 我几天前才发现这种方法,它对我有用。我不知道如何从另一个 Activity 直接访问 onPostExecution,抱歉。我只是觉得它可能会有所帮助。
    • @Raghunandan :正如文件所说,它的public abstract class 必须像@mohamad 所做的那样扩展。并且 onPostExecute 的结果在调用活动/主线程时直接可用
    • @KishorPawar 我还建议阅读此androiddesignpatterns.com/2013/04/… 和文档developer.android.com/guide/topics/resources/…。在处理方向变化时尝试您的方法
    【解决方案3】:

    AsyncTask 允许正确且轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。

    AsyncTask 必须子类化才能使用。子类将覆盖至少一种方法 (doInBackground(Params...)),并且通常会覆盖第二个方法 (onPostExecute(Result)。)

    所以哲学是你覆盖doInBackground,当doInBackground完成它的任务时,它会将结果传递给onPostExecute,这个结果在你的主线程中可用。

    阅读Full usage here

    如果您仍然想要同步执行,请按照@meghraj27 的说明调用get()

    【讨论】:

      【解决方案4】:

      您可以在需要 AsynTask 的结果的 Activity 或类中实现一个接口,并从 AsynTask 触发该接口。

      你可以参考这篇文章 How to handle return value from AsyncTask

      【讨论】:

        猜你喜欢
        • 2013-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 2015-07-23
        • 2012-03-16
        相关资源
        最近更新 更多