Android LinearProgressIndicator出现updateSurface: has no frame日志问题
解决LinearProgressIndicator不确定模式下Logcat频繁输出
updateSurface: has no frame日志的问题 问题重现
在ConstraintLayout中使用Material线性进度指示器并开启不确定模式后,应用功能正常,但Debug包的Logcat会每秒输出大量updateSurface: has no frame日志,移除indeterminate属性后日志消失。相关布局代码如下:
<com.google.android.material.progressindicator.LinearProgressIndicator android:id="@+id/loadingBar" android:layout_width="0dp" android:layout_height="wrap_content" android:indeterminate="true" android:indeterminateOnly="true" app:indeterminateAnimationType="disjoint" app:indicatorColor="@color/primaryLightColor" app:layout_constraintBottom_toTopOf="@+id/loadingBarText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:trackColor="@color/primaryColor" app:trackThickness="4dp" />
日志产生原因
- 该日志来自
android.view.SurfaceView类,仅在Debug包中出现——Debug模式下系统会输出更详细的调试级日志,Release包默认会过滤这类非关键性调试信息,完全不会影响生产环境的性能或用户体验。 - 当
LinearProgressIndicator开启不确定模式(尤其是使用disjoint动画类型)时,进度条会持续高频刷新动画帧。在部分场景下,SurfaceView尝试更新Surface时,对应动画帧还未准备完成,就会触发这条调试日志。本质是Debug模式下的正常调试输出,并非功能Bug。
解决办法
1. 直接忽略(推荐方案)
由于该日志仅在Debug环境出现,且不影响生产包运行,可直接忽略。若觉得日志干扰调试,可在Logcat中添加过滤规则:在搜索框输入 -updateSurface: has no frame,即可屏蔽这条日志。
2. 调整进度指示器配置
- 简化属性设置:
android:indeterminateOnly="true"已经强制进度指示器处于不确定模式,可移除android:indeterminate="true"属性,避免重复配置引发的潜在问题。 - 更换动画类型:尝试将
app:indeterminateAnimationType改为contiguous,部分场景下可减少该日志的输出频率。
3. 替换为系统原生ProgressBar(可选)
如果不需要Material组件的特定样式,可尝试使用系统原生ProgressBar替代,示例代码如下:
<ProgressBar android:id="@+id/loadingBar" android:layout_width="0dp" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" android:indeterminate="true" app:layout_constraintBottom_toTopOf="@+id/loadingBarText" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" />
内容的提问来源于stack exchange,提问作者Luca Biasotto
相关产品推荐
相关产品推荐

