一、了解Android网络基础
1、Android平台有三种网络接口可以使用
a、标准Java接口 java.net.*
b、Apache接口 org.apache.*(开源项目HttpClient)
c、Android网络接口 android.net.*
二、掌握Android应用的HTTP通信
1、HTTP:超文本传输协议(Hyper Text Transfer Protocol)
2、采用请求/响应模式
3、Android提供了HttpURLConnection和HttpClient接口
三、HttpURLConnection接口
1、HttpURLConnection是Java的标准类,继承自URLConnection类。他们都是抽象类无法实例化对象。
a、主要是通过URL的openConnection方法获得创建连接,代码如下:
URL ur l= new URL(“http://www.google.com”); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
b、默认使用Get方式,这需要通过url传递参数即可
URL url=new URL("http:www.google.com?parameter=bruce"); HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
c、使用Post方式,则需要setRequestMethod设置
// 设置以POST方式 urlConn.setRequestMethod("POST"); //设置连接超时时间,单位:毫秒 urlConn.setConnectTimeout(10*1000); //设置读取超时时间,单位:毫秒 urlConn.setReadTimeout(15*1000); //设置是否允许接收服务器端响应内容,默认true urlConn.setDoInput(true); //设置是否允许构建一个输出流向服务器传递数据,默认false urlConn.setDoOutput(true); //设置是否使用缓存,POST不能使用缓存 urlConn.useCache(false); //建立连接 urlConn.connect();
d、获取网络图片,只需要将得到的数据流转换成bitmap就可以了
//创建HttpURLConnection
HttpURLConnection conn=(HttpURLConnection)iamgeUrl.openConnection();//设置是否允许接收服务器端响应内容(默认为true) conn.setDoInput(true);//建立连接 conn.connect(); //构建输入流 InputStream stream=conn.getInputStream();//将数据流转换成Bitmap bitmap=BitmapFactory.decodeStream(stream);//关闭流 is.close();
四、HttpClient
一、Apache提供的HttpClient也适合我们在Android上开发互联网应用
1、ClientConnectionManager接口
a、客户端连接管理的接口
2、DefaultHttpClient
a、默认的HTTP客户端,可以使用创建HTTP连接
3、HttpResponse
a、一个Http连接响应,通过它可以得到返回的响应消息
二、实现步骤
1、使用HttpClient需要以下五个步骤;
a、使用DefaultHttpClient实例化HttpClient对象。
b、创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。
c、调用execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。
d、通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。
e、释放连接。无论执行方法是否成功,都必须释放连接。
2、使用Get方式提交请求
//HttpGet连接对象 HttpGet httpRequest = new HttpGet(httpUrl); //取得HttpClient对象 HttpClient httpclient = new DefaultHttpClient(); //请求HttpClient,取得HttpResponse HttpResponse httpResponse = httpclient.execute(httpRequest);
3、根据响应的代码判断请求是否成功
//请求成功 if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ }
4、代码(GET)
//构建HttpClient的实例 DefaultHttpClient httpClient=new DefaultHttpClient(); //创建Get实例 HttpGet get=new HttpGet("http://www.baidu.com"); try{ //发送请求并得到响应结果 HttpResponse res=httpClient.execute(get); //处理响应结果数据 if(res != null && res.getStatusLine().getStatusCode() == HttpStaatus.SC_OK){ System.out.println(EntityUtils.toString(res.getEmtity())); } }catch(Exception ex){ ex.printStackTrace(); }finally{ //释放资源 httpClient.getConnectionManager().shutdown(); }
5、使用Post方式提交请求
//HttpPost连接对象 HttpPost HTTPRequest=new HttpPost(httpUrl);
6、使用NameValuePair来保存要传递的参数
//使用NameValuePair来保存要传递的Post参数 List<NameValuePair>params=new ArrayList<NameValuePair>(); //添加要传递的参数 params.add(new BasicNameValuePair("pair","HttpClient_android_Post"));
7、同样是通过HTTP客户端提交请求
//设置字符集 HTTPEntity httpentity=new UrlEncodedFormEntity(params,"utf-8"); //请求httpRequest HttpRequest.setEntity(httpentity); //取得默认的HttpClient HttpClient httpclient=new DefaultHttpClient(); //提交请求 httpclient.execute(httpRequest);
8、代码POST
//构建HttpClient实例 DefaultHttpClient httpClient = new DefaultHttpClient(); //创建Post实例 HttpPost post = new HttpPost("http://www.baidu.com") //初始化请求参数 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("stuNo","123456")); params.add(new BasicNameValuePair("stuName","zhangsan")); params.add(new BasicNameValuePair("stuSex","男")); params.add(new BasicNameValuePair("stuTemp","1997-1-1")); params.add(new BasicNameValuePair("stuAddress","zhuhai")); try{ //设置请求参数,并以UTF-8方式编码 post.setEntity(new UrlEncodedFormEntity(params,"UTF-8")); //发送请求并得到响应结果 HttpResponse res=httpClient.execute(post); //处理响应结果数据 if(res != null && res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ System.out.println(EntityUtils.toString(res.getEntity())); } }catch(Exception ex){ ex.printStackTrace(); }finally{ //释放资源 httpClient.getConnectionManager().shutdown(); }
9、实时更新可以在客户端通过线程不听的请求并刷新页面
10、不能直接在线程中更新UI,需要使用Handler来实现,代码如下:
Handler mHandler=new Handler(){ public void handleMessage(Message msg){ super.handleMessage(msg); //刷新 refresh(); } }