重要知识点:
一、使用HttpClient步骤:
1.HttpClient是一个接口,一般情况下建立一个DefaultHttpClient的实例:
HttpClient httpClient=new DefaultHttpClient();
2.如果向服务器请求数据,则用建立HttpGet发起get请求:
HttpGet httpGet=new HttpGet(url);注:rul为String类型,内容是访问地址
3.再把httpGet对象传入httpClient的execute方法即可:
httpClient.execute(httpGet);
4.如果发起的post请求,则需要建立一个HttpPost的实例:
HttpPost httpPost=new HttpPost(url);
相应地,向服务器提交的数据,通常放入NameValuePair集合的实例中,再将它封装进UrlEncodeFormEntity中,然后调用httpPost.setEntity()方法:
List<NameValuePair>params =new ArrayList<NameValuePair();
通常地,会将Json转换为request参数
params.add(new BasicNameValuePair("request", params1.toString()));
UrlEncodedFormEntity urlEncodedFormEntity= new UrlEncodedFormEntity(params, HTTP.UTF_8);
httpPost.setEntity(urlEncodeFormEntity);
5.再将httpPost传入httpClient.execute()方法中:
HttpResponse httpResponse=httpClient.execute(httpPost)
通常地,当httpClient想服务器提交post后,则会返回一个HttpResponse实例,httpResponse对象中存储服务器返回的数据。
6.通过判断if(httpResponse.getStatusLine().getStatusCode()==200){
//请求和响应都成功了
HttpEntity entity=httpResponse.getEntity();
String response=EntityUtils.toString(entity);参考资料(第一行代码)
}
二、访问网络的技巧:
1.网络访问经常需要用到。因此,可将访问网络的方法提取到工具类中,以便重用。
2.网络访问是耗时操作,因此需要开启子线程进行。另外如果开启子线程访问网络,并想要得到服务器返回的数据,定义一个监听的回调方法,将数据返回。
3.如果需要根据返回数据更新UI界面,则需要在回调方法中调用handler.sendMessage()通知UI线程更新界面,切忌在子线程更新会产生阻塞错误。
附:HttpUtil代码:
1.HttpUtil类
public class HttpUtil {
/**
* <p>网络访问服务,向服务器请求登陆
* @param address:请求地址;
* @param HttpCallbackListener:网络访问监听引用;
* @param account:账号
* @param password:密码
* */
public static void postHttpJson(final String address,final HttpCallbackListener listener,final String account,final String password){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
HttpClient httpClient=new DefaultHttpClient();
HttpPost httpPost=new HttpPost(address);
JSONObject params1 = JsonBuilder.jsonData(account, password);
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("request", params1.toString()));
UrlEncodedFormEntity urlEncodedFormEntity= new UrlEncodedFormEntity(params, HTTP.UTF_8);
Log.i("json", params1.toString());
httpPost.setEntity(urlEncodedFormEntity);
HttpResponse httpResponse=httpClient.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode()==200) {
HttpEntity entity=httpResponse.getEntity();
String response=EntityUtils.toString(entity);
if (listener!=null) {
listener.onFinish(response);
Log.i("response", response);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
if (listener!=null) {
listener.onError(e);
}
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
2.HttpCallbackListener:
//写了一个接口,定义回调约定:onFinish()、onError(),将HttpCallbackListener的对象引用以参数的方式传递到HttpUtil的静态方法postHttpJson()中,当用户发起网络访问请求调用postHttpJson()时,将会实现HttpCallbackListener接口的匿名内部类对象,调用接口定义的好回调方法。
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception exception);
}