我想在共享首选项中保存我从登录活动中获得的令牌,因此当用户重新打开应用程序时,如果令牌与共享首选项中的令牌相同,则转到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();
}
答案 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);
也会调用此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();
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();
}
这意味着将意图声明公开给异步任务类..因此可以在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"