您的位置:首页 > 移动开发 > Android开发

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

2016-06-21 18:03 633 查看
我是一个不啰嗦的程序猿。

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() {

a387
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,这些玩意的简单运用就是这样,接下来我会将这些玩意封装一下,让我们更好的去调用他们。

源码:

他让我写链接内容
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息