RXjava是什么?
异步,一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库
RXjava好在哪儿?
简洁,异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的 AsyncTask
和Handler
,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
对于rxjava做出一个简单的栗子:
例如张三(观察者)想看某款新闻软件的科技信息(被观察者),由于科技信息是每天推送或者不定时推送,如果张三一直盯着手机屏幕看并且刷新消息是不是又新的信息,显然不现实。这时候就可以通过张三 subscribe(订阅)科技信息,而实现当有新的科技信息时自动给张三推送消息,在这期间,张三并不需要一直盯着屏幕刷新闻。在我们平时的认知中实现订阅应该是张三.subscribe(科技新闻),不过在RxJava代码中实现订阅应该写成科技新闻.subscribe(张三)。
这个功能的入门还是比较难懂的。但是代码确实做到了简洁明了,很有逻辑性,本人也是今天刚对此进行了简单的练习,对概念性的东西还是似懂非懂的样子,很朦胧。但我体会到他的奇妙之处在哪儿,今天我在工作中简单运用了Retrfit+rxjava的结合运用。了解不是很多,只是做出今天对新知识点的一个总结。
启蒙网址:http://gank.io/post/560e15be2dca930e00da1083#toc_1 很详细的讲解了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()); } }); }