SharedPrefs 似乎已被擦除,即使我使用它们来自动登录

Posted

技术标签:

【中文标题】SharedPrefs 似乎已被擦除,即使我使用它们来自动登录【英文标题】:SharedPefs seeminly wiped even though I use them to auto login 【发布时间】:2014-04-18 15:21:12 【问题描述】:

我正在尝试将共享首选项保存到我的应用程序中,我保存了用户名和密码。

成功登录后,这些会被很好地存储。当我杀死应用程序,然后重新打开它时,它会使用共享首选项自动登录。

但是,当我导航到帐户管理活动并尝试再次访问首选项时,找不到用户名和密码的密钥并返回默认值。我肯定会使用正确的键值,因为如果在第一次启动时没有存储用户/密码首选项,则需要手动登录时它工作得非常好。

这真的让我很困惑,因为用户名和密码密钥显然存在,否则它不会自动登录。

一些代码:

这是我的帐户管理活动:

公共类 AccManagement 扩展了 Activity

TextView textName;
TextView textEmail;
String SharedUsername;
String SharedPassword;

@Override
protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_acc_management);
    textName = (TextView)findViewById(R.id.textviewName);
    textEmail = (TextView)findViewById(R.id.textviewEmail);

            //these return null, as if there are no shared prefs stored.
    SharedUsername= SharedPrefsWrapper.getFromPrefs(this, "USERNAME", null);
    SharedPassword= SharedPrefsWrapper.getFromPrefs(this, "PASSWORD", null);

我为共享首选项创建了一个包装类,它获取键/值对并将其放入共享首选项中。

这是我检查用户是否存在于我的主要活动中的方式:

public void Checker()


    String SharedUsername= SharedPrefsWrapper.getFromPrefs(this, "USERNAME", null);
    String SharedPassword= SharedPrefsWrapper.getFromPrefs(this, "PASSWORD", null);

    if(SharedUsername== null || SharedPassword== null)
    
        setContentView(R.layout.activity_main);
    
    else
    
        Login(url);
    

登录执行一个http请求,完成时调用此方法:

   public void onTaskCompleted(String data) 
   

    if(data.contains("name")) //a successful login will return a json string with "name".
    
        Intent intent = new Intent(this, MenuActivity.class);
        SharedPrefsWrapper.saveToPref(this, "USERNAME", textusername);
        SharedPrefsWrapper.saveToPref(this, "PASSWORD", textpassword);
            startActivity(intent);
        
 

成功登录后,用户将进入一个包含帐户管理按钮的菜单,单击后将进入帐户管理,其中显示用户名和密码。虽然这是我的问题发生的地方。它找不到我在登录时保存的共享首选项。仅当应用程序使用共享首选项自动登录时才会发生这种情况。如果这是第一次登录,它似乎工作正常,并且当我尝试从我的帐户活动中获取它们时,共享首选项似乎仍然存在。

感谢您的帮助

很抱歉,如果这个问题根本没有意义!

:)

编辑:

SharedPrefs 类方法:

public static void saveToPref(Context context, String key, String value)

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    final SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();


public static String getFromPrefs(Context context, String key, String defValue)

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    try
    
        return prefs.getString(key, defValue);
    
    catch(Exception ex)
    
        return defValue;
    

【问题讨论】:

您是否将您的编辑提交到某处的 SharedPrefs?像 editor.commit(); 这样的东西? 你能展示你的SharedPrefsWrapper类吗?这很可能是问题所在。 我已经对原帖进行了编辑:) 【参考方案1】:

自动登录时,textusername 和 textpassword 为空,所以这会清除您的偏好设置。

尽量尊重java naming conventions,你的代码很难阅读。

【讨论】:

以上是关于SharedPrefs 似乎已被擦除,即使我使用它们来自动登录的主要内容,如果未能解决你的问题,请参考以下文章

Scala:抽象类型模式 A 未选中,因为它已被擦除消除

当我尝试复制它并将副本推送到同一向量中时,向量中的对象有时会被擦除

即使存在日志,Kafka经纪人也会关闭

将自定义类分配给控制器后,Xcode Table View 被擦除

Java泛型之类型未被擦除

将 DirectX 精灵移出屏幕时如何防止其被擦除