我想将登录活动中获得的令牌保存为共享首选项,因此,当用户重新打开应用程序时,如果令牌与共享首选项中的令牌相同,则转到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();
}
这意味着将意图公开声明给异步任务类..以便可以在其中访问它onPostExecute
并doInBackground
希望所有这些帮助。
最后复制并粘贴
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] 删除。
我来说两句