如何从AsyncTasks doInBackground()中检索数据?

时间:2012-02-14 08:51:22

标签: android android-asynctask

我会尽可能地保持这个。

我的控制层中有一个方法,它使用扩展CallServiceTask的类AsyncTask。致电新CallServiceTask().execute(parameters)时 如何检索从doInBackground返回的数据?我发现的所有教程都使用直接从AsyncTask扩展Activity的类 我的问题比这复杂一点 我想要的只是取Object[]返回的doInBackground并将其设置为RestClient类的私有数据成员。

CallServiceTask看起来像这样:

    private class CallServiceTask extends AsyncTask<Object, Void, Object[]>
{

    protected Object[] doInBackground(Object... params) 
    {
        HttpUriRequest req = (HttpUriRequest) params[0];
        String url = (String) params[1];

        return executeRequest(req, url);
    }
}

我的RestClient类看起来像这样:

public class RestClient
{

private ArrayList <NameValuePair> params;
private ArrayList <NameValuePair> headers;

private JSONObject jsonData;

private Object[] rtnData;

private String url;

private boolean connError;

public int getResponseCode() {
    return responseCode;
}

/**
 * 
 * @return  the result of whether the login was successful by looking at the response parameter of the JSON object. 
 */
public Boolean DidLoginSucceed()
{
    // Will Crash on socket error
        return ((JSONObject) rtnData[0]).optBoolean("response");
}

public String GetToken()
{
    return jsonData.optString("token");
}

public RestClient(String url)
{
    this.url = url;
    params = new ArrayList<NameValuePair>();
    headers = new ArrayList<NameValuePair>();
    rtnData = new Object[]{ new JSONObject() , Boolean.TRUE  };
}

public void AddParam(String name, String value)
{
    params.add(new BasicNameValuePair(name, value));
}

public void AddHeader(String name, String value)
{
    headers.add(new BasicNameValuePair(name, value));
}

/**
 * This method will execute, call the service and instantiate the JSON Object through executeRequest().
 * 
 * @param method    an enum defining which method you wish to execute.
 * @throws Exception
 */
public void ExecuteCall(RequestMethod method) throws Exception
{
    Object[] parameters = new Object[]{ new HttpGet() , new String("") };
    switch(method) {
        case GET:
        {
            //add parameters
            String combinedParams = "";
            if(!params.isEmpty()){
                combinedParams += "?";
                for(NameValuePair p : params)
                {
                    String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue());
                    if(combinedParams.length() > 1)
                    {
                        combinedParams  +=  "&" + paramString;
                    }
                    else
                    {
                        combinedParams += paramString;
                    }
                }
            }

            HttpGet request = new HttpGet(url + combinedParams);

            //add headers
            for(NameValuePair h : headers)
            {
                request.addHeader(h.getName(), h.getValue());
            }
            parameters[0] = request;
            parameters[1] = url;

            new CallServiceTask().execute(parameters);

            jsonData = ((JSONObject) rtnData[0]).optJSONObject("data");
            connError = (Boolean) rtnData[1];
            break;

        }
        case POST:
        {
            HttpPost request = new HttpPost(url);

            //add headers
            for(NameValuePair h : headers)
            {
                request.addHeader(h.getName(), h.getValue());
            }

            if(!params.isEmpty()){
                request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            }
            new CallServiceTask().execute(request, url);
            break;
        }
    }
}

private Object[] executeRequest(HttpUriRequest request, String url)
{
    HttpClient client = new DefaultHttpClient();
    client = getNewHttpClient();

    HttpResponse httpResponse;

    try {
        httpResponse = client.execute(request);
        HttpEntity entity = httpResponse.getEntity();

        if (entity != null) {

            InputStream instream = entity.getContent();
            String response = convertStreamToString(instream);
            try {
                rtnData[0] = new JSONObject(response);
                rtnData[1] = false;

            } catch (JSONException e1) {
                rtnData[1] = true;
                e1.printStackTrace();
            }

            // Closing the input stream will trigger connection release
            instream.close();
        }

    } catch (ClientProtocolException e)  {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    } catch (IOException e) {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    }
    return rtnData;
}


private static String convertStreamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

/**
 * Custom HTTP Client accepting all SSL Certified Web Services.
 * 
 * @return n HttpClient object.
 */
public HttpClient getNewHttpClient() {
    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);

        SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
        sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", sf, 443));

        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

        return new DefaultHttpClient(ccm, params);
    } catch (Exception e) {
        return new DefaultHttpClient();
    }
}

6 个答案:

答案 0 :(得分:25)

唯一的方法是使用CallBack。你可以这样做:

new CallServiceTask(this).execute(request, url);

然后在你的CallServiceTask中添加一个本地类变量,并在你的onPostExecute中调用该类的方法:

