吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2294|回复: 3
收起左侧

[会员申请] 申请ID:lijsz124

[复制链接]
吾爱游客  发表于 2016-7-7 12:25
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号开放注册,到时候自己来注册吧,具体开放注册信息可以关注论坛微信,也会同步发送。

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

点评

到时候仔细阅读注册条例就知道了。  详情 回复 发表于 2016-7-11 10:41
Hmily 发表于 2016-7-11 10:41
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 20:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表