发表于 2016-7-7 12:25

申请ID:lijsz124

1、申请ID:lijsz124
2、个人邮箱:83386041@qq.com
3、原创技术文章:安卓开发类的


RxAndroid以及配合Retrofit使用

现在搞Android不看点装B的东西都不好意思说自己是搞Android的。之前一直听说 RxAndroid 这个东西,看起来有些B格,下面就简单说说这个东西吧。
    RxAndroid 其实是基于 RxJava 的扩展版让这个框架更好的用在手机端的场景上面,看一个新的东西怎么才能学得快?就是首先要知道这个玩意干嘛用的,上面场景下用。
    RxAndroid 里面有2个对象,一个叫 Observable 这个东西就是个观测者 给 别人发数据的,还有个 对象叫 Subscriber 是订阅者,通俗来说就是 干活的。
先添加gradle:compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'最最最基本的例子:
Subscriber<String> mySubscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) { System.out.println(s); }

    @Override
    public void onCompleted() { }

    @Override
    public void onError(Throwable e) { }
};
上面就是创建了一个最最最原始的一个 订阅者对象,然后下面在创建个 观察者。
Observable<String> myObservable = Observable.create(
         new Observable.OnSubscribe<String>() {
             @Override
             public void call(Subscriber<? super String> sub) {
               sub.onNext("Hello, world!");
               sub.onCompleted();
             }
         }
);

看到实现接口的方法里面是不是感觉这个2个对象有着某种联系?
当里 调用 myObservable.subscribe(mySubscriber); 的时候 就将 这2个对象关联起来了,马上就会执行 myObservable的call 方法。mySubscriber的前2个方法就会被调用,onError的方法是在执行前2个方法出现异常的情况下才会执行。

看上面的代码也是比较多,感觉也没什么好用的啊?下面继续一种简便的写法。Observable.just("我是发送的值").subscribe(new Action1<String>() {
   @Override
   public void call(String s) {
          // s 就是 上面发送的值
   }
});

这样的写法和上面的写法结果是一样的,call 变成的 just , Subscriber 的 3个方法就变成了 Action1了。 Observable.just("我是发送的值").subscribe(new Action1<String>() {
   @Override
   public void call(String s) {

   }
}, new Action1<Throwable>() {
   @Override
   public void call(Throwable throwable) {

   }
}, new Action0() {
   @Override
   public void call() {
         
   }
});Just 可以发送任何类型的值,并且可以多个值。Observable.just("我是值",”我是值2”,”我是值3”).subscribe(new Action1<String>() {…… Call 方法会执行3次除了这个 还可以支持更多操作,比如 map() ,filter() Observable.just(list).map(new Func1<List<String>, String>() {   @Override
   public String call(List<String> strings) {
         //可以操作list再给
         return null;
   }
}).subscribe(new Action1<String>() {
   @Override
   public void call(String s) {
         Log.i("aaaaaaaa", "rrrrrrrrr" + s);
   }
}, new Action1<Throwable>() {
   @Override
   public void call(Throwable throwable) {

   }
}, new Action0() {
   @Override
   public void call() {

   }
});
Observable.just("aaaaa","vvvvvv").filter(new Func1<String, Boolean>() {
    @Override
    public Boolean call(String strings) {
      // 做一些过滤操作,返回 true 则继续进 Action1
      return null;
    }
}).subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
      Log.i("aaaaaaaa", "rrrrrrrrr" + s);
    }
}, new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {

    }
}, new Action0() {
    @Override
    public void call() {......................假如写个启动页,3秒后调到首页Observable.timer(3, TimeUnit.SECONDS, AndroidSchedulers.mainThread()).subscribe(new Action1<Long>() {
    @Override
    public void call(Long aLong) {

    }
});除了这些 操作符外还有很多,和 jquery比较相似,这样解决了 之前一堆回调的问题,链式api逻辑更清楚。可以设定Observable 和 Subscribe的 执行线程.subscribeOn(AndroidSchedulers.mainThread()).observeOn(Schedulers.newThread())可以用来代替 Handler。
现在就说说配合 Retrofit 使用
gradle 添加依赖 compile 'com.squareup.retrofit2:retrofit:2.0.0'compile 'com.squareup.retrofit2:converter-gson:2.0.0'compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'这3个依赖 版本要一致。
retrofit 的使用就不在介绍了,直接看如何配合用。创建接口
public interface ApiService {    @GET("api/search/{key}/{page}")    Observable<Model> search(@Path("key") String key, @Path("page") int page);}注意重点,接口返回类型 是 Observable 不是 Call 了Retrofit retrofit = new Retrofit.Builder()      .baseUrl("http://api.lmcw.cn/")      .addConverterFactory(GsonConverterFactory.create())      .addCallAdapterFactory(RxJavaCallAdapterFactory.create())      .build();
之前的创建 retrofit 添加 addCallAdapterFactory
ApiService apiService = retrofit.create(ApiService.class);
apiService.search("关键词", 1)
      .subscribeOn(Schedulers.newThread()) //将网络请求也就是观察者在 新的线程
      .observeOn(AndroidSchedulers.mainThread()) //Action1 在 主线程
      .doOnSubscribe(new Action0() {
            @Override
            public void call() {
                //可以显示等待框
            }
      }).subscribe(new Action1<Model>() {
    @Override
    public void call(Model model) {
      //请求成功,返回实体类
    }
}, new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {
      //发生异常
    }
}, new Action0() {
    @Override
    public void call() {
      //关闭等待框
    }
});
subscribeOn是影响生产者(Observable)生产数据的线程的,observeOn 影响则是 订阅者的线程的,和名字恰恰相反。

Hmily 发表于 2016-7-8 16:46

本月21号开放注册,到时候自己来注册吧,具体开放注册信息可以关注论坛微信,也会同步发送。

付春旭,他们都叫我崽哥 发表于 2016-7-9 09:33

Hmily 发表于 2016-7-8 16:46
本月21号开放注册,到时候自己来注册吧,具体开放注册信息可以关注论坛微信,也会同步发送。

大大.开放注册有没有什么特殊要求

Hmily 发表于 2016-7-11 10:41

付春旭,他们都叫我崽哥 发表于 2016-7-9 09:33
大大.开放注册有没有什么特殊要求

到时候仔细阅读注册条例就知道了。
页: [1]
查看完整版本: 申请ID:lijsz124