如何从AsyncTask传回http请求的结果?

时间:2012-12-22 01:26:33

标签: java android http android-asynctask

我是Android和Java的初学者。到目前为止并没有做得太糟糕,但我偶然发现了一个我无法解决的问题。

我正在尝试在我的应用程序类中创建一个方法,该方法将使用传递给它的值对列表进行http调用。这是第一部分。这是一个通过单击按钮激活的活动。

  // Add your data to array
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("action", "2"));
        nameValuePairs.add(new BasicNameValuePair("cell", "2500270025"));
        nameValuePairs.add(new BasicNameValuePair("date", "blah"));
        nameValuePairs.add(new BasicNameValuePair("time", "AndDev is Cool!"));
        nameValuePairs.add(new BasicNameValuePair("reason", "2"));

        // need to call the request
        String result = ((RespondApp) getApplication()).makeHTTPCall(nameValuePairs);

一旦我到达应用程序,这是接收部分。

public String makeHTTPCall(List<NameValuePair> nameValuePairs) {
        // this will be used to make all http requests from the whole app       
        new postToHttp().execute(nameValuePairs);
        return null;        
    }

这是AsyncTask部分。

class postToHttp extends AsyncTask<List<NameValuePair>, Void, String> {

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            // I am sure I need something here just don't know what
        }

        @Override
        protected String doInBackground(List<NameValuePair>... params) {

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://www.evfd.ca/cell.php");
            try {

                httppost.setEntity(new UrlEncodedFormEntity(params[0]));
                Log.i("makeHttpCall", "done ecoding");
                // Execute HTTP Post Request
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    InputStream instream = entity.getContent();
                String result = convertStreamToString(instream);
                Log.i("Read from server", result);
                return result;
                }

            } catch (ClientProtocolException e) {
                return null;
            } catch (IOException e) {
                return null;
            }
            return null;
        }

我正在尝试将网络服务器发回的响应一直返回到调用此过程的活动页面。所以理想情况下我想加载值对进行调用并获取http响应,然后以我的快乐方式继续。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以直接使用String本身在主UI线程上下载的AsyncTask。只需覆盖protected void onPostExecute(String result)课程中的AsyncTask即可完成工作。无论您从doInBackground()返回什么值,都会调用此函数。

基本上,在onPostExecute()内执行下一步操作。有关一些想法,请参阅How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

  • AsyncTask类作为内部类嵌套在Activity中,以便它可以与您的Activity的变量,方法等一起使用。

  • 创建您的Activity实现的interface。基本上,任务会在Activity中调用类似onHttpTaskComplete(String result)的内容。