android 开发中接触的各种网络请求框架总结

前言:开发中接触了不少网络请求的框架,包括Volley,HttpCliet AsyncHttpClient,Okhttp,OkhttpUtils,HttpUrlConnection,Retrofit。虽说一个项目顶多使用一种框架,但是 我们难免接触基于不同框架下开发的app,所以认识和了解它们就显得很有必要,而且,我很确定在你手中项目的基础上你可以很熟练的使用项目依赖的框架进行网络的访问请求,但是抛开你的项目,我感觉你会和我一样变得像一个idiot,只记得他们大概的使用情形,但是具体写每一行的代码,会让你无从下手,所以在此总结各种网络请求框架的使用方法就很有必要啦。

1、Volley

Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的。Volley 的特点:特别适合数据量小,通信频繁的网络操作。

优点

  1. 非常适合进行数据量不大,但通信频繁的网络操作。
  2. 内部分装了异步线程。
  3. 支持get,post网络请求。
  4. 图片下载。
  5. 可直接在主线程调用服务端并处理返回结果。
  6. 可以取消请求,容易扩展,面向接口编程。
缺点
  1. 对大文件下载 Volley的表现非常糟糕。
  2. 只支持http请求。
  3. 在BasicNetwork中判断了statusCode(statusCode < 200 || statusCode > 299),如果合条件直
  4. 图片加载性能一般。
  5. 使用的是httpclient,HttpURLConnection。不过在android 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar。
使用方法:

1. 创建一个RequestQueue对象。

2. 创建一个StringRequest对象。

3. 将StringRequest对象添加到RequestQueue里面。

GET:

RequestQueue mQueue = Volley.newRequestQueue(context);  
StringRequest stringRequest = new StringRequest("http://www.baidu.com",  
                        new Response.Listener<String>() {  
                            @Override  
                            public void onResponse(String response) {  
                                Log.d("TAG", response);  
                            }  
                        }, new Response.ErrorListener() {  
                            @Override  
                            public void onErrorResponse(VolleyError error) {  
                                Log.e("TAG", error.getMessage(), error);  
                            }  
                        }); 
mQueue.add(stringRequest);
POST:

StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {  
 <span style="white-space:pre">	</span>@Override  
   <span style="white-space:pre">	</span>protected Map<String, String> getParams() throws AuthFailureError {  
        Map<String, String> map = new HashMap<String, String>();  
        map.put("params1", "value1");  
        map.put("params2", "value2");  
          return map;  
  }  
};  

 有关Volley的用法可以参考郭神文章: 
 点击打开链接 
 

2、HttpClient

 在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端。它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET和HTTP POST调用。

使用步骤:

1.使用DefaultHttpClient类实例化HttpClient对象

2.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。

3.调用execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。

4.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。

