无法在共享首选项中检索保存的值

亚历克斯

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

首先检查一下

 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,因此存在null指针异常。

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完成操作后会调用它,因此在其中启动意图并startActivity(i)在调用`之前先调用它。结束();

并且

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"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章