Android:如何在填充RecyclerView时避免片段事务的延迟或动画跳过?

18

我正在使用一些Fragment,但是当从一个Fragment切换到另一个Fragment时,过渡动画很卡顿,有时甚至会跳过整个动画(我读过的文章中说这有时是Fragment性能差的结果)。

非常有趣的是,该Fragment中的所有数据获取和计算都完全异步地使用了放置在计算线程上的协同程序。而且包含数据的数组列表甚至不是很长或具有许多参数。我在UI线程上做的唯一事情就是将最终列表设置到RecyclerView Adapter上并调用notifyDataSetChanged()->就是这样!因此,我的结论是ViewHolder膨胀本身才是导致卡顿的原因。ViewHolder的布局XML也非常简单(drawable资源和三个字符串)。

在Fragment事务方面,我使用一组自定义的XML对象动画器将当前Fragment替换为新Fragment,并进行提交。

我看到一些答案说我应该延迟约2秒钟设置Adapter上的项,但见鬼,对于最终用户在该Fragment中导航并等待白屏显示数据突然出现的情况,这看起来非常糟糕。我希望平稳的60fps过渡到新的Fragment,同时已经显示出数据。

这个问题在安卓上是否可行?我不是苹果的粉丝,但就动画流畅度而言,iOS设备在这方面完爆了混乱的安卓。

我需要任何形式的建议或示例来展示如何解决这个问题。

谢谢!


尝试使用https://developer.android.com/studio/profile/cpu-profiler来测量哪些内容正在变慢。总的来说,您所描述的情况肯定是可能的。 - Ben P.
你最终解决了这个问题吗?我也遇到了这个问题... - loalexzzzz
4
有点儿,对于性能差的手机仍会出现微小的延迟,这个问题将一直存在,所以我会忽略它。但对于在过去3到4年里发布的平均好的手机,通过在活动启动时创建碎片实例来解决了这个问题。与在按下按钮时创建或替换碎片并导致动画延迟相比,我在活动创建时添加碎片并立即隐藏它。当导航到碎片时,我只使用show()而不是add()/replace(),因为充气已在之前完成,并且不会干扰UI线程上的动画。 - M'aiq the Coder
谢谢您的回复,我终于找到了解决方案,请见下文,希望对您也有所帮助。 - loalexzzzz
1个回答

18

尝试在添加/替换片段时添加startOffset(如300ms),片段将从后台预加载,300ms后,应用程序将运行动画,平滑显示您的片段。

300ms只是一个随机数字,它真正取决于您需要初始化多重UI。

希望这有所帮助。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">
    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        android:duration="400"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        />
    <translate
        android:startOffset="300"
        android:fromYDelta="100%"
        android:toYDelta="0%"
        android:duration="400"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        />
</set>

如果有人想这样做:在'set'块内设置'android:startOffset'。 - SerjantArbuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接