RxJava从可观测数据更新数据

RxJava从可观测数据更新数据,java,reactive-programming,rx-java,Java,Reactive Programming,Rx Java,我有两个listview。它包含文本项。 我想从左侧列表中拖动文本项,然后放到右侧列表中。这对我来说没有问题。 另外,我有一个可观察的,它可以观察到视频对象。 下面是我如何得到这个可观察的代码: 如果对象id等于targetList中的某个id,则此函数获取已添加到右listview中的对象id,并从结果中排除对象: private Observable<KalturaVideo> getSourceListObservalbe(String kalturaPlaylistId){

我有两个listview。它包含文本项。 我想从左侧列表中拖动文本项,然后放到右侧列表中。这对我来说没有问题。 另外,我有一个可观察的,它可以观察到视频对象。 下面是我如何得到这个可观察的代码: 如果对象id等于targetList中的某个id,则此函数获取已添加到右listview中的对象id,并从结果中排除对象:

private Observable<KalturaVideo> getSourceListObservalbe(String kalturaPlaylistId){
        Observable<String[]> targetIdList = Observable.just(targetList)
                .map((List<KalturaVideo> kalturaVideos) -> {
                    if(kalturaVideos == null || kalturaVideos.isEmpty()){
                        return new String[]{""};
                    }
                    String[] result = new String[kalturaVideos.size()];
                    int index = 0;
                    for (KalturaVideo item : kalturaVideos) {
                        result[index] = item.getId();
                    }
                    return result;
                });
        return Observable.combineLatest(
                targetIdList,
                KalturaVideoRetriver.getVideoList(BuildPlaylistStep2Activity.this, kalturaPlaylistId),
                (String[] idListOfTarget, KalturaVideo kalturaVideo) -> {
                    for (String item :idListOfTarget){
                        if(item.equals(kalturaVideo.getId())){
                            return null;
                        }
                    }
                    return kalturaVideo;
                })
                .doOnError(throwable -> {
                    int i =0;
                    i++;
                   throwable.printStackTrace();
                })
                .filter(kalturaVideo -> {
                    return kalturaVideo != null;
                });
    }
下面是我如何在拖放后尝试更新2个列表:

targetList.add(video);
sourceList.clear();
fillLists().subscribe();
where video-是与视图相关的视频,该视图已被删除到新列表中

所以,当我第一次将视图放到另一个列表时,它工作得很好。但当我第二次下降时,我在我的doError方法中得到这个stacktrace:

04-20 18:46:02.072 8015-8083/com.mediamanagment.app W/System.err﹕ java.lang.NullPointerException 04-20 18:46:02.072
8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.activity.buildPlayStep2Activity.lambda$getSourceListObservalbe$3(buildPlayStep2Activity.java:106) 04-20 18:46:02.072 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.activity.buildplaylistp2activity.access$lambda$1(buildplaylistp2activity.java) 04-20 18:46:02.072 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.activity.buildplaylaystep2activity$$Lambda$2.call(未知) 来源)04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ at rx.functions.functions$3.call(functions.java:76) 04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 operators.OperatorCombineLatest$Collector.next(OperatorCombineLatest.java:157) 04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 operators.OperatorCombineLatest$SourceSubscriber.onNext(OperatorCombineLatest.java:218) 04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.retrivers.KalturaVideoRetriver$1$1.lambda$call$13(KalturaVideoRetriver.java:36) 04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.retrivers.KalturaVideoRetriver$1$1.access$lambda$0(KalturaVideoRetriver.java) 04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.retrivers.kalturavideoretrivers$1$1$$Lambda$1.call(未知) 来源)04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在rx.Observable$12.onNext(Observable.java:3682)04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.operators.OperatorDoOnEach$1.onNext(OperatorDoOnEach.java:61)04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.retrivers.KalturaVideoRetriver$2.call(KalturaVideoRetriver.java:80) 04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.retrivers.KalturaVideoRetriver$2.call(KalturaVideoRetriver.java:47) 04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在接收时可观测$2.呼叫(Observable.java:153)04-20 18:46:02.080
8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.Observable$2.call(Observable.java:149)04-20 18:46:02.080
8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.Observable$2.call(Observable.java:153)04-20 18:46:02.080
8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.Observable$2.call(Observable.java:149)04-20 18:46:02.080
8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.Observable.unsafeSubscribe(Observable.java:6110)04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.operators.OperatorMerge$1.onNext(OperatorMerge.java:66)04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.operators.OperatorMerge$1.onNext(OperatorMerge.java:43)04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.operators.OperatorMap$1.onNext(OperatorMap.java:54)04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.retrivers.KalturaVideoRetriver$3.call(KalturaVideoRetriver.java:93) 04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.retrivers.KalturaVideoRetriver$3.call(KalturaVideoRetriver.java:89) 04-20 18:46:02.080 8015-8083/com.mediamanagment.app W/System.err﹕ 在接收时可观测$2.呼叫(Observable.java:153)04-20 18:46:02.080
8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.Observable$2.call(Observable.java:149)04-20 18:46:02.080
8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.Observable$2.call(Observable.java:153)04-20 18:46:02.088
8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.Observable$2.call(Observable.java:149)04-20 18:46:02.088
8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.Observable.subscribe(Observable.java:6177)04-20 18:46:02.088
8015-8083/com.mediamanagment.app W/System.err﹕ 在 rx.Observable.subscribe(Observable.java:5842)04-20 18:46:02.088
8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.retrivers.KalturaVideoRetriver$1.call(KalturaVideoRetriver.java:41) 04-20 18:46:02.088 8015-8083/com.mediamanagment.app W/System.err﹕ 在 com.mediamanagment.app.retrivers.KalturaVideoRetriver$1.call(KalturaVideoRetriver.java:27) 04-20 18:46:02.088 8015-8083/com.mediamanagment.app W/System.err﹕ 在rx.Observable.unsafeSubscribe(Observable.java:6110)04-20 18:46:02.095 8015-8083/com.mediamanagment.app W/System.err﹕ 在 operators.OperatorCombineLatest.call(OperatorCombineLatest.java:87) 04-20 18:46:02.095 8015-8083/com.mediamanagment.app W/System.err﹕ 在 operators.OperatorCombineLatest.call(OperatorCombineLatest.java:40) 04-20 18:46:02.095 8015-8083/com.mediamanagment.app W/System.err﹕ 在rx.Observable$2.call(Observable.java:153)04-
private Observable<KalturaVideo> fillLists(){
        return getSourceListObservalbe(KalturaVideoRetriver.KALTURA_NEW_PLAYLIST_ID)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnError(throwable -> {
                    Log.e("TAG", throwable.getCause().toString());
                })
                .doOnNext(kalturaVideo -> {
                    sourceList.add(kalturaVideo);
                })
                .doOnCompleted(() -> {
                    viewHolder.sourceListView.setAdapter(new BuildPlaylistContentAdapter(
                            BuildPlaylistStep2Activity.this,
                            -1,
                            sourceList));
                    viewHolder.sourceListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                        @Override
                        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                            KalturaVideo video = (KalturaVideo) view.getTag();
                            ClipData data = ClipData.newPlainText("kalturaVideoId", video.getId());
                            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                            view.startDrag(data, shadowBuilder, view, 0);
                            view.setVisibility(View.INVISIBLE);
                            return false;
                        }
                    });
                    viewHolder.targetListView.setAdapter(new BuildPlaylistContentAdapter(
                            BuildPlaylistStep2Activity.this,
                            -1,
                            targetList
                    ));
                });
    }
