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。推荐插件:
可直接在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,这些玩意的简单运用就是这样,接下来我会将这些玩意封装一下,让我们更好的去调用他们。
源码:
他让我写链接内容
- RxAndroid+Retrofit+Rxbinding+RxBus先用再懂(1)
- RxJava RxAndroid Retrofit RxBus Dragger2 OkHttp MVP MVVM DataBinding
- RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava 和 RxAndroid 四(RxBinding的使用)
- 学习--RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava 和 RxAndroid 四(RxBinding的使用)
- RxJava RxAndroid RxBus入门
- Retrofit2.0+RxAndroid+RxBus
- retrofit rxandroid
- Android RxJava RxAndroid Rxbinding 库
- RxJava2+Retrofit+RxBinding
- JAVA多态性的深刻理解
- 对redis数据持久化的一些想法
- jquery延迟执行
- 使用CocoaAsyncSocket适配IPv6
- POJ-1852 Ants
- RxAndroid+Retrofit+Rxbinding+RxBus先用再懂(1)
- 加密测试
- 关于7620a的固件编译移植openwrt总结
- React+Flux 新手入门开发套件、模组、实例 ( gulp 自动检查,编译 )
- Codeforces #354D (Div. 2) 暴力BFS
- jQuery.extend 函数详解
- Unity-Unity3D与IOS交互开发
- python 字符串处理心得
- 领导四系统模型,你是哪一种?