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

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

    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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值