Application 代码大体是这个样子的
public class MyApp extends Application {
private static MyApp sApp;
private static SharedPreferences sDefaultSP;
@Override
public void onCreate() {
super.onCreate();
sApp = this;
sDefaultSP = PreferenceManager.getDefaultSharedPreferences(this);
}
public static SharedPreferences getDefaultSP() {
return sDefaultSP;
}
public static Application get() {
return sApp;
}
看回传的日志,在很少数量的用户设备上,某个 Activity.onCreate 调用 getDefaultSP()的时候,会获取到空值,引发崩溃。感觉挺奇怪的,正常系统重建不应该和 Application 有关系啊,即便是整个进程重建,也应该会再走一遍 Application.onCreate 才对啊。
1
lychee930224 7 天前
我之前也有遇到过同样的问题,确实能观察到很小一部分这样案例。
|
2
RightHand 7 天前 via Android
因为 jvm 还没有真正的把静态对象初始化完成
|
![]() |
3
SmaliYu OP @lychee930224 只是希望存键值对的时候不依赖 Context ,结果还是有一些奇怪的问题
|
4
lychee930224 7 天前
@SmaliYu 写一个静态方法,然后判空同步取吧
|
![]() |
5
SmaliYu OP @lychee930224 我下一版会尝试将这两个 SP 移到一个和 Application 无关的类里面(类似 SPManager ),在别的地方初始化,看看还会不会有问题
|
![]() |
6
bjzhou1990 7 天前
看一下具体是什么场景调用为空的,比如 ContentProvider 就比 Application 启动更早
|
![]() |
7
SmaliYu OP @bjzhou1990 嗯,不过我应用里没有使用 ContentProvider 组件,应该不涉及这个问题
|
![]() |
8
phcbest 6 天前
写成 bylazy 的形式吧,或者直接用 get
val sp1 by lazy { this.getSharedPreferences("111", Context.MODE_PRIVATE) } val sp2: SharedPreferences get() { return this.getSharedPreferences("222", Context.MODE_PRIVATE) } |
![]() |
10
HojiOShi 6 天前
|
![]() |
11
phcbest 6 天前
@maokg 改成 kt 呗,反正可混编,或者用 https://github.com/Blankj/AndroidUtilCode 这个,这个有集成 SP 的工具类,上下文是用反射获得的,如果不想要太多功能就把这个 SP 部分单独拷出来用
|
12
zhanlanhuizhang 7 小时 35 分钟前
用 mmkv ,sp 就是这么垃圾。
|
13
limiter 3 小时 31 分钟前
有没有其他三方库开了多进程
|