GET:

   try {  
            //得到HttpClient对象  
            HttpClient getClient = new DefaultHttpClient();  
            //得到HttpGet对象  
            HttpGet request = new HttpGet(uri);  
            //客户端使用GET方式执行请教,获得服务器端的回应response  
            HttpResponse response = getClient.execute(request);  
            //判断请求是否成功    
            if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){  
                Log.i(TAG_STRING, "请求服务器端成功");  
                //获得输入流  
                InputStream  inStrem = response.getEntity().getContent();  
                int result = inStrem.read();  
                while (result != -1){  
                    System.out.print((char)result);  
                    result = inStrem.read();  
                }  
                //关闭输入流  
                inStrem.close();      
            }else {  
                Log.i(TAG_STRING, "请求服务器端失败");  
            }             
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
POST:

 BufferedReader in = null;  
        try {  
            HttpClient client = new DefaultHttpClient();  
            HttpPost request = new HttpPost("http://code.google.com/android/");  
            //使用NameValuePair来保存要传递的Post参数  
            List<NameValuePair> postParameters = new ArrayList<NameValuePair>();  
            //添加要传递的参数    
            postParameters.add(new BasicNameValuePair("id", "12345"));  
            postParameters.add(new BasicNameValuePair("username", "dave"));  
            //实例化UrlEncodedFormEntity对象  
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(  
                    postParameters);  
 
            //使用HttpPost对象来设置UrlEncodedFormEntity的Entity  
            request.setEntity(formEntity);  
            HttpResponse response = client.execute(request);  
            in = new BufferedReader(  
                    new InputStreamReader(  
                            response.getEntity().getContent()));  
 
            StringBuffer string = new StringBuffer("");  
            String lineStr = "";  
            while ((lineStr = in.readLine()) != null) {  
                string.append(lineStr + "\n");  
            }  
            in.close();  
 
            String resultStr = string.toString();  
            System.out.println(resultStr);  
        } catch(Exception e) {  
            // Do something about exceptions  
        } finally {  
            if (in != null) {  
                try {  
                    in.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
参考文章: 点击打开链接

3、AsyncHttpClient

1. 创建一个AsyncHttpClient;

 
2. (可选的)通过RequestParams对象设置请求参数;
 
3. 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类
代码实例:

GET:

// 初始化网络请求
        AsyncHttpClient client = new AsyncHttpClient();
   RequestParams params = new RequestParams();
   params.put("key", "value");
   params.put("more", "data");
   client.get("http://www.google.com", params, new
   AsyncHttpResponseHandler() {
       @Override
       public void onSuccess(int statusCode, Header[] headers, byte[] response) {
       System.out.println(response);
  }
 
       @Override
       public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
       Log.d("ERROR", error);
      }    
    }
);
POST:

调用post方法即可,其他部分不变

参考文章:点击打开链接

4、HttpUrlConnection

HttpURLConnection继承自URLConnection类,用它可以发送和接收任何类型和长度的数据,

且预先不用知道数据流的长度,可以设置请求方式get或post、超时时间。

代码实例:

 /** 
     * 获取指定URL的响应字符串 
     * @param urlString 
     * @return 
     */  
    private String getURLResponse(String urlString){  
        HttpURLConnection conn = null; //连接对象  
        InputStream is = null;  
        String resultData = "";  
        try {  
            URL url = new URL(urlString); //URL对象  
            conn = (HttpURLConnection)url.openConnection(); //使用URL打开一个链接  
            conn.setDoInput(true); //允许输入流,即允许下载  
            conn.setDoOutput(true); //允许输出流,即允许上传  
            conn.setUseCaches(false); //不使用缓冲  
            conn.setRequestMethod("GET"); //使用get请求  
            is = conn.getInputStream();   //获取输入流,此时才真正建立链接  
            InputStreamReader isr = new InputStreamReader(is);  
            BufferedReader bufferReader = new BufferedReader(isr);  
            String inputLine  = "";  
            while((inputLine = bufferReader.readLine()) != null){  
                resultData += inputLine + "\n";  
            }  
  
        } catch (MalformedURLException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }finally{  
            if(is != null){  
                try {  
                    is.close();  
                } catch (IOException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            }  
            if(conn != null){  
                conn.disconnect();  
            }  
        }  
  
        return resultData;  
    }  
5,okHttp,okHttpUtils,Retrofit

Square 公司开源的 OkHttp 是一个专注于连接效率的 HTTP 客户端。OkHttp 提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。

优点

  1. 支持http请求,https请求。
  2. 支持文件下载。
  3. 使用的是HttpURLConnection,不要担心android版本的变换。(至少目前是都支持的)。
  4. 支持get,post请求。
  5. 基于Http的文件上传。
  6. 加载图片。
缺点
  1. 比如callback回来是在线程里面, 不能刷新UI,需要我们手动处理。
  2. 封装比较麻烦。

这三个放在一起说是因为他们三个都是基于okhttp实现的,okHttpUtils是鸿洋大神对okhttp的封装,网上查了

很多资料,okHttp本身功能是很强大,也是现在很流行的网络请求框架,但是需要对其有一定的了解,并进行良好的

封装以后才能方便的使用,鸿洋大神在gitHub上就有封装以后的开源库okHttpUtils,连接点这里点击打开链接

Retrofit
这里因为不是很了解,直接推荐一篇文章,希望以后了解更多的Retrofit知识以后再来补充文章,点击打开链接


其他推荐文章


https://zhuanlan.zhihu.com/p/21879931


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值