2016-11-30 3 views
-1

Я пытаюсь использовать SharedPreferences в не activity класса от onResume() в деятельности, но я получаю NullPointerException на context.SharedPreferences в не деятельности класса NullPointerException

По какой-то причине я не могу получить context в onResume(). Не уверен, что я что-то упустил, но любая помощь будет оценена.

onResume() в моей деятельности

@Override 
protected void onResume() { 
    super.onResume(); 
    // The activity has become visible (it is now "resumed"). 

    // Check User's Access Token exists and hasn't expired. 
    AccountFunctions accountFunctions = new AccountFunctions(); 

    if (!accountFunctions.validateUserToken(this)) { 
     Intent intent = new Intent(this, LoginActivity.class); 
     startActivity(intent); 
    } 
} 

метод validateUserToken (контекст контекста) в AccountFunctions Класс

public Boolean validateUserToken(Context context) { 

    SharedPreferences sharedPref = context.getSharedPreferences(getString(R.string.user_file_key), Context.MODE_PRIVATE); // This is where the error is thrown 
    String accessToken = sharedPref.getString(getString(R.string.user_access_token), null); 
    DateTime expiryDate = new DateTime(sharedPref.getLong(getString(R.string.user_expires), 0)); 

    if (accessToken == null || expiryDate.isBeforeNow()) { 
     return false; 
    } else { 
     return true; 
    } 
} 

Ошибка

java.lang.RuntimeException: невозможно возобновить активность {uk.co.itsstonbury.www.intouch.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод ' android.content.Context android.content.Context.getApplicationContext()»на нулевой объект ссылка

+0

Возможный дубликат [Как использовать SharedPreferences в Android хранить, получать и редактировать значения] (HTTP: // StackOverflow.com/questions/3624280/how-to-use-sharedpreferences-in-android-to-store-fetch-and-edit-values) – Chisko

+1

Ваша проблема заключается в том, что 'AccountFunctions', как представляется, расширяет некоторые классы Context или Activity , и это действительно не должно. –

+2

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

ответ

3

заменить getString(R.str с context.getString потому AccountFunctions класс не был создан операционной системой, так что не имеет своей собственной контекст готов.

В основном деятельность получает ее контекст формы приложения при oncreate функций вызываются с помощью обратных вызовов OS, так как это не произойдет в этом случае, так AccountFunctions объекта не будет иметь свой собственный контекст

Этот код просто предположит, что AccountFunctions будет создан нормально через intent, но в этом случае он похож на простой объект класса, который не связан с вызовами жизненного цикла активности.

так что ваш код будет выглядеть

public Boolean validateUserToken(Context context) { 

    SharedPreferences sharedPref = context.getSharedPreferences(context.getString(R.string.user_file_key), Context.MODE_PRIVATE); // This is where the error is thrown 
    String accessToken = sharedPref.getString(context.getString(R.string.user_access_token), null); 
    DateTime expiryDate = new DateTime(sharedPref.getLong(context.getString(R.string.user_expires), 0)); 

    if (accessToken == null || expiryDate.isBeforeNow()) { 
     return false; 
    } else { 
     return true; 
    } 
} 

или вы можете использовать строковые значения непосредственно

SharedPreferences sharedPref = context.getSharedPreferences("yourkey", Context.MODE_PRIVATE); // This is where the error is thrown 

или

Лучшим вариантом является создать отдельный класс Util для вспомогательной функции, а как

class Util{ 

    public static boolean validateUserToken(Context context) { 

     SharedPreferences sharedPref = context.getSharedPreferences(context.getString(R.string.user_file_key), Context.MODE_PRIVATE); // This is where the error is thrown 
     String accessToken = sharedPref.getString(context.getString(context.R.string.user_access_token), null); 
     DateTime expiryDate = new DateTime(sharedPref.getLong(context.getString(R.string.user_expires), 0)); 

     if (accessToken == null || expiryDate.isBeforeNow()) { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

от вашей активности называют это как

Util.validateUserToken(this); 
+0

@ cricket_007 this 'getString (context.Rs' будет пытаться найти и использовать контекст активности' AccountFunctions', которого нет, потому что OP только что создал объект –

+0

Да, я уже говорил выше. 'GetString' не должен быть напрямую доступный метод этого класса –

+0

@ cricket_007, так как 'AccountFunctions' - это такая тонкая проблема в этом случае: P –

0

Заменить SharedPreferences sharedPref = context.getSharedPreferences(getString(R.string.user_file_key), Context.MODE_PRIVATE); с
SharedPreferences sharedPref = context.getSharedPreferences(context.getString(R.string.user_file_key), Context.MODE_PRIVATE);

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

  • Нет связанных вопросов^_^