SharedPreferences使app力量接近

时间:2013-03-06 15:52:46

标签: android crash sharedpreferences forceclose

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

如果选中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的几个解决方案。我确实在getSharedPreferences方法中调用onCreate方法,这样就不会出现问题了。

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

2 个答案:

答案 0 :(得分:1)

不要在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);

答案 1 :(得分:1)

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

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构造函数将活动上下文传递为:

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