You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SharedPreferences未创建:ADB安装APK导致应用崩溃求助

问题分析与解决方案

这个问题其实很常见,核心差异在于两种安装方式下应用的初始状态完全不同:

为什么会出现这种差异?

  • 当你通过Android Studio直接安装到真机时,大概率是增量安装(除非你手动卸载过应用),之前测试时写入的SharedPreferences数据会被保留,所以getFirsUsageAppFromSharedPreferences能读取到之前存储的值,不会返回null。
  • 而通过adb install安装构建好的APK时,这是一个全新的安装环境(如果之前卸载了应用,或者用了adb install -r但之前的数据被彻底清理),此时SharedPreferences文件还没有被创建——因为SharedPreferences文件只有在首次执行写入操作时才会生成,单纯的读取操作不会触发文件创建。你的方法直接返回null,如果后续代码没有处理这个null值,自然会触发崩溃。

解决方法

1. 给读取方法设置默认值,避免返回null

修改你的getFirsUsageAppFromSharedPreferences方法,在getString的第二个参数传入一个合理的默认值(比如空字符串),这样即使没有该键值对,也不会返回null:

public static String getFirsUsageAppFromSharedPreferences(Context context) { 
    SharedPreferences prefs = context.getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
    // 将null替换为默认值,比如空字符串
    return prefs.getString("firstUsage", ""); 
}

2. 在应用启动时提前初始化SharedPreferences

如果"firstUsage"需要记录首次启动的标识(比如时间戳),可以在自定义Application类的onCreate方法中提前初始化这个值,确保读取时一定有数据:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
        String firstUsage = prefs.getString("firstUsage", null);
        if (firstUsage == null) {
            // 首次启动,写入初始值,比如当前时间戳
            prefs.edit()
                .putString("firstUsage", String.valueOf(System.currentTimeMillis()))
                .apply();
        }
    }
}

记得在AndroidManifest.xml中配置这个自定义Application类:

<application
    android:name=".MyApplication"
    ...>
    ...
</application>

3. 完善后续代码的null值处理

如果必须保留返回null的逻辑,那一定要确保调用getFirsUsageAppFromSharedPreferences的代码处,有完整的null判断逻辑:

String firstUsage = getFirsUsageAppFromSharedPreferences(context);
if (firstUsage != null) {
    // 处理非空逻辑
} else {
    // 处理空值情况,比如执行初始化操作
}

内容的提问来源于stack exchange,提问作者f.trajkovski

火山引擎 最新活动