ExoPlayer SimpleCache单例实现仍报多实例冲突错误求助
检查单例的实际复用情况
先确认你的DownCache类是不是真的复用了Application中初始化的全局单例SimpleCache,而非在类内部自行实例化。很多开发者会在下载工具类里图方便直接new SimpleCache,完全没用到全局单例,这是触发该异常的最常见原因。可以在SimpleCache的构造方法中添加日志,查看调用次数和调用栈,定位是否存在多处实例化的情况。排查多进程导致的重复初始化
如果你的App存在多进程(比如开启了独立的下载服务进程、推送进程),自定义Application会在每个进程启动时执行初始化逻辑,导致每个进程都创建一个指向同一路径的SimpleCache实例,进而触发异常。解决方法是在初始化单例前,先判断当前进程是否为主进程:// 获取当前进程名 public static String getCurrentProcessName(Context context) { int pid = android.os.Process.myPid(); ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) { if (appProcess.pid == pid) { return appProcess.processName; } } return ""; } // 在Application的onCreate中判断 @Override public void onCreate() { super.onCreate(); String currentProcess = getCurrentProcessName(this); if (currentProcess.equals(getPackageName())) { // 仅在主进程初始化SimpleCache和DownloadManager initDownloadComponents(); } }验证缓存路径的一致性
确认Application中初始化SimpleCache的路径,与DownCache类中使用的路径完全一致。比如是否存在一处用getExternalFilesDir(Environment.DIRECTORY_MUSIC)、另一处用getFilesDir()的情况?或是路径拼接时多/少了斜杠,导致实际指向的文件夹不同?可以将两个路径打印日志对比,确保完全匹配。检查依赖注入或其他初始化渠道
若使用了依赖注入框架(如Dagger、Hilt),需检查是否在多个模块中都提供了SimpleCache实例,导致框架重复创建对象。确保整个App中仅存在一处SimpleCache单例的提供逻辑,且所有使用场景都注入该单例。
内容的提问来源于stack exchange,提问作者StackOverflower

