Android OnClick 中的 rxjava2 订阅
Android rxjava2 subscription within OnClick
我正在努力挖掘 RxJava2 世界的奇迹,但我仍然很困惑。
基本上我必须在用户单击按钮时调用 API,所以我使用的是 Retrofit2 客户端,它 returns 是我在按钮的单击方法上订阅的 Observable。
问题是当按钮被点击两次时我会得到:
io.reactivex.exceptions.ProtocolViolationException: It is not allowed to subscribe with a(n) <package>.MainActivity multiple times. Please create a fresh instance of <package>.MainActivity and subscribe that to the target source instead.
如果我在 onComplete 之后处理观察者,api 将不会被调用,因为订阅无效。我 missing/misunderstanding 是什么东西吗?
public class MainActivity extends AppCompatActivity {
@BindView(R.id.button) Button button;
private DisposableObserver<PopularGames[]> observer;
private Observable<PopularGames[]> popularGamesObservable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
APIsInterface apiClient = MyApplication.getInstance(this).getApiClient();
popularGamesObservable = apiClient.getPopularGames();
observer = new DisposableObserver<PopularGames[]>() {
@Override
public void onNext(PopularGames[] result) {
Timber.d("onNext " + Arrays.asList(result));
}
@Override
public void onError(Throwable e) {
Timber.e("onError " + e);
}
@Override
public void onComplete() {
Timber.d("onComplete");
}
};
}
@OnClick(R.id.button)
public void onViewClicked() {
popularGamesObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(observer);
}
}
io.reactivex.exceptions.ProtocolViolationException
预计
你能做什么
CompositeDisposable compositeDisposable = new CompositeDisposable();
然后
@OnClick(R.id.button)
public void onViewClicked() {
compositeDisposable.add( popularGamesObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<PopularGames[]>() {
@Override
public void onNext(PopularGames[] result) {
Timber.d("onNext " + Arrays.asList(result));
}
@Override
public void onError(Throwable e) {
Timber.e("onError " + e);
}
@Override
public void onComplete() {
Timber.d("onComplete");
}
}));
}
然后在onDestory
compositeDisposable.dispose();
我正在努力挖掘 RxJava2 世界的奇迹,但我仍然很困惑。 基本上我必须在用户单击按钮时调用 API,所以我使用的是 Retrofit2 客户端,它 returns 是我在按钮的单击方法上订阅的 Observable。
问题是当按钮被点击两次时我会得到:
io.reactivex.exceptions.ProtocolViolationException: It is not allowed to subscribe with a(n) <package>.MainActivity multiple times. Please create a fresh instance of <package>.MainActivity and subscribe that to the target source instead.
如果我在 onComplete 之后处理观察者,api 将不会被调用,因为订阅无效。我 missing/misunderstanding 是什么东西吗?
public class MainActivity extends AppCompatActivity {
@BindView(R.id.button) Button button;
private DisposableObserver<PopularGames[]> observer;
private Observable<PopularGames[]> popularGamesObservable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
APIsInterface apiClient = MyApplication.getInstance(this).getApiClient();
popularGamesObservable = apiClient.getPopularGames();
observer = new DisposableObserver<PopularGames[]>() {
@Override
public void onNext(PopularGames[] result) {
Timber.d("onNext " + Arrays.asList(result));
}
@Override
public void onError(Throwable e) {
Timber.e("onError " + e);
}
@Override
public void onComplete() {
Timber.d("onComplete");
}
};
}
@OnClick(R.id.button)
public void onViewClicked() {
popularGamesObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(observer);
}
}
io.reactivex.exceptions.ProtocolViolationException
预计
你能做什么
CompositeDisposable compositeDisposable = new CompositeDisposable();
然后
@OnClick(R.id.button)
public void onViewClicked() {
compositeDisposable.add( popularGamesObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<PopularGames[]>() {
@Override
public void onNext(PopularGames[] result) {
Timber.d("onNext " + Arrays.asList(result));
}
@Override
public void onError(Throwable e) {
Timber.e("onError " + e);
}
@Override
public void onComplete() {
Timber.d("onComplete");
}
}));
}
然后在onDestory
compositeDisposable.dispose();