private class CallServiceTask extends AsyncTask<Object, Void, Object[]>
{
    RestClient caller;

    CallServiceTask(RestClient caller) {
        this.caller = caller;
    }


    protected Object[] doInBackground(Object... params) 
    {
        HttpUriRequest req = (HttpUriRequest) params[0];
        String url = (String) params[1];
        return executeRequest(req, url);
    }

    protected onPostExecute(Object result) {
        caller.onBackgroundTaskCompleted(result);
    }
}

然后只需在RestClient类的onBackgroundTaskCompleted()方法中使用Object。

更优雅和可扩展的解决方案是使用接口。有关示例实现,请参阅this库。我刚刚开始它,但它有一个你想要的例子。

答案 1 :(得分:13)

正如@ saad-farooq所说,你可以使用interface。因此,您可以使用Handler.Callback或定义自己的:

public interface ClientIF {

    public void onResponseReceived(Object result);

}

然后您需要在 CallServiceTask

中实现它
public abstract class CallServiceTask extends AsyncTask<Object, Void, Object[]> 
    implements ClientIF
{
    Activity activity;

    CallServiceTask(Activity activity) {
        this.activity = activity;
    }

    public abstract void onResponseReceived(Object result); 

    protected Object[] doInBackground(Object... params) 
    {
        HttpUriRequest req = (HttpUriRequest) params[0];
        String url = (String) params[1];
        return executeRequest(req, url);
    }

    protected onPostExecute(Object result) {
        onResponseReceived(result);
    }
}

请注意,costructor已更改,因此您可以从每个 Activity 类调用。 然后在 RestClient

中创建此类的实例
public class RestClient
{
CallServiceTask service = new CallServiceTask() {
    @Override
    public void onResponseReceived(Object result) {
    // TODO Auto-generated method stub

    }
};

}

答案 2 :(得分:8)

您可以使用get()value/object返回AsyncTask

new CallServiceTask().execute(parameters).get();

这将返回您返回的computed结果。但这会阻止你的UI,直到你的后台进程完成。

另一种选择是创建一个Interface或BroadcastReceiver,在doInBackground()完成后立即返回值。我使用Interface和BroadcastReceiver创建了相同的演示,您可以检查是否来自my github

此外,通过使用第二种方法,您的UI不会被阻止!

答案 3 :(得分:1)

