Rxjava2.0和Retrofit简单封装使用

来源:互联网 发布:淘宝朗丝香格里拉窗帘 编辑:程序博客网 时间:2024/05/21 06:26

前言

    首先必须要声明的是,本文主要留作学习笔记,也供同样在学习的人一个参考,如有不足很正常。欢迎批评,批评使我进步。在此谢过。

切入主题

下面代码只是一个简单请求案例,废话少说,上代码。

栗子:

导包
    //retrofit2 转化器 gson    compile 'com.squareup.retrofit2:converter-gson:2.1.0'    //引进Rxjava2.0    compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
简单说下使用步骤,封装好的工具在后面上代码
    //这里的json变量是post请求的 key "data" 的 value        String json = new Gson().toJson(new TestBean("110"));        //初始化封装好的        RetrofitNetManager manager = new RetrofitNetManager<TestBean.TestResponse>(new RetrofitNetManager.ConnManCallBack<TestBean.TestResponse>() {            //在初始化对象RetrofitNetManager时传入回调接口            @Override            public void onError(Throwable t) {        //失败时调用            Log.e(TAG, "onComplete: "+t.getMessage() );            }            @Override            public void onComplete(TestBean.TestResponse response) {            //成功时调用                if (response!=null){                    Log.e(TAG, "onComplete: "+response.getName() );                }            }        });        //封装Retrofit的请求,Retrofit请求返回值一定是Call<T>类型        Call<TestBean.TestResponse> request = manager.getRetrofit().create(TestRetrofit.class).postxx("checkSignWalker", json);        manager.getResponse(request);
前期准备:单例模式有益于防止内存泄漏,比如okhttpclient对象,Retrofit对象

准备retrofit Api,不要问什么,retrofit和Rxjava 的单独使用百度有很多资料,如果有需要,之后我会专门准备一篇博客详细讲解。

public interface TestRetrofit {    @FormUrlEncoded    @POST("{url}.action")    Call<WelcomeActivity.TestBean.TestResponse> postxx(@Path(value = "url") String url, @Field(value = "data") String json);}

准备数据模型类,(这里推荐下GsonFormat,很好用的插件,谁用谁知道。)

public class TestBean{        private String phoneNumber;        public TestBean(String phoneNumber) {            this.phoneNumber = phoneNumber;        }        public class TestResponse{            private int code;            private String name;            public int getCode() {                return code;            }            public void setCode(int code) {                this.code = code;            }            public String getName() {                return name;            }            public void setName(String name) {                this.name = name;            }        }    }
//范型T是用于设置返回数据类型,通常实际开发的过程中网络请求获取到的json数据会被我们转化成具体类对象 public class RetrofitNetManager <T>{    private static OkHttpClient client;    private static final String BASE_URL = "*********";//    private Class<T> clazz;    private static final String TAG = "ym";    private ConnManCallBack callBack;    private Response<T> result;    private static Retrofit retrofit;    //获取okhttpclient    private OkHttpClient getClient(){        if (client==null){            OkHttpClient.Builder mBuilder = new OkHttpClient.Builder();            //信任https所有证书,详情见上一篇            mBuilder.sslSocketFactory(TrustAllCerts.createSSLSocketFactory());            mBuilder.hostnameVerifier(new TrustAllCerts.TrustAllHostnameVerifier());            //设置连接超时时间            mBuilder.connectTimeout(5, TimeUnit.SECONDS);            client = mBuilder.build();        }        return client;    }    //获取Retrofit对象    public Retrofit getRetrofit(){        //封装Retrofit对象        if (retrofit==null){            retrofit = new Retrofit.Builder()                    .baseUrl(BASE_URL)  //设置要连接的基础网址                    .client(getClient())     //设置处理本次网络请求的okhttpclient对象                    .addConverterFactory(GsonConverterFactory.create())//设置支持Gson解析                    .build();        }        return retrofit;    }    //重头戏来了,联网时调用的方法    public void getResponse(final Call<T> request){        //创建订阅者        Subscriber<String> subscriber = new Subscriber<String>() {            @Override            public void onSubscribe(org.reactivestreams.Subscription s) {                s.request(Long.MAX_VALUE);            }            @Override            public void onNext(String s) {                Log.e(TAG,"RetrofitNetManager onNext:执行了"+s);                request.enqueue(new Callback<T>() {                    @Override                    public void onResponse(Call<T> call, Response<T> response) {                        result = response;                        onComplete();                    }                    @Override                    public void onFailure(Call<T> call, Throwable t) {                        Log.e(TAG, "RetrofitNetManager onFailure:执行了 "+t.getMessage() );                        onError(t);                    }                });            }            @Override            public void onError(Throwable t) {                Log.e(TAG,"RetrofitNetManager onError:执行了"+t.getMessage());                callBack.onError(t);            }            @Override            public void onComplete() {                Log.e(TAG, "RetrofitNetManager onComplete:执行了 ");                callBack.onComplete(result.body());            }        };        Flowable.create(new FlowableOnSubscribe<String>() {            @Override            public void subscribe(FlowableEmitter<String> e) throws Exception {                Log.i(TAG, "subscribe: 111111");                e.onNext("");            }        }, BackpressureStrategy.BUFFER)                .subscribe(subscriber);    }    public RetrofitNetManager(ConnManCallBack callBack) {        this.callBack = callBack;    }//接口回调时的接口,灵活设置联网成功失败时的操作    public interface ConnManCallBack<T>{        void onError(Throwable t);        void onComplete(T response);    }
2 0
原创粉丝点击