RxJava观察者模式

1.点击事件的观察者模式:


2.通用观察者模式:


3.RxJava的观察者模式

RxJava使用的是扩展的观察者模式:

RxJava观察者模式_第1张图片

如图所示,RxJava的基本概念分别为:Observable(被观察者),Observer(观察者),subscribe (订阅)、事件; 不同的是,RxJava 把多个事件看做一个队列,并对每个事件单独处理。

注意:在一个队列中onCompleted() 和 onError(),只有一个会被调用。因为,如果调用了onCompleted()就说明队列执行完毕,没有出现异常,则不会调用onError()方法。相对的,如果队列异常,调用onError()方法的同时会终止队列,队列也就无法完成。


4.举个例子(代码演示)

通过以下代码,来看看RxJava编程和传统命令行编程的区别和优势:

/**

     * 假设:1.我们有一个Listview,用于显示显示多张图片

     *       2.现在给出一个目录数组,把所有目录中的jpg图片都显示到listview中

     *       3.读取图片是耗时操作,需要在后台运行,listview更新需要在UI线程执行

     *

     * 常规实现方式:

     */publicvoidupdataImage(finalFile[] routes,finalContext context){newThread() {@Overridepublicvoidrun(){super.run();for(File route : routes) {                    File[] files = route.listFiles();for(File file : files) {if(file.getName().endsWith(".jpg")) {finalBitmap bitmap = getBitmap(file);                            ((MainActivity) context).runOnUiThread(newRunnable() {@Overridepublicvoidrun(){                                    imageList.add(bitmap);                                    imageListAdatper.notifyDataSetChanged();                                }                            });                        }                    }                }            }        }.start();    }

用RxJava是这样实现的:

publicvoidupdataImage(){      Observable.from(routes)                .flatMap(newFunc1() {@OverridepublicObservablecall(File file){returnObservable.from(file.listFiles());                    }                })                .filter(newFunc1() {@OverridepublicBooleancall(File file){returnfile.getName().endsWith(".jpg");                    }                })                .map(newFunc1() {@OverridepublicBitmapcall(File file){returngetBitmap(file);                    }                })                .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(newAction1() {@Overridepublicvoidcall(Bitmap bitmap){                        imageList.add(bitmap);                        imageListAdatper.notifyDataSetChanged();                    }                });    }

从整体结构看一下,会发现整个代码结构是从上到下,一条链条式的调用,没有嵌套,这个在逻辑的简洁性上有非常大的优势。并且如果需求越复杂,这种优势越明显。

你可能感兴趣的:(RxJava观察者模式)