我正在从我的android设备执行HTTP Post
,但由于某种原因,post
在几秒钟内执行,但屏幕仍然冻结了18或20秒以上。
我使用的代码是:
public boolean CommentPost(String comment, String requestId, String deviceId){
List<NameValuePair> params = new ArrayList<NameValuePair>(6);
params.add(new BasicNameValuePair("requestId", requestId));
params.add(new BasicNameValuePair("comment", URLEncoder.encode(requestId)));
params.add(new BasicNameValuePair("deviceId", URLEncoder.encode(deviceId)));
return ExecutePost(params, "Comment/Add");
}
private boolean ExecutePost(List<NameValuePair> params, String url){
String queryString = RewriteParams(params);
url = BaseURL + url + queryString;
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
httppost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = httpclient.execute(httppost);
return true;
} catch (ClientProtocolException e) {
return false;
} catch (IOException e) {
return false;
}
}
我用ajax和一些Http客户端(如postman)测试了该行为,执行请求并获得响应的时间不到1或2秒。为什么在安卓系统中要花更多的时间?
class Check extends AsyncTask<String, Integer, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
//Add main arguments here; Connection that reffers to other methods but
String queryString = RewriteParams(params);
url = BaseURL + url + queryString;
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
httppost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = httpclient.execute(httppost);
return true;
} catch (ClientProtocolException e) {
return false;
} catch (IOException e) {
return false;
}
return null;
}
}
并执行如下命令:
new Check().execute("http://website.com");
如果你愿意,你可以在那里添加URL。如果是固定链接,则不需要。
你添加了这样你就可以在主线程上运行连接的东西,但我相信你的线程不是为它正确构建的。可以这样解释:
while(bool = true){
connection code
}
rendering code
当它连接并执行所有这些操作时,由于连接需求,其他任务无法执行。运行异步允许你在不干扰主线程的情况下连接。
如果你需要不同于String, Integer和Boolean的参数,记住第一个变量是doInBackground中的参数最后一个参数将是返回值