有一个非常简单的 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/