java - RxJava2 轮换后调用 onNext Consumer 两次

标签 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,当我旋转屏幕时,每次都会重新创建 Activity ,并且Timber将新的Tree添加到Forest。因此,当我记录某些内容时,它会输出两次。

最佳答案

这是因为当 Activity 被销毁时您没有取消订阅。

主要 Activity :

Disposable postDisposable;

创建时:

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));

销毁时:

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

关于java - RxJava2 轮换后调用 onNext Consumer 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42369857/

相关文章:

java - 对象中正在运行的线程是否会阻止它在 Java 中被垃圾收集?

java - 如何使用自定义 webview 和覆盖功能?

java - 当选项为空时,如何从格式表达式中排除参数?

Android:处理 InputFilter 上的退格键

java - 改造图片上传无法处理实体错误

java - 改造添加带有 token 和 ID 的 header

Java 8 流 : collector returning filtered object

android - 在 TabLayout 中禁用标签

android - java.lang.IllegalStateException : Expected BEGIN_OBJECT but was STRING 错误

android - 更改 Android Play/Market 中现有应用的过滤器和要求的副作用