关于RxJAVA的一下理解

1.被观察者的几种创建放肆

1.Observable  observable = Observable.create(new Observable.OnSubscibe<Object>(){

public void call(Subscriber<? super String> subscriber){

subscriber.onNext(“”);

subscriber.onCompleted();

}

});

2.Observable observable = Observable.just(“aa”,”vv”,”cc”);

3.String[] words = {“sd”,”ds”,”ds};

Observable observable = Observable.from(words);


4.订阅方式创建:Observable.subscribe(Observer); Observable.subscribe(Subscriber);

5.除了订阅方式创建:还支持不完整的定义回调:

Observabler observable = null;

1.Action1<String> onNextAction = new Action1<String>(){

public void call(String s){

}

}

2.Action1<Throwable> onErrorAction  = new Action1<Throwable>{

public void call(Throwable){}

}

3.Action0 onCompleteAction = new Action0(){

public void call(){}

}


observable.subscribe(onNextAction);

observable.subscribe(onNextAction,onErrorAction,onCompleteAction);

// 自动创建 Subscriber ,并使用 onNextAction onErrorAc tion 来定义 onNext() onError()

2.在Observable上添加线程控制让耗时操作放在io线程中。操作ui的放在主线程中

Observable.just(1, 2, 3, 4)

    .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程

    .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程

    .subscribe(new Action1<Integer>() {

        @Override

        public void call(Integer number) {

            Log.d(tag, "number:" + number);

        }

    });

**在使用线程操作的时候。我们可以在执行subscribe之后调用执行者subscribeOn(Schedulers.io()),在操作结束后让观察者操作的时候调用observeOn(AndroidSchedulers.mainThread());


3.在被观察者把要处理的事件交给观察者时,我们可以做在中间做一些其他的操作。那就是变换的过程。

1.map的例子

1.比如被观察者传过来的是一个图片的路径,我们可以在中间做一下操作,把传来的路径。转换成bitmap形式,再传给观察者

如:Observable.just("images/logo.png") // 输入类型 String

    .map(new Func1<String, Bitmap>() {

        @Override

        public Bitmap call(String filePath) { // 参数类型 String

            return getBitmapFromPath(filePath); // 返回类型 Bitmap

        }

    })

    .subscribe(new Action1<Bitmap>() {

        @Override

        public void call(Bitmap bitmap) { // 参数类型 Bitmap

            showBitmap(bitmap);

        }

    });

可以从上面看出,这里出现了一个Func1的类,它和Action1非常相似。但又完全不同。他有返回值。

2.第二种变换方式flatMap();

1.这是一个很有用但非常难理解的变换,因此我决定花多些篇幅来介绍它。 首先假设这么一种需求:假设有一个数据结构『学生』,现在需要打印出一组学生的名字。实现方式很简单

Student[] students = ...;

Subscriber<String> subscriber = new Subscriber<String>() {

    @Override

    public void onNext(String name) {

        Log.d(tag, name);

    }

    ...

};

Observable.from(students)

    .map(new Func1<Student, String>() {

        @Override

        public String call(Student student) {

            return student.getName();

        }

    })

    .subscribe(subscriber);


2.很简单。那么再假设:如果要打印出每个学生所需要修的所有课程的名称呢?(需求的区别在于,每个学生只有一个名字,但却有多个课程。)首先可以这样实现:

Student[] students = ...;

Subscriber<Student> subscriber = new Subscriber<Student>() {

    @Override

    public void onNext(Student student) {

        List<Course> courses = student.getCourses();

        for (int i = 0; i < courses.size(); i++) {

            Course course = courses.get(i);

            Log.d(tag, course.getName());

        }

    }

    ...

};

Observable.from(students)

    .subscribe(subscriber);


3.依然很简单。那么如果我不想在 Subscriber 中使用 for 循环,而是希望 Subscriber 中直接传入单个的 Course 对象呢(这对于代码复用很重要)?用 map() 显然是不行的,因为 map() 是一对一的转化,而我现在的要求是一对多的转化。那怎么才能把一个 Student 转化成多个 Course 呢?

这个时候,就需要用 flatMap() 了:

Student[] students = ...;

Subscriber<Course> subscriber = new Subscriber<Course>() {

    @Override

    public void onNext(Course course) {

        Log.d(tag, course.getName());

    }

    ...

};

Observable.from(students)

    .flatMap(new Func1<Student, Observable<Course>>() {

        @Override

        public Observable<Course> call(Student student) {

            return Observable.from(student.getCourses());

        }

    })

    .subscribe(subscriber);

解释一下:他就是相当于把获取的student[]数组然后分开,然后在转换成一个集合的形式,即课程的集合。然后让subscribe观者者先执行每个课程的打印,这样就形成了上面的for循环。让代码看起来更简单了


4.当然我们现在要举个小例子了。在Android中要如何才能更好的使用呢。

  1.与retrofit的结合使用

1.传统的使用方式:retrofit提供了一个传统的CallBack的方法我们可以平常是这样使用的

@Get(“/User”)

public void getUser(@Query(“userId”) String userId,CallBack<User> callBack);

然后我们在程序中调用肯定是这样的,传一个userId然后是先他里面的借口

getUser(userId, new Callback<User>() {

    @Override

    public void success(User user) {

        userView.setUser(user);

    }


    @Override

    public void failure(RetrofitError error) {

        // Error handling

        ...

    }

};


2.用RxJava的使用方式

@Get(“/User”)

public Observable<User> getUser(@Query(“UserId” String userId));

这样我们调用的时候就少了回调接口 了

getUser(userId)

.observenOn(AndroidSchedulers.mainThread())

.Subscribe(new Observer<User>(){

public void onNext(User user){}

public void onCompleted(){}

})

这样是不是使用起来就比较简单了呢!!!!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值