You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在普通类的静态方法中调用getSharedPreferences读取存储值

错误原因

getSharedPreferences 是Android Context类的专属成员方法,只有Context及其子类(Activity、Service、Application等)的实例才能调用。你自定义的Dataall类不属于Context子类,静态calc方法中也未持有可用的Context实例,因此直接调用该方法必然报错。

修复方案
  • 方案1:给静态方法传入Context参数
    修改calc方法签名,新增Context入参,优先使用ApplicationContext避免内存泄漏,修复后代码如下:
public class Dataall {
    // 新增Context参数
    public static String calc(Context context, String nfirst, String nsecond) {
        int abn1 = Integer.parseInt(nfirst);
        int abn2 = Integer.parseInt(nsecond);
        int abn3;

        // 用传入的Context调用获取SharedPreferences
        SharedPreferences prefrs = context.getSharedPreferences("MY_PRE_NAME", Context.MODE_PRIVATE);
        String langu = prefrs.getString("callss", "");
        abn1 = langu.equals("first") ? 15 : 20;
        
        abn3 = abn1 + abn2;
        // 修复原代码的变量引用错误:原代码错误用res作为参数,改为abn3
        return String.valueOf(abn3);
    }
}

在Activity中调用时传入实例即可:
String result = Dataall.calc(YourActivity.this, "输入1", "输入2");

  • 方案2:缓存全局Application Context
    如果需要频繁调用该方法不想每次传参,可以在应用启动时缓存全局Context:
  1. 自定义Application类:
public class MyApplication extends Application {
    private static Context sAppContext;

    @Override
    public void onCreate() {
        super.onCreate();
        sAppContext = getApplicationContext();
    }

    public static Context getAppContext() {
        return sAppContext;
    }
}
  1. 在AndroidManifest.xml的<application>标签中添加配置:
    android:name=".MyApplication"
  2. 修改calc方法直接使用全局Context:
SharedPreferences prefrs = MyApplication.getAppContext().getSharedPreferences("MY_PRE_NAME", Context.MODE_PRIVATE);
额外注意

你原代码中String res = String.valueOf(res);属于语法错误,此时res变量尚未初始化,直接引用会编译报错,上述修复方案中已经同步修正该问题。

内容的提问来源于stack exchange,提问作者hitakb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:12:06