播放Android下载内容报NullPointerException,在线流播放正常如何解决
问题原因
- 核心触发原因:报错日志明确说明
Content实例为空时调用了getReference()方法导致空指针异常。你当前仅判断了Intent.extras不为空,没有校验从extras中取出的content是否为空,直接调用方法就会触发崩溃。 - 为什么在线播放正常、下载播放异常:播放在线流的跳转逻辑中,你正确将
Content序列化对象传入了Intent的参数中;而播放下载内容的跳转入口没有传该参数,导致从extras中取出的content为null。小概率可能是下载场景下传递的Content对象序列化失败,但该情况可能性极低,因为在线播放场景序列化逻辑是正常的。
修复方案
1. 优先添加空校验兜底(必做)
在拿到content对象后立刻做非空校验,避免后续逻辑直接崩溃,示例代码:
Bundle extras = getIntent().getExtras(); if(extras != null){ content = (Content) extras.getSerializable(Content.LOCAL_CONTENT_OBJECT); IS_STREAM = extras.getBoolean(Content.LOCAL_IS_STREAM); } // 新增非空校验逻辑 if (content == null) { Toast.makeText(this, "播放内容异常,请重试", Toast.LENGTH_SHORT).show(); finish(); // 关闭页面,不执行后续逻辑 return; } // 原有后续逻辑 plvm = new ViewModelProvider(this).get(PlaybackViewModel.class); ...
2. 排查下载内容的跳转入口(必做)
找到你点击下载内容跳转PlayerActivity的代码,确认是否添加了传参逻辑,确保和在线播放的跳转逻辑一致,示例:
// 下载内容跳转PlayerActivity时必须传这两个参数 Intent intent = new Intent(CurrentActivity.this, PlayerActivity.class); intent.putExtra(Content.LOCAL_CONTENT_OBJECT, 你本地存储的下载对应的Content实例); intent.putExtra(Content.LOCAL_IS_STREAM, false); startActivity(intent);
3. 可选优化
如果下载内容的Content实例已经存储在本地数据库中,也可以改为传递reference字符串或者内容ID,到PlayerActivity后从本地查询实例,比传递序列化对象更稳定,避免序列化过程中出现的意外问题。
内容的提问来源于stack exchange,提问作者hamsoace
相关产品推荐
相关产品推荐

