ich baue meine App auf Android repository by Fernando Cejas und ich habe ein Problem mit dem Abonnement beobachtbar nach dem Aufruf dispose
.Subscribe zu beobachtbar nach entsorgen
Wenn ich zu Armaturenbrett kommen, rufen i Methode subscribeOnUserMessages.execute(new Subscriber(), new Params(token))
, wobei das Verfahren in UseCase
Klasse ist
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));
}
In Kindklasse SubscribeOnUserMessages
i rufen Sie einfach Repository wie dieses return messageRepository.subscribeOnUserMessages(params);
In meiner Socket-Implementierung i erstellen wie dieser
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);
}
});
});
Symptome a Wenn ich das erste Mal abonniere, läuft alles bis zur Präsentationsschicht. Wenn ich auf den zweiten Bildschirm gehe und zurückkomme, sehe ich nur Logs, die zur Socket-Implementierung kommen, aber nicht durchgehen.
Meine Frage ist: Gibt es eine Methode, um dasselbe Observable wieder zu abonnieren? Ich habe bereits versucht, dieses Observable in meinem Anwendungsfall in Singleton zu speichern und dieses Observable zu abonnieren, hat nicht geholfen.
rufen Sie einfach '.subscribe()' erneut auf das beobachtbare Objekt auf. –
Definieren Sie Ihr Abonnement für das gleiche Observable wieder? Ist es ein heißes Observable oder nicht? Welches Ergebnis möchten Sie sehen, wenn Sie es erneut abonnieren? –
'SocketImpl' ist ein Singleton-Objekt, das für das Abrufen von Nachrichten aus Sockets zuständig ist. –