RxJava使用笔记

来源:互联网 发布:人人商城v2 数据库 编辑:程序博客网 时间:2024/06/08 01:08
private void initDate() {    File filefodeer = new File(Environment.getExternalStorageDirectory().getAbsolutePath()            + "/行车示意图/DriveSketchMap/DriveSketchMap_files/");    if (filefodeer.exists()) {        File[] files = filefodeer.listFiles();        Observable.from(files)//以所有文件数组创建一个被观察者对象                .flatMap(new Func1<File, Observable<File>>() {//过滤                    @Override                    public Observable<File> call(File file) {                        return Observable.from(file.listFiles());//对过滤的每个文件对象再次创建被观察者对象                    }                })                .filter(new Func1<File, Boolean>() {//过滤操作符                    @Override                    public Boolean call(File file) {                        return file.getName().endsWith(".png");                    }                })                .take(1)//take()输出最多指定数量的结果。                .doOnNext(new Action1<File>() {                    @Override                    public void call(File file) {                        //doOnNext()允许我们在每次输出一个元素之前做一些额外的事情,                        // 比如这里的保存标题。                    }                })                .map(new Func1<File, Bitmap>() {                    @Override                    public Bitmap call(File file) {                        return collectionBitmap(file);//过滤后的bitmap对象进行返回                    }                })                .subscribeOn(Schedulers.io())//指定订阅的线程                .observeOn(AndroidSchedulers.mainThread())//指定观察者的线程 主线程                .subscribe(new Action1<Bitmap>() {                    @Override                    public void call(Bitmap bitmap) {                        image.setImageBitmap(bitmap);//设置对象                    }                });    }   public Bitmap collectionBitmap(File file) {    Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());    return bitmap;}创建观察者对象的几种方法 public void creatObServerable() {    //创建观察者对象1    rx.Observer observer = new rx.Observer() {        //内部转化成subscriber        @Override        public void onCompleted() {            Log.d("tag", "onCompleted");        }        @Override        public void onError(Throwable e) {        }        @Override        public void onNext(Object o) {        }    };    Subscriber subscriber = new Subscriber() {        @Override        public void onCompleted() {        }        @Override        public void onError(Throwable e) {        }        @Override        public void onNext(Object o) {        }    };    //创建被观察者的几种方法    Observable observable1 = Observable.create(new Observable.OnSubscribe<String>() {        @Override        //onsubscibe对象会被保存在返回的observable对象中,用于后面回调onsubscibe call方法        public void call(Subscriber<? super String> subscriber) {//回调方法            subscriber.onStart();//初始化一些数据 ,在订阅的线程中发生,            // 如果需要在主线程中发生的不能在此初始化            subscriber.onNext("");            subscriber.onCompleted();            //subscriber.onError(e);//try catch后进行发送        }    });    //方法2    Observable observable2 = Observable.just("hh", "gg");    //订阅后  将会一次调用下面方法   //    onNext("hh");   //    onNest("gg");   //    oncompleted();    //方法3    String[] data = {"hh", "gg"};    Observable observable = Observable.just(data);    Observable observable3 = Observable.from(data);    //数据会传入OnSubscribeFromArray对象中,    // 此对象实现了OnSubscribe接口回回调对象的call方法 (参数中传入一个观察者对象subscrber对象)    //最后我们可以讲处理完的数据传给回调观察者的onNext方法中  实现更新数据    //将会一次调用下面方法       //    onNext("hh");       //    onNest("gg");          //    oncompleted();    //创建完别观察这 观察者  开始订阅    observable.subscribe(observer);//方式一    observable.subscribe(subscriber);//方式2 内部返回一个Subscription对象 用于取消订阅    //observable 持有一个onsubsriber对象,内部开始回调onsubcribe.call方法     // 真正开始发送事件的地方就是订阅的时候//rxjava支持不完整定义的回调    final Action1<String> onNextaction = new Action1<String>() {        @Override        public void call(String s) {            //Log.e();        }    };    Action1<Throwable> onerroraction = new Action1<Throwable>() {        @Override        public void call(Throwable throwable) {            //处理错误        }    };    Action0 oncompleteaction = new Action0() {//必须是rxjava的ation0接口        @Override        public void call() {        }    };    observable.subscribe(onNextaction);//返回的subscribe方法中会默认加上     onerror,oncomplete方法    observable.subscribe(onNextaction, onerroraction);//同上    observable.subscribe(onNextaction, onerroraction, oncompleteaction);//不完整定义回调//三个方法内部会调用此方法 subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));  subscribe内部返回 return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));    //ActionSubscriber继承观察者subsriber,三个action对象地址付给actionsubsriber对象的三个变量    // final Action1<? super T> onNext;//分别回调action的对应的call方法     // 相当于回调obser的onNext oncomplete onerror方法    //  final Action1<Throwable> onError;    //final Action0 onCompleted;    //目的都是回调subscrbier的方法}//项目中使用的一个小demo    public void update() throws Exception {    Observable.create(new Observable.OnSubscribe<List<String>>() {        @Override        public void call(Subscriber<? super List<String>> subscriber) {            try {            //方法暂时没有抽取                Cursor bridgeCurosr = DataSupport.findBySQL("select  distinct strRailLineName from    BridgeTable");//去重                while (bridgeCurosr.moveToNext()) {                    String strraillinename =      bridgeCurosr.getString(bridgeCurosr.getColumnIndex("strraillinename"));                    listLine.add(strraillinename);//加入集合中                }                bridgeCurosr.close();                subscriber.onNext(listLine);                subscriber.onCompleted();            } catch (Exception e) {                subscriber.onError(e);            }        }    })            .map(new Func1<List<String>, List<String>>() {                @Override                public List<String> call(List<String> list) {                    return getFilterList(list);//再次过滤                }            }).map(new Func1<List<String>, List<String>>() {        @Override        public List<String> call(List<String> list) {            DataSupport.deleteAll(LineData.class);            for (String str : list) {                LineData data = new LineData();                data.setStrName(str);                data.save();            }            return list;        }    })            .subscribeOn(Schedulers.immediate())//本身此方法就在子线程中执行 所以指定为当前线程            .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<List<String>>() {        @Override        public void call(List<String> list) {//处理发送过来的数据逻辑        }    }, new Action1<Throwable>() {        @Override        public void call(Throwable throwable) {            BaseDialog.showAlert(throwable.getMessage(), m_Context);        }    });}private List<String> getFilterList(List<String> listLine) {    Iterator<String> iterator = listLine.iterator();    while (iterator.hasNext()) {        String next = iterator.next();        if (!listFilterLine.contains(next)) {            listFilterLine.add(next);        }    }    return listFilterLine;}    //还有很多操作符以后慢慢学习 }
0 0