subscription = fillLists().subscribe();
targetList.add(video);
sourceList.clear();
fillLists().subscribe();
 Log.e("TAG", throwable.getCause().toString());
Log.e("TAG", throwable.getCause());
.doOnError(throwable -> {
    int i =0;
    i++;
    throwable.printStackTrace();
})
public static Observable<KalturaVideo> getVideoList(Context context, String kalturaPlaylistId){
    return Observable.create(new Observable.OnSubscribe<KalturaVideo>()     {
        @Override
        public void call(Subscriber<? super KalturaVideo> subscriber) {
            getKalturaPlaylistContentObservable(kalturaPlaylistId, context)
                    .flatMap(new Func1<String[], Observable<?>>() {
                        @Override
                        public Observable<?> call(String[] videoIdList) {
                            return getKalturaVideoListObservable(context, videoIdList)
                                    .doOnNext(kalturaVideo -> {
                                        subscriber.onNext(kalturaVideo);
                                    })
                                    .doOnCompleted(() -> subscriber.onCompleted());
                        }
                    })
                    .subscribe();
        }
    });
}
public static Observable<KalturaVideo> getVideoList(Context context, String kalturaPlaylistId){
    return getKalturaPlaylistContentObservable(kalturaPlaylistId, context).flatMap((String[] videoIdList) -> getKalturaVideoListObservable(context, videoIdList));
}
 Observable<String[]> targetIdList = Observable.just(targetList)
            .map((List<KalturaVideo> kalturaVideos) -> {
                if(kalturaVideos == null || kalturaVideos.isEmpty()){
                    return new String[]{""};
                }
                String[] result = new String[kalturaVideos.size()];
                int index = 0;
                for (KalturaVideo item : kalturaVideos) {
                    result[index] = item.getId();
                }
                return result;
            });
 Observable<String[]> targetIdList = Observable.just(targetList)
            .flatMapIterable(videos -> videos)
            .map(video -> video.getId())
            .toList()
            .map(l -> l.toArray(new String[]));