一、了解 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 方法获得创建连接,代码如下:
b、默认使用 Get 方式,这需要通过 url 传递参数即可
- URL ur l = new URL("http: //www.google.com");
- HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
- 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();
- }
- }
来源: http://www.bubuko.com/infodetail-2440062.html