如何解决Android加载Firebase存储GIF时调用setImageDrawable空指针报错问题?
问题根源
你遇到的闪退是空指针异常导致的,核心原因是:
ViewPager默认采用懒加载策略,只会预加载当前显示页和相邻的1个页面,你在Activity的onCreate阶段就直接调用第三个页面的img2Right控件执行setImageDrawable操作时,第三个页面还没有被加载到视图树中,img2Right还没有完成控件绑定,是空对象,调用方法就会触发崩溃。
解决方法
你可以根据你的实际需求选择以下任意一种方案:
方案1(推荐):将页面资源加载逻辑和页面生命周期绑定
不要把所有页面的GIF加载逻辑都放在Activity的onCreate中,把每个页面的加载逻辑放到PagerAdapter的instantiateItem方法中,当对应页面的布局被实例化完成后,再获取当前页的ImageView控件,触发对应GIF的下载、渲染逻辑。
方案2:调整ViewPager预加载页数
如果你的页面总数只有3个,可以直接调高ViewPager的预加载阈值,让Activity启动时就加载所有3个页面,在初始化ViewPager的位置添加如下代码即可:
// 表示预加载当前页左右各2个页面,3个页面的场景下会全部完成预加载 viewPager.offscreenPageLimit = 2
方案3:添加空判断兜底
在所有调用ImageView设置资源的位置添加空安全调用,避免空指针触发崩溃:
gifImage2Right.getFile(localFile2Right).addOnSuccessListener { val gif2RightFromPath = GifDrawable(localFile2Right.absolutePath) // 加?做空安全校验,控件为空时不会执行后续方法 img2Right?.setImageDrawable(gif2RightFromPath) }.addOnFailureListener { Toast.makeText(this, "Failed to retrieve the image", Toast.LENGTH_SHORT).show() }
内容的提问来源于stack exchange,提问作者MRSL
相关产品推荐
相关产品推荐

