android - android中rxJava 2中动态订阅的正确方法是什么?
问题描述
在android中动态订阅rxJava2中的观察者的适当方法是什么。虽然我得到了所需的输出,但我不确定这是否是在内存方面实现的正确方法。以下是我的代码
flowableObservable = getHumanflowable();
subscriber = getFlowableObserver();
flowableObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber);
//////////////////// 可观察代码
private Flowable<String> getHumanflowable() {
return new Flowable<String>() {
@Override
protected void subscribeActual(final Subscriber<? super String> s) {
t = new Timer();
t.scheduleAtFixedRate(
new TimerTask() {
public void run() {
if (listObj.size() > 0) {
varToBeAddedInObservable = listObj.remove(listObj.size() - 1);
// Log.d("&&&&&&&&&&",""+varToBeAddedInObservable);
s.onNext(varToBeAddedInObservable);
} else {
s.onComplete();
t.cancel();
}
}
},
0,
1000);
}
};
}
//////////////////////// 观察者
private Subscriber<String> getFlowableObserver() {
/*return new Subscriber<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe");
// disposable = d;
}
@Override
public void onSuccess(Integer integer) {
Log.d(TAG, "onSuccess: " + integer);
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
};*/
return new Subscriber<String>() {
@Override
public void onSubscribe(Subscription s) {
mSubscriptionObject =s;
s.request(Long.MAX_VALUE);
}
@Override
public void onNext(String integer) {
Log.d("+++++++++", "" + integer);
int colorIndex = random.nextInt(arrayColors.length);
//Color color = (arrayColors[colorIndex]);
textView.setTextColor(arrayColors[colorIndex]);
textView.setText(varToBeAddedInObservable);
AlphaAnimation fadeIn = new AlphaAnimation(0.0f, 1.0f);
AlphaAnimation fadeOut = new AlphaAnimation( 1.0f , 0.0f ) ;
textView.startAnimation(fadeIn);
// textView.startAnimation(fadeOut);
fadeIn.setDuration(1500);
fadeIn.setFillAfter(true);
// fadeOut.setDuration(1200);
fadeOut.setFillAfter(true);
// fadeOut.setStartOffset(1200 - fadeIn.getStartOffset());
fadeIn.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
textView.setTextColor(Color.BLACK);
textView.setText("Jadu cha Khel Sampla !!!!");
textView.setTextSize(25);
textView.setGravity(View.TEXT_ALIGNMENT_CENTER);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
createList();
/* Flowable<String> flowableObservable = getHumanflowable();
Subscriber<String> subscriber = getFlowableObserver();*/
//SingleObserver<Integer> observer = getFlowableObserver();
// flowableObservable.publish(AndroidSchedulers.mainThread());
/* flowableObservable.subscribeOn(Schedulers.io())
// .onBackpressureLatest()
*//* .reduce(500, new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(Integer result, Integer number) {
Log.e(TAG, "Result: " + result + ", new number: " + number);
return result + number;
}
})
.*//*.observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber);*/
/* if(mSubscriptionObject!=null) {
mSubscriptionObject.request(Long.MAX_VALUE);
}*/
}
};
}
如您所见,我在观察者的 onComplete() 方法中再次订阅它。所以它正在订阅它。对于 api 调用,考虑相同。每次我们在 api 调用成功中收到响应时,我是否可以继续订阅同一个订阅者对象,就像我在 onComplete 中所做的那样?或者有更好的方法吗?
解决方案
推荐阅读
- python-3.x - 输入字段不能放在 tkinter python 中的所需位置。
- r - 'rJava' 的 loadNamespace() 中的 onLoad 失败,但仅在运行 devtools::check() 时
- ios - iOS 应用程序在后台运行时检测到解锁事件
- javascript - 使用 Javascript 在移动设备上滚动放大视口
- ruby-on-rails - 查找上个月的最后一条记录以与 ruby 进行比较
- vba - Excel 宏和命令按钮
- python-3.x - 熊猫库`ModuleNotFoundError:没有名为'__builtin__'的模块`
- sas - 隐蔽的 20DEC2007 到 yymmdd10 sas
- java - 有人可以告诉我为什么我的文字消失以及如何解决吗?
- excel - VBA复制范围重复