RXjava是什么?
异步,一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库
RXjava好在哪儿?
简洁,异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的 AsyncTask
和Handler
,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
对于rxjava做出一个简单的栗子:
例如张三(观察者)想看某款新闻软件的科技信息(被观察者),由于科技信息是每天推送或者不定时推送,如果张三一直盯着手机屏幕看并且刷新消息是不是又新的信息,显然不现实。这时候就可以通过张三 subscribe(订阅)科技信息,而实现当有新的科技信息时自动给张三推送消息,在这期间,张三并不需要一直盯着屏幕刷新闻。在我们平时的认知中实现订阅应该是张三.subscribe(科技新闻),不过在RxJava代码中实现订阅应该写成科技新闻.subscribe(张三)。
这个功能的入门还是比较难懂的。但是代码确实做到了简洁明了,很有逻辑性,本人也是今天刚对此进行了简单的练习,对概念性的东西还是似懂非懂的样子,很朦胧。但我体会到他的奇妙之处在哪儿,今天我在工作中简单运用了Retrfit+rxjava的结合运用。了解不是很多,只是做出今天对新知识点的一个总结。
接下来本人展示一下今天对retrfit+rxjava的成果吧。
//首先就是依赖
compile 'com.squareup.retrofit2:retrofit:2.0.1'
compile 'com.google.code.gson:gson:2.8.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
//开始进入代码吧。
//retrfit的接口进行封装方便调用,请求方式是注解的方式。单纯的retrfit是返回Call
接口地址需要拼接就拼接,不需要直接不管就可以,retrfit+rxjava就需要返回observabl
e(被观察者)url地址以“/”结尾
public interface Retrfit_server {
public static final String BASE_PATH = "http://service.meiyinkeqiu.com/service/";
public static final String BASE_URL="https://api.github.com/";
@GET("ads/cptj")
Observable<GuangGaoBean> DownGet();
@GET("users/{user}")
Observable<Baidu> downget(@Path("user")String user);
}
//创建Retrfit对象。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(Retrfit_server.BASE_URL)
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
//增加返回值为Oservable<T>的支持
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
//这里采用的是Java的动态代理模式
Retrfit_server server = retrofit.create(Retrfit_server.class);
//传入我们请求的键值对的值
Observable<Baidu> observable = server.downget("baiiu");
//创建Observer
observable.subscribeOn(Schedulers.io())//指定线程io线程 做耗时操作 把耗时的网络请求放在子线程(io线程)
//主线程更新 观察到结果后,把处理结果放在ui主线程
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Func1<Baidu, Observable<Baidu>>() {
@Override
public Observable<Baidu> call(Baidu baidu) {
return Observable.just(baidu);
}
})
.subscribe(new Observer<Baidu>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Baidu baidu) {
Log.i("1111",baidu.toString());
}
});
}