我决定在我的应用程序开头创建一个启动画面。我创建了一个1600x900的图像并将其用作drawable。当我运行我的应用程序时,似乎每个动作都有1秒的延迟。在检查完所有内容之后,我意识到它是不正确的引起这种滞后的闪屏。测试表明,以这种方式制作成抽屉的高分辨率图像会导致延迟,我不知道为什么。
我的图像重100kb,我逐渐降低分辨率,尺寸和滞后也逐渐降低。我还制作了一个高分辨率,5kb图像并且滞后持续存在,这意味着分辨率主要是罪魁祸首。
为什么会发生这种情况?如何在没有后续影响的情况下使用闪屏?
代码:
样式中的:
<style name="splashscreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:windowBackground">@drawable/splashscreen</item>
</style>
清单中的:
<application
android:allowBackup="true"
android:icon="@drawable/logo"
android:label="@string/app_name"
android:fullBackupContent="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
android:label="@string/app_name"
android:theme="@style/splashscreenTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
答案 0 :(得分:2)
您遇到的延迟可能是由于垃圾收集或堆大小增加。
您的图片为1600*900 = 1440000px
。每个像素的内存大小为四个字节 - 每个颜色一个(RGB),一个用于透明度(A)。因此,我们可以计算:1440000 * 4B = 5760000B
所以在堆上为单独的字节数组分配大约5.7 MB。但它是一个可绘制的,并且比字节数组有更多的字段,所以最终会有更多。
添加活动,字符串,其他图像和资源,它会更高。
现在,每当您创建一个新对象时,VM都会尝试删除一些未使用的对象(垃圾收集),从而导致一个小的延迟。如果它无法释放足够的内存,堆会增加(也会导致小的滞后)。
您可能正面临其中一个问题,那么您可以做些什么呢?
您没有写它,但我认为启动画面不是您应用的唯一活动。问题是启动画面在后台保持活动状态。你无法真正做任何事情,但你至少可以手动删除drawable。
View window = getWindow().getDecorView();
if (window.getBackground() != null) {
window.getBackground().setCallback(null);
window.setBackground(null);
}
通常,在xml属性中不使用大图像是一个更好的主意。以自己真正需要的大小自己创建位图的内存效率要高得多(并非所有设备都具有1600 * 900的分辨率)。
Android为您提供BitmapFactory
课程。有关整个主题的详细信息,请查看Pre-scaling Bitmaps和Most memory efficient way to resize bitmaps on android?。