如何在普通类的静态方法中调用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:
- 自定义Application类:
public class MyApplication extends Application { private static Context sAppContext; @Override public void onCreate() { super.onCreate(); sAppContext = getApplicationContext(); } public static Context getAppContext() { return sAppContext; } }
- 在
AndroidManifest.xml的<application>标签中添加配置:android:name=".MyApplication" - 修改
calc方法直接使用全局Context:
SharedPreferences prefrs = MyApplication.getAppContext().getSharedPreferences("MY_PRE_NAME", Context.MODE_PRIVATE);
额外注意
你原代码中String res = String.valueOf(res);属于语法错误,此时res变量尚未初始化,直接引用会编译报错,上述修复方案中已经同步修正该问题。
内容的提问来源于stack exchange,提问作者hitakb
相关产品推荐
相关产品推荐

