Android5/6设备启动崩溃:CallbackWithHandler.onTypefaceResult空指针异常
问题原因
该崩溃是androidx.core库低于1.3.0版本的已知兼容bug,仅出现在Android 5.0、Android 6.0系统上:本地res/font目录下的XML字体资源在低版本系统解析时,会触发字体请求回调里的空指针异常,堆栈指向CallbackWithHandler.onTypefaceResult的空对象调用。
修复方案
方案1(推荐):升级依赖
将androidx.core:core依赖版本升级到1.3.0及以上,该版本官方已经修复了onTypefaceResult方法的空值判断逻辑,直接更新依赖即可解决问题。
方案2:改用Assets加载字体
如果暂时无法升级依赖,可将字体文件从res/font目录移动到src/main/assets/font目录,放弃XML字体声明,改用代码直接加载字体,避开系统XML解析的兼容缺陷:
// 加载字体示例 Typeface robotoBold = Typeface.createFromAsset(getAssets(), "font/roboto_bold.ttf"); // 给控件设置字体 textView.setTypeface(robotoBold);
方案3:强制提前同步加载字体
如果需要保留res/font的XML声明方式,可在Application初始化阶段,提前同步加载所有用到的字体,禁用异步请求逻辑:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { // 依次预加载所有用到的字体 ResourcesCompat.getFont(context, R.font.roboto_bold); ResourcesCompat.getFont(context, R.font.roboto_medium); ResourcesCompat.getFont(context, R.font.roboto_regular); }
内容的提问来源于stack exchange,提问作者Andriy D.
相关产品推荐
相关产品推荐

