【问题标题】:SharedPreferences makes app force closeSharedPreferences 使应用程序强制关闭
【发布时间】:2013-03-06 15:52:45
【问题描述】:

我想通过一个类读写SharedPreferences,但是当我在我的活动中调用这个类时,它会使应用程序崩溃/强制关闭

如果选中CheckBox“记住电子邮件”,则应用程序将记住该电子邮件。

我的LoginActivity:

public class LoginActivity extends Activity
{
    private AppPreferences appPreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);        
        appPreferences = new AppPreferences(); // this makes the app crash
        String email = appPreferences.getPreferenceString("email");
        // ...

班级appPreferences

public class AppPreferences extends Activity
{
    private SharedPreferences settings = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        settings = this.getSharedPreferences(LOGIN_CREDENTIALS, MODE_PRIVATE);
    }
    public String getPreferenceString(String key) {
        return settings.getString(key, DEFAULT_STRING);
    }
    public void setPreferenceString(String key, String value) {
    editor.putString(key, (String) value);
    }
// ...

我一直在寻找几个小时来解决这个问题,我尝试了 SO 的几种解决方案。我确实在onCreate 方法中调用了getSharedPreferences 方法,这样就不会出现问题了。

我做错了什么?我是 Java 和 Android 开发的新手,所以请用示例充分描述。也欢迎其他采用完全不同方法的解决方案。提前致谢。

【问题讨论】:

  • 请出示您的 LogCat。你有什么样的错误?
  • @Dediqated 你试过我的解决方案了吗.. 仍然错误发布 logcat。

标签: android crash sharedpreferences forceclose


【解决方案1】:

因为您正在尝试创建一个扩展 Activity 类的类对象。如果 AppPreferences 是非 Activity 类,那么只需传递当前的 Activity 上下文以将 SharedPreferences 相关代码分离到单独的 java 类中:

public class AppPreferences  
{
    private SharedPreferences settings = null;
    Context context;
    public AppPreferences(Context context){
     this.context=context;
     settings = context.getSharedPreferences(LOGIN_CREDENTIALS, MODE_PRIVATE);
    }
//your code here....

}

现在使用 AppPreferences 构造函数传递 Activity 上下文:

appPreferences = new AppPreferences(LoginActivity.this);
String email = appPreferences.getPreferenceString("email");

【讨论】:

  • 完美!谢谢这个工作,也谢谢你的解释。现在唯一的问题是,如果我强制关闭应用程序,电子邮件就不会被记住.. 你知道怎么做吗?
【解决方案2】:

不要在 AppPreferences 中扩展 Activity 类。并删除onCreate() 方法。

这样做。

public class AppPreferences extends Activity
{
    private SharedPreferences settings = null;
    AppPreferences(Context context) {
        settings = context.getSharedPreferences(LOGIN_CREDENTIALS, MODE_PRIVATE);
    }

    ...//Rest of your code.

}

在登录活动中。

appPreferences = new AppPreferences(this);

【讨论】:

  • 您的解决方案也有效,但如果我只使用首选项,我不知道该扩展是否必须存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多