无法在共享偏好中检索已保存的值

时间:2014-10-19 15:02:18

标签: android sharedpreferences

我想在共享首选项中保存我从登录活动中获得的令牌,因此当用户重新打开应用程序时,如果令牌与共享首选项中的令牌相同,则转到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();
        }

2 个答案:

答案 0 :(得分: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))

围绕他们玩..让我知道它是否有帮助

答案 1 :(得分:0)

首先检查一下

 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)它检查两个对象是否相等但是因为一个为null,所以有一个空指针异常.. < / p>

完成后,session.createLoginSession(token);也会调用此onPostExecutesession.createLoginSession(token);是存储令牌值的方法 因此,除非您在注册期间存储此值,否则将会有NPE ..

也在doInBackground你这样做

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

它可能适合你,但它不适当的编码 - (也可能是失败)..我建议你把意图放在代码的onPostExecute中,因为当你的doInBackground是完成所以在那里启动意图并在调用`finish();

之前调用startActivity(i)

以及

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

我认为你的祝酒词应该是成功的吗?通过转换你的代码(那是jux btw)

所以在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"