2017-02-21 13 views
1

Имейте очень простой Activity, в котором я пытаюсь узнать rx.RxJava2 call onNext Потребитель дважды после ротации

public class MainActivity extends AppCompatActivity { 

    private SampleApi sampleApi; 

    private Observable<Post> postObservable; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Timber.plant(new Timber.DebugTree()); 

     sampleApi = new Retrofit.Builder() 
       .baseUrl("https://jsonplaceholder.typicode.com") 
       .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(buildOkHttpClient()) 
       .build() 
       .create(SampleApi.class); 

     findViewById(R.id.subscribe1).setOnClickListener(
       target -> sampleApi.getPost(1) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribeOn(Schedulers.io()) 
         .subscribe(this::handleResponse) 
     ); 
    } 

    @NonNull 
    private OkHttpClient buildOkHttpClient() { 
     // build some okhttp3 client here 
    } 

    private void handleResponse(Post post) { 
     Timber.i("handleResponse: " + post.id); 
    } 
} 

Он работает нормально, но когда я повернуть мое устройство (с портретной на альбомную), а после этого кнопку мыши, мой метод handleResponse вызывается дважды. Поэтому, если я дважды поворачиваю свое устройство, handleResponse вызывается три раза и так далее (сетевой запрос всегда один).

Не могу понять проблему.


Update

я понял мою проблему, это не про rx, речь идет о Timber, когда я повернуть экран, активность воссозданы каждый раз и Timber добавить новую Tree в Forest. Поэтому, когда я записываю что-то, он выводит дважды.

+0

Активность воссоздается каждый раз, когда вы поворачиваете так, как я понимаю, по крайней мере, новый подписка создается каждый раз. Решение, которое, как я полагаю, должно гарантировать, что вы отмените подписку на соответствующий жизненный цикл активности (рекомендуется использовать 'https: // github.com/trello/RxLifecycle') –

+0

, что возвращает' Timber.i ("handleResponse:" + post.id + " , Activity: "+ this);' – Selvin

+0

@ JohnO'Reilly, но если я правильно понимаю, я создаю подписку только тогда, когда я нажимаю кнопку, а не раньше, а не когда активность создается или воссоздается. –

ответ

0

Это потому, что вы не отменяете подписку, когда действие уничтожается.

MainActivity:

Disposable postDisposable; 

OnCreate:

findViewById(R.id.subscribe1).setOnClickListener(.... 

    .... 

    if (postDisposable != null) { 
     postDisposable.dispose(); 
    } 

    postDisposable = sampleApi.getPost(1) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()) 
      .subscribe(this::handleResponse, throwable -> Log.e("TAG", "Error", throwable)); 

OnDestroy:

if (postDisposable != null) { 
    postDisposable.dispose(); 
} 
+0

Спасибо, я знаю о подписках. Но в первую очередь я использую rxjava2, а метод 'subscribe' возвращает одноразовый. Но даже с вашим кодом (где я заменил Subscription to Disposable) он не работает. –

+0

Извините, я не заметил, что вы использовали rxjava 2. Я считаю, что причина та же, вам все равно нужно отказаться от подписки в 'onDestroy'. Проверьте мое редактирование. –

+0

Нет, эффекта нет. Есть ли у вас предположения? –

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