有一个非常简单的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
添加新的Tree
到Forest
。所以当我记录它输出两次时。
答案 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();
}