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