public class getOperators extends AsyncTask<Void, Void, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        items = new ArrayList();
        dialog = new ProgressDialog(PrepaidOperatorsListActivity.this);
        dialog.setMessage("Please Wait...");
        dialog.setCancelable(false);
        dialog.show();
    }



    @Override
    protected String doInBackground(Void... params) {
        BufferedReader reader;
        StringBuffer buffer;
        String res = null;

        try {
            URL url = new URL("");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setReadTimeout(40000);
            con.setConnectTimeout(40000);
            con.setRequestMethod("GET");
            con.setRequestProperty("Content-Type", "application/json");
            int status = con.getResponseCode();
            InputStream inputStream;
            if (status == HttpURLConnection.HTTP_OK) {
                inputStream = con.getInputStream();
            } else {
                inputStream = con.getErrorStream();
            }
            reader = new BufferedReader(new InputStreamReader(inputStream));
            buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }
            res = buffer.toString();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return res;
    }
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        System.out.println("JSON RESP:" + s);
        String response = s;
        try {

            JSONObject ecomerrce = new JSONObject(response);
            JSONArray jsonArray = ecomerrce.getJSONArray("prepaid_operators");

            for (int j = 0; j < jsonArray.length(); j++) {
                JSONObject jsonObject = jsonArray.getJSONObject(j);

                PrepaidOperatorsPojo prepaidOperatorsPojo = new PrepaidOperatorsPojo(jsonObject.getString("operator_name"), jsonObject.getString("operator_code"), jsonObject.getString("operator_display_comission"), jsonObject.getString("operator_calculate_comission"));
                items.add(prepaidOperatorsPojo);

            }
            if (items.size() > 0) {
                dialog.dismiss();
                prepaidOperatorListAdapter = new PrepaidOperatorListAdapter(PrepaidOperatorsListActivity.this, items);
                rvPrepaidOperatorList.setAdapter(prepaidOperatorListAdapter);

            } else {
                dialog.dismiss();
                Toast.makeText(PrepaidOperatorsListActivity.this, "No Data to display", Toast.LENGTH_SHORT).show();
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

答案 4 :(得分:1)

private void walletStatements() {
        JSONObject post_search = new JSONObject();
        try {

            post_search.put("username", getUserName);


        } catch (JSONException e) {
            e.printStackTrace();
        }
        if (post_search.length() > 0) {
            try {
               new Getwalletstatements().execute(String.valueOf(post_search));

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }


    class Getwalletstatements extends AsyncTask<String, String, String> {
        String JsonResponse = null;
        ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            dialog = new ProgressDialog(ReportsActivity.this);
            dialog.setMessage("Please Wait...");
            dialog.setCancelable(false);
            dialog.show();
        }

        @Override
        protected String doInBackground(String... params) {
            String JsonDATA = params[0];
            HttpURLConnection urlConnection = null;
            BufferedReader reader = null;
            URL url = null;

            try {
                url = new URL(Constant.url+"GetReports_v9.php");
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setDoOutput(true);                // is output buffer writter
                urlConnection.setRequestMethod("POST");
                urlConnection.setRequestProperty("Content-Type", "application/json");
                urlConnection.setRequestProperty("Accept", "application/json");//set headers and method
                Writer writer = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream(), "UTF-8"));
                writer.write(JsonDATA);// json data
                writer.close();

                InputStream inputStream = urlConnection.getInputStream();//input stream
                StringBuffer buffer = new StringBuffer();
                if (inputStream == null) {                    // Nothing to do.
                    return null;
                }
                reader = new BufferedReader(new InputStreamReader(inputStream));
                String inputLine;

                while ((inputLine = reader.readLine()) != null)
                    buffer.append(inputLine + "\n");

                if (buffer.length() == 0) {                    // Stream was empty. No point in parsing.
                    return null;
                }

                JsonResponse = buffer.toString();


                return JsonResponse;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (final IOException e) {

                    }
                }
            }


            return null;
        }

        @Override
        protected void onPostExecute(String s) {

            if (JsonResponse != null) {
                try {
                    NetworkIN.iv= Constant.iv;
                    NetworkIN.change=Constant.key;
                    NetworkIN mCrypt=new NetworkIN();
                    String decrypted = new String( mCrypt.decrypt(JsonResponse.trim()) );

                    if(decrypted!=null){
                        JSONObject ordersHistory = new JSONObject(decrypted);
                        msg = ordersHistory.getString("msg");

                        JSONArray jsonArray = ordersHistory.getJSONArray("PPDetails");

                        ordersCount = jsonArray.length();
                        //for (int j = 0; j < jsonArray.length(); j++)
                        for (int j = jsonArray.length() - 1; j >= 0; j--)
                        {
                            JSONObject jsonObject = jsonArray.getJSONObject(j);


                            String message,total_in,inType ;

                            total_in =jsonObject.getString("total_in");
                            inType =jsonObject.getString("in_type");
                            message="Congratulations your wallet is credited by Rs."+total_in+" because of "+inType;
                            ReportsPojo reportsPojo = new ReportsPojo(jsonObject.getString("reg_id"),
                                    jsonObject.getString("username"),
                                    jsonObject.getString("transfer_from"),
                                    jsonObject.getString("transfer_to"),
                                    jsonObject.getString("total_in"),
                                    jsonObject.getString("tds"),
                                    jsonObject.getString("in_amount") ,
                                    jsonObject.getString("out_amount"),
                                    jsonObject.getString("in_type"),
                                    jsonObject.getString("created_on"),
                                    message);

                            reportsItems.add(reportsPojo);
                        }
                    }else{

                    }


                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }

                if (msg.equals("Success")) {

                    reportsAdapter = new ReportsAdapter(ReportsActivity.this, reportsItems);
                    reportsListview.setAdapter(reportsAdapter);

                } else {
                    Toast.makeText(ReportsActivity.this, "Sorry "+msg, Toast.LENGTH_LONG).show();

                }
                dialog.dismiss();
            } else {
                dialog.dismiss();
            }
        }

答案 5 :(得分:0)

public class MyAsyncTask extends AsyncTask<String, Void, String> {  

    @Override    
    protected void onPreExecute() {
        //showProgressDialog
        dialog = new ProgressDialog(this);
        dialog.setMessage("Loading........");
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.show();
    }

    @Override    
    protected String doInBackground(String... strings) {
      HttpURLConnection httpURLConnection;
      BufferedReader reader;
      int responseCode ;

        try {
            URL url = new URL(YOUR_URL);
            URLConnection urlConnection = url.openConnection();
            httpURLConnection = (HttpURLConnection) urlConnection;
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setDoOutput(true);

            responseCode = httpURLConnection.getResponseCode();
            InputStream inputStream = httpURLConnection.getInputStream();
            if (inputStream != null) {
                if (responseCode == 200) {
                    reader = new BufferedReader(new InputStreamReader(inputStream));
                    StringBuilder buffer = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line);
                    }
                    return buffer.toString();
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override    
    protected void onPostExecute(String result) {
        progressDialog.dismiss();
        // Fetch Your Data Add Your Code Here
    }
}