retrofit+RxJava+okhttp简便封装实现网络请求(详解)

来源:互联网 发布:mac mobi 制作软件 编辑:程序博客网 时间:2024/05/18 20:36

写在开头

在开发中,掉接口请求数据时再平常不过的事情了,如何让这个过程更简单更适合自己感觉很重要。最近项目对此进行了一下简单的封装,用着挺好。提供给大家共同学习,也希望提出意见,共同进步。

自定义Interceptor拦截器工具类

本工具类用于打印okhttp的响应,辅助开发
    public class NetConfig implements Interceptor {        private static NetConfig instance;        private OkHttpClient client;        private Gson gson;        //单例的方式创建本类对象        public static NetConfig getInstance() {            if (instance == null) {                synchronized (NetConfig.class) {                    instance = new NetConfig();                }            }            return instance;        }        //创建OkHttpClient对象,并指定读取,写入,连接超时时间,添加okhttp拦截器        public OkHttpClient getClient() {            if (client == null)                client = new OkHttpClient.Builder()                        .readTimeout(30, TimeUnit.SECONDS)                        .writeTimeout(30, TimeUnit.SECONDS)                        .connectTimeout(30, TimeUnit.SECONDS)                        .addInterceptor(this)                        .build();            return client;        }        public Gson getGson() {            if (gson == null)                gson = new GsonBuilder()                        .enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式                        .create();            return gson;        }        //打印请求和响应的基本信息,辅助开发        @Override        public Response intercept(Chain chain) throws IOException {            Request request = chain.request();            long t1 = System.nanoTime();            Request.Builder builder = request.newBuilder();            Response response = chain.proceed(builder                    .build());            Log.e("tag", "request:" + request.toString());            long t2 = System.nanoTime();            okhttp3.MediaType mediaType = response.body().contentType();            Log.e("tag", mediaType.toString());            if ("application/json; charset=utf-8".equals(mediaType.toString())) {                Log.e("tag", String.format(Locale.getDefault(), "Received response for %s in %.1fms%n%s",                        response.request().url(), (t2 - t1) / 1e6d, response.headers()));                String content = response.body().string();                Log.e("tag", "response body:" + content);                return response.newBuilder()                        .body(okhttp3.ResponseBody.create(mediaType, content))                        .build();            }            return response;        }

编写retrofit工具类

    public class RetorfitUtil {        private static RetorfitUtil instance;        private Retrofit retrofit;        private Gson gson;        private RetorfitUtil() {            retrofit = new Retrofit.Builder()                    //配置主机地址,baseUrl必须以斜杠结尾                    .baseUrl(ApiUrls.BaseUrl)                    //设置自己定义的okhttpclient                    .client(new NetConfig().getClient())                    //解析json的工具                    .addConverterFactory(GsonConverterFactory.create(gson))                    //支持RxJava                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                    .build();        }        /**         * 静态内部类         */        public static RetorfitUtil getInstance() {            if (instance == null) {                synchronized (RetorfitUtil.class) {                    instance = new RetorfitUtil();                }            }            return instance;        }        /**         * 得到ResponseInfoAPI的对象         *         * @return         */        public ResponseInfoAPI create() {            return retrofit.create(ResponseInfoAPI.class);        }    }

创建类编写url和创建一个retrofit接口(这一部分根据项目自己发挥就好)

    public class ApiUrls {    //主机地址(以斜杠结尾  注意注意注意注意注意注意注意)    public static final String BaseUrl = "http://192.168.2.202:8080/";    //登录    public static final String login = "user/login";    }
    //retrofit注解请移步 http://blog.csdn.net/qiang_xi/article/details/53959437    public interface ResponseInfoAPI {        //登录        @POST(ApiUrls.login)        @FormUrlEncoded        Observable<TopResponse<LoginInfo>> getLoginData(@Field("username") String username, @Field("password") String password);    }

封装使用

    //得到retrofit对象并发起网络请求    RetorfitUtil.getInstance().create().getLoginData(username, pwd)        //指定调度器  用于IO密集型任务,异步阻塞IO操作,这个调度器的线程池会根据需要增长(常用)       .subscribeOn(Schedulers.io())        //此调度器为RxAndroid特有,指定数据接收发生在UI线程       .observeOn(AndroidSchedulers.mainThread())       //类型转换   在onNext中变成你想要的类型 FlatMap可以改变原始Observable变成另外一个Observable       .flatMap(new Func1<TopResponse<LoginInfo>, Observable<LoginInfo>>() {           @Override           public Observable<LoginInfo> call(TopResponse<LoginInfo> loginInfoTopResponse) {           }       })       .subscribe(new Subscriber<LoginInfo>() {           @Override           public void onCompleted() {        //这里开发中基本不用           }           @Override           public void onError(Throwable e) {              //失败的回到           }           @Override           public void onNext(LoginInfo loginInfo) {               //成功的回调,在这里就是你flat中想要的数据           }       });        //RXJava还没详细总结,更多请移步http://blog.csdn.net/xx326664162/article /details/52068014 个人感觉挺好

写在后面

这是个人的一个在使用中的一个简单的总结,供大家参考。当然你有什么意见也挺发出来,一起讨论,共同进步。
阅读全文
0 0
原创粉丝点击