使用Async发送HttpPost并获取字符串结果

时间:2012-03-31 20:37:15

标签: android post asynchronous

我是一个相对新的Android开发人员,我无法理解如何执行此操作。我一直在浏览所有的论坛,我取得了一些进展,但我仍然在这里。 所以,我想要做的是一个向网页发送POST请求的常用函数(它只发送一个POST参数)并将结果作为字符串返回。 我有主线程

public class AppActivity extends Activity {
    HTTPPostData PostData = new HTTPPostData("id");
    PostData.execute();
    txtLabel.setText(PostData.Result);
}

我有我的HTTPPostData异步类

public class HTTPPostData extends AsyncTask<String, Long, Object> {
String Value = null;
String Result = null;

public HTTPPostData(String query) {
    Value = query;
    }

@Override
protected String doInBackground(String... params) {
    byte[] Bresult = null;
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost("http://www.mypage.com/script.php");
        try {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("cmd", Value));
            post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
            HttpResponse response = client.execute(post);
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){
                Bresult = EntityUtils.toByteArray(response.getEntity());
                Result = new String(Bresult, "UTF-8");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (Exception e) {
        }
        return Result;
    }
}

我想多次使用此函数(在同一个Activity内部或与同一应用程序的其他活动共享)。我此刻有点乱,所以我需要你的帮助。我理解的是,在doInBackground()完成之前我要求的结果,我得到一个空结果。

提前感谢您的帮助

1 个答案:

答案 0 :(得分:1)

关于这个:

HTTPPostData PostData = new HTTPPostData("id");
PostData.execute();
txtLabel.setText(PostData.Result);

你的问题是你正在对待asynctask就像它只是一个常规功能。将网页加载移出主线程是件好事,但是如果你依赖于下一条指令的结果,那么它对你没有好处,你仍然阻止主程序等待结果。您需要将AsyncTask视为“即发即弃”操作,在此操作中您不知道何时会返回。

在这里做的更好的事情是:

HTTPPostData PostData = new HTTPPostData("id");
PostData.execute();
txtLabel.setText("Loading...");

然后在asynctask:

protected void onPostExecute(String result) {
     txtLabel.setText(result);
}

这使得您的主线程可以在不知道asynctask的结果的情况下继续执行它的业务,然后只要数据可用,asynctask将使用结果填充文本标签。