我是一个相对较新的Android开发人员,我无法理解如何执行此操作。我一直在研究所有的论坛,我做了一些进步,但仍然在这里。 因此,我想要做的是将POST请求发送到网页(它只发送一个POST参数)并将结果作为字符串返回的常用函数。 我这里的主线程用异步发送HttpPost并获取字符串结果
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;
}
}
我想要使用此功能几次(同一个活动中或以相同的其他活动分享应用)。我现在有点混乱,所以我需要你的帮助。我的理解是,我在doInBackground()完成之前要求结果,并且得到一个空的结果。
在此先感谢您的帮助
我更喜欢在应用程序的不同情况下拥有一个公共类,但现在我发现我必须为每个类创建一个异步类。例如,如果我想获取一个数字,然后将其与存储在SharedPrefferences中的其他数据进行比较,然后获取一个字符串并将其显示在某个TextView上,则必须为这些操作中的每一个创建一个单独的类,其中包含几乎相同的代码。正如我所想的,异步类不能创建两次。 – ali 2012-03-31 21:25:18
@ali我会把所有的Http-to-String的东西放到一个常用的实用函数中,然后为每个你想获得互联网数据的地方创建一个准系统AsyncTask,它只是调用你的通用函数,然后描述你的回调结果想在onPostExecute。它可能感觉被浪费了创造多种asynctask,但他们每个人都必须执行不同的回调。也许有一个更清洁的方式,但我不确定。也许你可以创建一个抽象的asynctask类,然后覆盖你想要使用它的每个地方的onPostExecute。 – Tim 2012-03-31 21:51:06
这就是我所做的。谢谢! – ali 2012-04-03 17:04:42