0

Я попытался создать собственный класс для извлечения некоторых значений из SharedPreferences. Моя цель - достичь этих значений из любого класса.Пользовательский класс расширяет приложение для целей Singleton

Я получаю исключения нулевого указателя на

SharedPreferences prefs = getApplicationContext().getSharedPreferences("UserFile", MODE_PRIVATE); 

Мой код, как показано ниже;

public class UserInfo extends Application { 

    private String token; 
    private String SAVED_USERNAME; 

    public UserInfo() { 
     SharedPreferences prefs = getApplicationContext().getSharedPreferences("UserFile", MODE_PRIVATE); 
     token = prefs.getString("Token", null); 
    } 

    public String getToken() { 
     return token; 
    } 
} 

Что может быть не так?

+0

Я думаю, когда вы getApplicationContext приложение не запускается вообще, так что вы можете 't получить контекст, может быть, вы должны попробовать getSharedpreference после метода oncreate(). –

+0

взгляните на http://stackoverflow.com/questions/5018545/getapplication-vs-getapplicationcontext первый ответ – Shine

ответ

0

Существует правило в android - не использовать конструктор компонента приложения: Activity/Fragment/Application/Service ... существует метод onCreate(), потому что в вашем контексте конструктора будет null. Поэтому переместите свой код в onCreate(). Также вам необходимо установить свой UserInfo как приложение в Manifest.

0

Убедитесь, что вы зарегистрировали этот класс в своем файле AndroidManifest.XML.

<application android:name=".UserInfo" 
    ... 
/> 

Примечание: Ваш путь для доступа к общим предпочтениям, кажется, не хорошо. Я скорее сам объявляю класс с именем PreferencesHelper и размещаю там все настройки.

public class PreferencesHelper{ 
    private SharedPreferences mPrefs; 

    public PreferencesHelper(Context context){ 
     this.mPrefs = context.getSharedPreferences("name", Context.MODE_PRIVATE); 
    } 

    public getToken() { 
     return mPrefs.getString("Token", null); 
    } 

    public String setToken(String token) { 
     mPrefs.edit().putString("Token", token).apply(); 
    } 
} 
0

Вы не создать конструктор класса Application вместо этого, используйте код в onCreate():

@Override 
public void onCreate() { 
    super.onCreate(); 
    SharedPreferences prefs = getApplicationContext().getSharedPreferences("UserFile", MODE_PRIVATE); 
    token = prefs.getString("Token", null); 
} 

и использовать его с какой-либо деятельности:

UserInfo userInfo = (UserInfo)getApplication(); 
String token = userInfo.getToken(); 
+0

Я не могу вызвать getApplication() @ djhs16 – erdemgc

+0

@erdemgc, вы можете вызвать getApplication() только в действии. или если вы хотите использовать данные в других классах, кроме активности, тогда вы можете создать статический одноэлементный класс, не нужно расширять приложение. – djhs16

1

Обычно Android компоненты инициализируется во время их жизненного цикла. В этом конкретном случае вы не можете получить доступ к приложениям Context и SharedPreferences, потому что они еще не инициализированы.

Вторая проблема может быть (благодаря моей Crystall мяч), что вы не добавили Application к AndroidManifest

Итак, ваша первая мысль может быть переместить код инициализации из конструктора onCreate. Это решило бы эту конкретную проблему.

Однако, это плохая практика делать то, что вы делаете. Потому что на одно приложение может быть только 1 Application. Это ограничит вас одним одним синглэном для каждого приложения. Рассмотрите возможность использования Application, чтобы предоставить приложение Context как singleton и создать еще один singleton для предоставления UserInfo.

Нет примеров, пожалуйста, проявите себя.

1

Просто используйте этот метод в классе утилиты. Не нужно расширять приложение.

public static String getToken(Context context) { 
    return PreferenceManager.getDefaultSharedPreferences(context).getString("Token", null); 
} 
0
public class MyApp extends Application { 


private static MyApp _instance; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    _instance = this; 
} 
public static MyApp getInstance(){ 
    return _instance; 
} 

public String getToken() { 
    return getSharedPreferences("UserFile", MODE_PRIVATE).getString("Token", null); 
} 
} 

В манифесте:

<application 
    android:name="your.package.MyApp" 
    > 

Если вы whant использование:

String token = MyApp.getInstance().getToken();