【发布时间】:2019-01-09 17:10:13
【问题描述】:
我执行了一个网络调用,其中我
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
然后我将结果传递给io.reactivex.function.Consumer,它会尝试为视图设置动画。
当我在本地同步加载数据时,这些动画可以工作,但是当我引入这个服务器调用时就坏了。
现在,当我为视图设置动画时,它根本不会更改任何属性,而是立即调用动画完成侦听器。
我用Looper.getMainLooper().isCurrentThread()验证了我在主线程上
然而,我能够让动画再次工作的唯一方法是将其包裹在 AndroidSchedulers.mainThread().scheduleDirect(() -> {}) 中
正如这段代码所示,实际上不应该改变任何东西
final Thread before = Thread.currentThread();
AndroidSchedulers.mainThread().scheduleDirect(() -> {
boolean nothingChanged = before == Thread.currentThread();
//nothingChanged is true
});
为什么我必须将动画重新安排到它已经运行的线程上才能让它工作?
编辑:不涉及 RxJava,甚至发生了更奇怪的事情。 我剪掉了 RxJava,即使我将动画代码放在 onNavigationItemSelected() 中,问题仍然存在,当用户单击某些东西时,它由 android 调用,所以它肯定在正确的线程中。
我的动画是这样的。
alertBanner.clearAnimation();
alertBanner.animate()
.alpha(0)
.translationY(alertBanner.getHeight())
.setDuration(500)
.setListener(new AnimatorListenerBuilder().setOnAnimationEnd(animator -> {
alertBanner.setVisibility(GONE);
}))
.start();
AnimatorListenerBuilder 只是一个实用类,它封装了 AnimatorListener 并让您只定义您想要的回调。它适用于我的应用中的所有其他动画,并且在几个月内没有更改。
【问题讨论】:
标签: java android rx-java rx-java2 rx-android