android - 如何从asyncTask

时间:2015-08-23 06:17:43

标签: android 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在另一个类中,我希望在完成后显示结果。

如何从异步中返回结果?

谢谢

4 个答案:

答案 0 :(得分:2)

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

或者,如果您希望它同步返回数据,请使用扩展的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
        }

答案 1 :(得分:1)

您可以创建一个界面,如下所示:

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方法中,您可以通过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);
     } 
}

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

我希望它会对你有所帮助!

答案 2 :(得分:0)

  

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

     

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

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

阅读Full usage here

如果你仍然想要同步执行,请按@ meghraj27

的解释调用get()

答案 3 :(得分:0)

您可以实现一个Activity或类的接口,您希望获得AsynTask的结果,并从AsynTask触发该接口。

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