【发布时间】:2017-05-21 16:23:15
【问题描述】:
我正在 android repository by Fernando Cejas 上构建我的应用程序,但在调用 dispose 后订阅 observable 时遇到问题。
当我来到仪表板时,我调用方法subscribeOnUserMessages.execute(new Subscriber(), new Params(token)),这是UseCase类中的方法
public void execute(DisposableObserver<T> observer, Params params) {
Preconditions.checkNotNull(observer);
final Observable<T> observable = this.buildUseCaseObservable(params)
.subscribeOn(Schedulers.from(threadExecutor))
.observeOn(postExecutionThread.getScheduler());
addDisposable(observable.subscribeWith(observer));
}
在子类SubscribeOnUserMessages 中,我只需像这样调用存储库
return messageRepository.subscribeOnUserMessages(params);
在我的套接字实现中,我这样创建
return Observable.create(emitter -> {
if (!isThereInternetConnection()) {
Timber.w("Network connection exception");
emitter.onError(new NetworkConnectionException());
return;
}
/*
* Open socket if not opened
*/
openSocket(params.getToken());
String channelName = CHANNEL_PRIVATE_USER + params.getAuthenticated().getUuid();
if (subscribedChannels.contains(channelName)) {
Timber.d("Channel %s is already subscribed", channelName);
return;
}
JSONObject auth;
try {
auth = createAuthJson(CHANNEL, channelName, params.getToken());
} catch (JSONException e) {
Timber.e("Couldn't create auth json");
emitter.onError(e);
return;
}
mSocket.emit(SUBSCRIBE, auth);
Timber.d("Emitted subscribe with channel: %s ", CHANNEL_PRIVATE_USER + params.getAuthenticated().getUuid());
subscribedChannels.add(CHANNEL_PRIVATE_USER + params.getAuthenticated().getUuid());
Timber.d("Subscribing on event: %s\n with user: %s", EVENT_USER_NEW_MESSAGE, params.getAuthenticated().getUuid());
if (mSocket.hasListeners(EVENT_USER_NEW_MESSAGE)) {
Timber.v("Socket already has listener on event: %s", EVENT_USER_NEW_MESSAGE);
return;
}
mSocket.on(EVENT_USER_NEW_MESSAGE, args -> {
if (args[1] == null) {
emitter.onError(new EmptyResponseException());
}
Timber.d("Event - %s %s", EVENT_USER_NEW_MESSAGE, args[1].toString());
try {
MessageEntity messageEntity = messageEntityJsonMapper.transform(args[1]);
emitter.onNext(messageEntity);
} catch (JSONException e) {
Timber.e(e, "Could not parse message json");
emitter.onError(e);
}
});
});
症状是我第一次订阅时,所有内容都进入了表示层。当我在进入第二个屏幕并返回后处理时,我只看到日志进入套接字实现,但没有通过。
我的问题是:有没有办法再次订阅相同的 observable?我已经尝试在我的用例中以单例形式保存该可观察对象并订阅该可观察对象,但没有帮助。
【问题讨论】:
-
只需再次调用
.subscribe()到可观察对象。 -
再次定义你对同一个 observable 的订阅?它是否是热门的 Observable?如果你再次订阅,你想看到什么结果?
-
SocketImpl是单例对象,负责从套接字获取消息。 -
@PhoenixWang
SocketImpl是单例对象,负责从套接字获取消息。它在订阅后开始监听套接字,所以它是冷可观察的。整个情况是,我在一个屏幕(仪表板)上订阅了消息,然后我去特定的聊天,所以我处理了那个订阅。当我回来时,我想再次订阅那个 observable。 -
@SimonHarvan 所以你的意思是你想在某些情况下“暂停”那个可观察的?那么我想你可以使用一个主题来管理你自己的上游。