2016-08-08 3 views
3

Я понимаю, что по умолчанию наблюдаемые, созданные путем модификации, являются «холодными» наблюдаемыми.Модифицировать наблюдаемые работы только один раз

У меня есть этот конкретный призыв к моему серверу конечной

@POST("oauth/token") 
Observable<Token> signIn(@Field("username") String username, @Field("password") String password); 

Когда я делаю:

public class LoginUseCase extends Subscriber<Profile> { 
    public void logIn(String username, String password) { 
     Subscription subscription = myApi.signIn(username, password) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(this); 
     this.add(subscription); 
    } 
} 

я получаю onNextonErroronComplete обратные вызовы, как и следовало ожидать.

Проблема возникает, когда логин завершается с ошибкой, и я пытаюсь повторить попытку. Вызов метода login() во второй раз не вызывает HTTP-вызов, и я не получаю никаких обратных вызовов.

Кстати, Im делает это на мой onComplete() метод

@Override 
public void onCompleted() { 
    this.unsubscribe(); 
} 

Есть ли способ сказать модифицированную/rxandroid повторно сделать каждый раз HTTP вызова я называю myApi.signin(). Я даже подхожу к этому правильно?

Примечания: - Я использую dagger2 в моем проекте, а объект myApi - одноэлементный. - Я могу воспроизвести ошибку, даже если я использую разные настройки имени пользователя и пароля между первой и второй попытками.

+0

Без кода я предполагаю, что в вашем фрагменте/активности есть только один подписчик. Вам нужно переизбрать наблюдаемый, чтобы он работал. В вашем контексте есть только один экземпляр подписчика LoginUseCase? – gaara87

+0

Да, это только один экземпляр LoginUseCase в моем фрагменте. Как переизбрать наблюдаемый? Благодаря! – feresr

+0

Jus повторно инициализирует его, или если вы можете отредактировать свой вопрос, чтобы содержать часть, в которой вы используете объект, я могу показать вам необходимые изменения. – gaara87

ответ

4

Как только Subscriber#unsubscribe() называется, абонент никогда не сможет получать новые значения. Вам нужно будет воссоздать своего подписчика каждый раз, когда вы хотите подписаться на новый наблюдаемый.

Что происходит в том, что при вызове Subscriber#add(Subscription) он видит, что абонент уже отписался и немедленно отменяет новую подписку.

+0

Yup, вот и все! Я не знал, что подписчики доступны. Я немного позабочусь о том, почему это так, мне придется перестроить свой код, чтобы каждый раз создавать нового абонента. Спасибо за помощь – feresr

Смежные вопросы