RxJava2在轮换后调用onNext Consumer两次

时间:2017-02-21 14:19:58

标签: java android retrofit2 android-orientation rx-java2

有一个非常简单的Activity我尝试学习rx

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三次,依此类推(网络请求始终是单个)。

无法理解这个问题。

更新

我理解我的问题,这不是关于rx,这大约是Timber,当我旋转屏幕时,每次都会重新创建活动并Timber添加新的TreeForest。所以当我记录它输出两次时。

1 个答案:

答案 0 :(得分: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();
}