android -如何从asyncTask返回值



我想获得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在另一个类中,我想在它完成时显示结果。

我如何从异步返回结果?

谢谢

如果你想保持异步,那么它已经在你的代码中实现了,使用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
        }

您可以创建一个接口,如下所示:

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

,您必须创建AsyncTask的构造函数,并将OnStringListener作为参数:

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方法中,您可以返回通过onStringCompleted方法发送的String:

@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的结果。从那里,您将能够在其他类中使用您的结果。

我希望它会对你有帮助!

AsyncTask使UI线程能够正确而轻松地使用。这个类允许在UI线程上执行后台操作和发布结果,而不必操作线程和/或处理程序。

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

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

阅读此处的完整用法

,如果你仍然想要同步执行调用get(),正如@meghraj27

所解释的那样

你可以实现一个接口到一个Activity或类,你想要AsynTask的结果,并从AsynTask触发该接口。

你可以参考这篇文章如何处理AsyncTask

的返回值

最新更新