2014-10-19 2 views
1

Я хочу сохранить токен, который я получил от активности входа, в общих настройках, поэтому, когда пользователь снова открывает приложение, если токен совпадает с токеном в общих предпочтениях, он переходит в SecondActivity если не он идет к LoginActivity я пробовал много, но не могу заставить его работать, пожалуйста, помогитеНе удается получить сохраненное значение в sharedpreferences

методы класса, ответственного за сохранение и retrevieng данных

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

вашего hasmap является лексемой .. что тогда маркер? в вашем коде – Elltz

+0

acces_token, я получаю его от ответа Json в loginActivity – Alex

ответ

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, "") пустой .. если вы не обрабатывать регистрации в различиях класса

это не было проблемой, когда вы использовали 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); 

это может работать для вас, но его не надлежащего coding- (то есть, возможно, также флоп) .. я предлагаю вам поставить намерение в onPostExecute вашего кода, так как он вызывается, когда ваш doInBackground является сделайте это, и начните свое намерение, а также вызовите startActivity(i), прежде чем вы назовете `finish();

, а также

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

я думаю, что ваш тост сообщение должно быть успех не должен это ?? путь преобразования коды (это Jux кстати)

так, чтобы подвести его во время вашего 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

Edit 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); Instantiate маркеров пустого значения token = "default value should be here"

+0

спасибо много, про первый вопрос я thauch, что это значение по умолчанию , если нет токен был получен, о session.createLoginSession (токен), если у меня нет регистрации, пользователи просто входят в систему, не существует способа для действительного compair значений? – Alex

+0

Я не понимаю, но об сравнении значений функция equals() сравнивает их. Поэтому последний код, который я написал, копирует и вставляет его в метод checklogin и проверяет, работает ли он @Alex – Elltz

+0

Мне очень жаль, я хотел чтобы сохранить токен, когда пользователь входит в систему, а затем он истекает, пользователь снова переходит к логину, я сделал, как вы сказали, но все же у меня есть исключение нулевого указателя, в oncreate on line 'session.checkLogin (токен, SavedToken);', но это потому, что токен в oncreate имеет значение null, поэтому мне нужно как-то его исправить, еще раз спасибо вам за то, что потратили время и помогли мне, этот мой вопрос был немым с самого начала, я попытаюсь перекодировать его, может быть, у меня будет идея, как это вытащить, еще раз спасибо – Alex

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)) 

игра вокруг них .. Пусть мне знать, если это помогает

+0

Я пытался, я получаю нулевой указатель на этой строке, может быть, потому, что я не сохраняю значение, как оно должно быть сохранено – Alex

+0

какая линия вы получаете NPE – Elltz

+0

at baymd.baymd.library.SesionManagement.checkLogin (SesionManagement.java:33) if (value.equals (gotValue)) Я пробовал и ту же ошибку, я могу опубликовать свою полную регистрационную активность – Alex

Смежные вопросы