网络请求框架对比

在Android开发中有很多网络请求框架,常用的是OkHttp以及以下两个:

  • Volley:Google发布的网络请求框架,专门为移动设备定制,小而美。

  • Retrofit:良心企业 Square由大神JakeWharton主导的开源项目,是基于OkHttp封装的一套Resetful网络请求框架。

OkHttp的使用

  • OkHttp现在最新的的版本在github上是3.5.0,它是来自Square公司。有以下几个优点:
    • 支持 SPDY1 ,允许连接同一主机的所有请求分享一个socket。
    • 如果SPDY不可用,会使用连接池减少请求延迟。
    • 使用GZIP压缩下载内容,且压缩操作对用户是透明的。
    • 利用响应缓存来避免重复的网络请求。
  • 接下来看下简单的使用说明:

1.在gradle中配置:

compile 'com.squareup.okhttp3:okhttp:3.5.0'

2.初始化OkHttpClient对象以及Request对象

OkHttpClient mOkHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(uri).build();
  • OkHttp支持同步和异步请求
  • OkHttp同步请求的时候,执行execute()方法,返回一个Response对象,在这里会阻塞线程,直到响应结束,所以是不能在主线程中执行。这里是无返回值的。
Response response = mOkHttpClient.newCall(request).execute();
  • OkHttp异步请求的时候,执行enqueue()方法,在enqueue()中实现一个Callback接口,因为这个操作是异步的,所以可以在主线程中使用。说的是响应数据是异步的,但是不能直接再此更新UI组件,因为他是在okhttp线程中,直接在此更新UI会报错。也许你会想到用Message对象将数据传到主线程中,使用Handle来接收并更新UI。而我这里使用的是Rxjava嵌入内部,被观察者获取到数据后传递给观察者,指定观察者的线程是Main主线程,就可以很方便的更新数据了。
 mOkHttpClient.newCall(request).enqueue(new Callback() { 
   @Override   
   public void onFailure(Call call, IOException e) {     
       Log.i("lgq","error:"+e);   
     }   
   @Override   
     public void onResponse(Call call, Response response) throws IOException {  
        Log.i("lgq","okhttp response:"+response);  
        //封装了观察者对象代码
        RequestObserable.responNetRequset(mRecyclerview,response.body().string(),getApplicationContext());    
    }
});
  • 贴出RequestObserable代码:
public static void responNetRequset(final RecyclerView mRecyclerview, String result, final Context context) {

        Gson gson = new Gson();
        final NewsInfo newsInfo = gson.fromJson(result, NewsInfo.class);
        Observable.create(new ObservableOnSubscribe<List<Contents>>() {
            @Override
            public void subscribe(ObservableEmitter<List<Contents>> e) throws Exception {
                e.onNext(newsInfo.getResult().getList());
                e.onComplete();
            }
        }).observeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<List<Contents>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.i("lgq", "onSubscribe");
                    }

                    @Override
                    public void onNext(List<Contents> value) {
                        System.out.println("onNext()----Thread:" + Thread.currentThread().getName());
                        RecycleAdapter mAdapter = new RecycleAdapter(context, value);
                        //适配器实现监听事件
                        itemOnClick(mAdapter);
                        mRecyclerview.setLayoutManager(new LinearLayoutManager(context));
                        mRecyclerview.setAdapter(mAdapter);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("lgq", "onError:" + e);
                    }

                    @Override
                    public void onComplete() {
                        Log.i("lgq", "onComplete()");
                    }
                });
    }

Volley的使用

Volley现在最新的的版本在github上是1.0.19,在2013年Google I/O大会上推出的网络通信框架。适用于进行数据量不大,但通信频繁的网络操作。

  • 简单的使用例子:
  • 配置gradle
compile 'com.mcxiaoke.volley:library:1.0.19'
  • 在Application中配置全局单例的RequestQueue对象
 //volley请求队列
    public static RequestQueue requestQueue;

    public static RequestQueue getRequestQueue(){
        return requestQueue;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //初始化请求队列
        requestQueue = Volley.newRequestQueue(getApplicationContext());
    }
  • Volley有StringRequest
    请求对象和JsonRequest请求对象,这里以JsonRequest为例:response即为响应返回获得的json数据。RequestObserable在上面已经解释了。
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, uri, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.i("lgq","volley response:"+response);
                RequestObserable.responNetRequset(mRecyclerview,response.toString(),getApplicationContext());
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("lgq","volley error:"+error);
            }
        });
        //setting tag for cancel
        jsonObjectRequest.setTag(VO_GET_TAG);
        App.getRequestQueue().add(jsonObjectRequest);
  • 在最后onStop()方法中关闭请求队列。
 @Override
    protected void onStop() {
        super.onStop();
        //activity关闭的的时候取消请求队列
        App.getRequestQueue().cancelAll(VO_GET_TAG);
    }

Retrofit的使用

Retrofit现在最新的的版本在github上是2.1.0,也是Square公司的产品,Retrofit在2.0之后的版本和之前的变化很大,做出了优化和简化,所以直接引入的是2.1.0版本。Retrofit的特点:

  1. 它是一个可以用于Android和java的网络库,使用它可以简化我们网络操作的工作,提高效率和正确率。
  2. gradle引入,这里还引入了自己的gson库,可实现将Json数据转换为java对象。
 //retrofit
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
  • 将rest
    API封装为java接口,我们根据业务需求来进行接口的封装,实际开发可能会封装多个不同的java接口以满足业务需求。(注解的形式)
public interface RetrofitService {
    @GET("get")
    Call<NewsInfo> getListDatas(
            @Query("channel")String str,
            @Query("start")String start,
            @Query("num")int num,
            @Query("appkey")String appkey
            );
}
  • 使用Retrofit生成接口实例。
 Retrofit retrofit = new Retrofit.Builder()
                //设置baseUrl,注意baseUrl 应该以/ 结尾。
                .baseUrl("http://api.jisuapi.com/news/")
                //使用Gson解析器,可以替换其他的解析器
                .addConverterFactory(GsonConverterFactory.create())
                .client(new OkHttpClient())
                .build();
        //利用Retrofit 创建服务接口
        RetrofitService retrofitService = retrofit.create(RetrofitService.class);
  • rest风格,更安全和高效。
  • 通过接口实例实现Call方法,而且实现Callback接口是异步请求,但是onResponse(),onFailure()都是在主线程中运行的。可以用来更新UI操作。
 //实现接口参数
        Call<NewsInfo> call = retrofitService.getListDatas("头条","0",20,BaseActivity.getAPPKEY());

        //执行异步请求,这里的onResponse(),onFailure()都是在主线程中运行的
        call.enqueue(new Callback<NewsInfo>() {
            @Override
            public void onResponse(Call<NewsInfo> call, Response<NewsInfo> response) {
                if (response.isSuccessful()){
                    RecycleAdapter mAdapter = new RecycleAdapter(getApplicationContext(),response.body().getResult().getList());      //初始化适配器
                    RequestObserable.itemOnClick(mAdapter);                             //item监听时间
                    mRecyclerview.setLayoutManager(linearLayoutManager);
                    mRecyclerview.setAdapter(mAdapter);
                }

            }

            @Override
            public void onFailure(Call<NewsInfo> call, Throwable t) {
                Log.i("lgq","onFailure:"+t);
            }
        });
  • 操作上明显是比volley和okhttp简单多了。

retrofit-2.1.0.jar大小为86.2K。

作者:程川
链接:网络请求框架对比

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值