RxJavaAndroid 进阶Android开发

一个老程序猿的焦虑4

2017-11-05  本文已影响59人  刻薄小北

一、写在前面


二、进入正题

相信,在当今这个Android大环境下,如果你不会Retrofit或者RxJava, 你都不好意思出门。所以今天,简单分享一下Retrofit+RxJava实现简单的网络请求。

2.1 前言

2.2 封装OkHttpClient对象

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(NetConifg.getCookieJar())
                .addInterceptor(NetConfig.getInterceptor())
                .connectTimeout(NetConfig.getConnectionTimeout(), TimeUnit.SECONDS)
                .readTimeout(NetConfig.getReadTimeout(), TimeUnit.SECONDS)
                .sslSocketFactory(NetConfig.getSslContext().getSocketFactory())
                .hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
                .build();
  • OkHttpClient对象的创建相对比较简单,不过我们可以将其封装进工厂里,从而达到复用的效果。

2.3 封装初始化方法

    public static void init(String baseUrl) {
        if (retrofit == null) {
            synchronized (RetrofitHandler.class) {
                if (retrofit == null) {
                    retrofit = new Retrofit.Builder()
                            .baseUrl(baseUrl).client(client)
                            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                            .addConverterFactory(JacksonConverterFactory.create(objectMapper))
                            .build();
                }
            }
        }
    }
  • 可以看到其实就是使用单例模式生成了Retroift对象,需要传入的参数只有url。

2.4 封装具体调用的方法

    public static <T> T getService(final Class<T> service) {
        T result = (T) serviceCache.get(service);
        if (result == null) {
            result = (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[]{service},
                    new InvocationHandler() {
                        T t = (T) retrofit.create(service);

                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            return ((Observable) Proxy.getInvocationHandler(t)
                                    .invoke(t, method, args))
                                    .compose(NetConfig.getThreadTransformer())
                                    .flatMap(NetConfig.getServerErrorInterceptor());
                        }
                    });
            serviceCache.put(service, result);
        }
        return result;
    }
  • 这个方法是我们以后网络请求常用的一个前置方法,其实就是根据传入的接口的Class生成对应的对象。

2.5 具体使用

终于到了实战了,还真是有点小激动呢。好吧,没啥好激动的。。。

    NetManager.init("http://192.168.9.23:90/apps-server/");
    public interface BlogService {
    @GET(NetConfig.GET_BLOG)
    Observable<JsonResult<List<Blog>>> getAllBlog(@Query("userId") String userId);
}
    NetManager.getService(BlogService.class).getAllBlog(userId)
                .subscribe(new Subscriber<JsonResult<MsgThruOF>>() {
                    @Override
                    public void onStart() {
                        super.onStart();
                        //做一些准备工作
                    }
        
                    @Override
                    public void onNext(List<String> strings) {
                        //对具体请求到的数据做处理
                    }
        
                    @Override
                    public void onCompleted() {
        
                    }
        
                    @Override
                    public void onError(Throwable e) {
        
                    }
                });
  • 配合RxJava调用接口非常的方便,而且完全是链式编程,代码结构看起来也很舒服。

三、分享部分

今天首先推荐三个公众号,感兴趣的同学,希望大家一起学习,一起成长。
提前声明:这三个公众号跟我半毛钱关系都没有,纯属义务推广。

3.1 码农每日一题

  • 也许每天只需要花费几分钟时间,你就可以掌握一个技术面试知识点。

3.2 老马说编程

  • 从入门到高阶、深入浅出,带你领略编程和计算机技术的本质。

3.3 码农翻身

  • 作者有15年的IBM架构师经验,以戏谑的方式带你走进计算机的世界。

四、最后

大家晚安。

本人微信,有兴趣的,加一波
阅读原文
上一篇 下一篇

猜你喜欢

热点阅读