我是一个相对新的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()完成之前我要求的结果,我得到一个空结果。
提前感谢您的帮助
答案 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将使用结果填充文本标签。