【问题标题】:Can't retrieve saved value in sharedpreferences无法在 sharedpreferences 中检索保存的值
【发布时间】:2014-10-19 15:02:18
【问题描述】:

我想将我从登录活动中获得的令牌保存在共享首选项中,因此当用户重新打开应用程序时,如果令牌与共享首选项中的令牌相同,则转到 SecondActivity,否则转到 LoginActivity 我试了很多,但不能让它工作,请帮助

负责保存和检索数据的方法类

public class SesionManagement {
    SharedPreferences pref;
    SharedPreferences.Editor editor;
    Context _context;
    int PRIVATE_MODE = 0;
    private static final String PREF_NAME = "STORAGEBAY";
    public static final String KEY_NAME = "token";

    public SesionManagement(Context context){
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }
    public void createLoginSession(String name){
        editor.putString(KEY_NAME, name);
        editor.commit();
    }
    public void checkLogin(String value,String gotValue){

        if(value==gotValue) {
            Toast.makeText(_context, "FAILED", Toast.LENGTH_SHORT).show();
            Intent i = new Intent(_context, NavDraver.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            _context.startActivity(i);
        }
        else{
            editor.clear();
            editor.commit();
            Intent i = new Intent(_context, Login.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            _context.startActivity(i);
        }
    }

我如何在 LoginActivity onCreate 中做到这一点

 session=new SesionManagement(getApplicationContext());
  HashMap<String, String> tokens = session.getUserDetails();
  String name = tokens.get(session.KEY_NAME);
  if(token!=null) {
  session.checkLogin(token, name);
  }

然后我将值存储在 LoginActivity onPostExecute

  @Override
        protected void onPostExecute(String s) {
          session.createLoginSession(token);

            pDialog.dismiss();
        }

【问题讨论】:

  • 你的hasmap是tokens..那么token是什么?在您的代码中
  • acces_token,我从 loginActivity 中的 Json 响应中得到它

标签: android sharedpreferences


【解决方案1】:

一切看起来都不错,但这是因为这条线

 public void checkLogin(String value,String gotValue){

    if(value==gotValue) {  //this line
        Toast.makeText(_context, "FAILED", Toast.LENGTH_SHORT).show();
        Intent i = new Intent(_context, NavDraver.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        _context.startActivity(i);
    }

改成

if(value.equals(gotValue)) or  if(value.matches(gotValue))

和他们一起玩。如果有帮助,请告诉我

【讨论】:

  • 我试过了,我在这一行得到一个空指针,可能是因为我没有保存应该如何保存的值
  • 哪一行得到NPE
  • 在baymd.baymd.library.SesionManagement.checkLogin(SesionManagement.java:33) if(value.equals(gotValue)) 我尝试了两个但仍然相同的错误,我可以发布我的完整登录活动
  • 我遇到了问题,oncreate中的token为null,现在我要考虑如何使token在oncreate中不为null
  • 你解决了吗?如果没有,请粘贴它,让我帮你重新编程@Alex
【解决方案2】:

首先检查一下

 public HashMap<String, String> getUserDetails(){
    HashMap<String, String> tokens = new HashMap<String, String>();
    tokens.put(KEY_NAME, pref.getString(KEY_NAME, ""));
    return tokens;
}

出现的问题是 1 如果这是用户第一次登录怎么办?这意味着pref.getString(KEY_NAME, "") 是空的.. 除非您在 diff 类中处理注册

当您使用value==gotValue 时这不是问题,但现在您使用的是value.equals(gotValue),它会检查两个对象是否相等,但由于一个对象为空,因此存在空指针异常..

这个session.createLoginSession(token);在你完成后在onPostExecute中被调用,session.createLoginSession(token);是存储你的令牌值的方法 因此,除非您在注册期间存储此值,否则将有一个 NPE..

也可以在您的doInBackground 中执行此操作

Intent i = new Intent(Login.this, NavDraver.class);
i.putExtra("cjson",c.toString());
finish();
startActivity(i);

它可能对您有用,但它的编码不正确-(也可能失败).. 我建议您将意图放在代码的 onPostExecute 中,因为它在您的 doInBackground 完成时被调用,所以开始在你调用 `finish();

还有

if(value.matches(gotValue)) {
        Toast.makeText(_context, "FAILED", Toast.LENGTH_SHORT).show();

我认为您的吐司信息应该是成功的,不是吗?通过代码的转换(顺便说一句)

所以在你的onPostExecute 中总结一下,试试这个

 @Override
    protected void onPostExecute(String s) {
        session.createLoginSession(token);
        tokens = session.getUserDetails();
        SavedToken = tokens.get(session.KEY_NAME);
        Log.d("SAVED TOKEN",SavedToken);
        startActivity(i);
        finish();
        pDialog.dismiss();
    }

这意味着将意图声明为对异步任务类公开。因此可以在onPostExecutedoInBackground 中访问它 希望所有这些都有帮助..

最后复制粘贴

public void checkLogin(String value,String gotValue){
     if(value == null && gotValue == null && value.isEmpty() && gotValue.isEmpty()){
        return;
       }else{
     if(value.matches(gotValue)) {
        Toast.makeText(_context, "FAILED", Toast.LENGTH_SHORT).show();
        Intent i = new Intent(_context, NavDraver.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        _context.startActivity(i);
    }
    else{
        editor.clear();
        editor.commit();
        Intent i = new Intent(_context, Login.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        _context.startActivity(i);
    }
}

帮助移除 NPE

编辑 2:好的,我想我找到了一些东西

private String token, none,SavedToken; //look at token..

现在你在调用session.checkLogin(token, name); take a look at what i have at paste of code之前还没有在任何地方实例化它

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_login);
    session=new SesionManagement(getApplicationContext());
    HashMap<String, String> tokens = session.getUserDetails();
    SavedToken = tokens.get(session.KEY_NAME);


    user = (EditText) findViewById(R.id.inputEmail);
    pass = (EditText) findViewById(R.id.inputPass);
    mSubmit = (Button) findViewById(R.id.loginBtn);
    mSubmit.setOnClickListener(this);
}

稍后在您的 doinbackground 代码中实例化了它 token = c.getString(TAG_TOKEN); 所以我建议在 setContentView(R.layout.activity_login); 将令牌实例化为空值 token = "default value should be here"

【讨论】:

  • 非常感谢,关于我认为这是默认值的第一个问题,如果没有获得令牌,关于 session.createLoginSession(token),如果我没有注册用户只是登录,没有办法实际比较值?
  • 我不明白你..但是关于比较equals()函数比较它们的值..所以我写的最后一个代码将它复制并粘贴到checklogin方法中并检查它是否有效@Alex
  • 对不起,我想在用户登录时保存令牌,然后它过期用户再次登录,我按照你说的做了,但我仍然有空指针异常,在oncreate on line 'session.checkLogin(token,SavedToken);',但这是因为 oncreate 中的令牌为空,所以我需要以某种方式修复它,再次感谢您浪费您的时间并帮助我,我的这个问题是从一开始就很笨,通过 json 对登录表单进行编码是不好的,我会尝试重新编码,也许我会知道如何将其拉出来,再次感谢您
  • 哦@Alex别担心ayt..im gud..从edit2开始检查我的编辑..让我知道它是否有帮助或NPE是否持续
  • 还检查添加到您的 checklogin() 方法以检查默认值是否正常,并使用该默认值设置令牌,以便您消除 NPE,并且当该值是该默认值时,它会继续像这样的登录..我很快就会编辑..也很抱歉我的不一致@Alex
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2016-10-30
  • 2012-09-02
相关资源
最近更新 更多