Имейте очень простой 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
. Поэтому, когда я записываю что-то, он выводит дважды.
Активность воссоздается каждый раз, когда вы поворачиваете так, как я понимаю, по крайней мере, новый подписка создается каждый раз. Решение, которое, как я полагаю, должно гарантировать, что вы отмените подписку на соответствующий жизненный цикл активности (рекомендуется использовать 'https: // github.com/trello/RxLifecycle') –
, что возвращает' Timber.i ("handleResponse:" + post.id + " , Activity: "+ this);' – Selvin
@ JohnO'Reilly, но если я правильно понимаю, я создаю подписку только тогда, когда я нажимаю кнопку, а не раньше, а не когда активность создается или воссоздается. –