RxAndroid+Retrofit+Rxbinding+RxBus先用再懂(1)

来源:互联网 发布:tplink天线为什么知乎 编辑:程序博客网 时间:2024/06/05 22:46

我是一个不啰嗦的程序猿。

    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'//retrofit for rxjava    compile 'com.squareup.retrofit2:converter-gson:2.0.2'//gson    compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'    compile 'com.squareup.okhttp3:okhttp:3.0.1'    compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'    compile 'com.jakewharton.rxbinding:rxbinding-leanback-v17:0.4.0'    compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'    compile 'com.squareup.retrofit2:retrofit:2.0.2'

这就开始了,是不是很突然。
最近有一个比较无语的BUG。由于retrofit更新换代,我在引入的时候。其中一个包引入了beat版本,结果一运行就报错,一开始还纳闷,然后试了各种方法,都没找到原因。最终的结论就是版本最好一起更新….

这里推荐一个当rxjava报错的时候logcat又不能正常报错的时候的方法。

 RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() {      @Override      public void handleError(Throwable e) {      } });

我们先从Rxbingding开始。
我们先从问候大牛开始。向大神致敬
用法就是先导包。

//Platform bindings:compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'//'support-v4' library bindings:compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'//'appcompat-v7' library bindings:compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.4.0'//'design' library bindings:compile 'com.jakewharton.rxbinding:rxbinding-design:0.4.0'//'recyclerview-v7' library bindings:compile 'com.jakewharton.rxbinding:rxbinding-recyclerview-v7:0.4.0'//'leanback-v17' library bindings:compile 'com.jakewharton.rxbinding:rxbinding-leanback-v17:0.4.0'

针对不同控件、不同版本的支持。
Rxbingding最好的运用场景在与定时操作、循环操作。还有不能重复点击。

Button button=(Button)findViewById(R.id.bt_button);//判断短时间内不能重复点击RxView.clicks(button).debounce(300, TimeUnit.MILLISECONDS).subscribe(new Action1<Void>() {            @Override     public void call(Void aVoid) {        Intent intent =new Intent(MainActivity.this,SecondActivity.class);        startActivity(intent);        finish();     }});//轮询操作,每两秒执行一次Observable.interval(2,2,TimeUnit.SECONDS).subscribe(new Action1<Long>() {    @Override    public void call(Long aLong) {        //TODO EVERTHING YOU WANT    }});//定时操作,两秒后执行Observable.timer(2, TimeUnit.SECONDS).subscribe(new Action1<Long>() {    @Override    public void call(Long aLong) {        //TODO WHAT YOU WANT        RxBus.getInstance().post("我喜欢你");    }});

是不是非常方便,ok,你只要回答是就好了。

接下来单独的Retrofit,
首先我们定义一个interface

public interface ApiService {    @GET("tnfs/api/list")    Call<TestModel> getModel(@Query("id") int id);}

然后利用从网上得到的json串自动生成model。推荐插件:
GsonFormat
可直接在androidstudio的插件管理那下载,安装完以后按Alt+s自动弹出,非常方便。
这里我们将Model命名为TestModel。名字一看就很有内涵。

retrofit脱胎于okhttp,所以使用方式比较像:

/** * 用Retrofit请求网络 */private void init() {    //拦截器    HttpLoggingInterceptor http=new HttpLoggingInterceptor();    http.setLevel(HttpLoggingInterceptor.Level.BODY);    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(http).build();    Retrofit retrofit=new Retrofit.Builder()            .baseUrl("http://www.tngou.net/")   //这里用的天狗云的公共api            .addConverterFactory(GsonConverterFactory.create())            .client(client)            .build();    ApiService apiService = retrofit.create(ApiService.class);    Call<TestModel> call=apiService.getModel(1);    call.enqueue(new Callback<TestModel>() {        @Override        public void onResponse(Call<TestModel> call, Response<TestModel> response) {            Log.e("TAG","成功");        }        @Override        public void onFailure(Call<TestModel> call, Throwable t) {        }    });}

当然baseUrl最好定义一下,我这里为了更直观的了解所以直接填了网址,注意baseUrl最后最好都加“/”。

很简单是不是。一开始都这样。

接下来我们来将Rxjava跟retrofit结合一下:

/** * 用rxAndroid + Retrofit请求网络数据 */public void init2(){    Retrofit retrofit=new Retrofit.Builder()            .baseUrl("http://www.tngou.net/")            .addConverterFactory(GsonConverterFactory.create())            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())            .build();    ApiService apiService = retrofit.create(ApiService.class);    apiService.getNewModel(1)            .subscribeOn(Schedulers.io())            .observeOn(AndroidSchedulers.mainThread())            .subscribe(new Subscriber<TestModel>() {                @Override                public void onCompleted() {                    Log.e("TAG","onNext");                }                @Override                public void onError(Throwable e) {                    Log.e("TAG","onError="+e);                }                @Override                public void onNext(TestModel testModel) {                    Log.e("TAG","onNext");                    Log.e("TAG","onNext"+testModel.getTngou().get(0).getTitle());                }            });}

我们这里先只讲用法。下期我们再结合源码去将这些方法有什么作用。

RxBus
大家对于数据传输,可能用的比较多的比如eventbus
RxBus其实只是rxjava的一个小运用。
首先我们封装一下RxBus.

public class RxBus {    private final Subject<Object, Object> rx_bus;    //单例    private static class RxBusHolder {        private static final RxBus instance = new RxBus();    }    private RxBus() {        rx_bus = new SerializedSubject<>(PublishSubject.create());    }    public static synchronized RxBus getInstance() {        return RxBusHolder.instance;    }    public void post(Object o) {        rx_bus.onNext(o);    }    public <T> Observable<T> toObserverable(Class<T> eventType) {        return rx_bus.ofType(eventType);    }}

在发送信息界面

 RxBus.getInstance().post("对不起,你是个好人");

在接收界面

  Subscription mSubscription = RxBus.getInstance().toObserverable(String.class).subscribe(new Action1<String>() {            @Override            public void call(String s) {                Log.e("","s="+s);            }        });

当然,在适当的时候要回收资源对不对,毕竟它给我发了好人卡,不能忍。

//取消订阅mSubscription.unsubscribe();

OK,这些玩意的简单运用就是这样,接下来我会将这些玩意封装一下,让我们更好的去调用他们。
源码:
他让我写链接内容

0 0
原创粉丝点击