#java #android #android-fragments #sharedpreferences
#java #Android #android-фрагменты #sharedpreferences
Вопрос:
Я не понимаю, почему это происходит
Я упоминаю /Error здесь в коде, чтобы вы могли легко узнать
Есть идеи, как исправить проблему? Иногда он работает как обычно без каких-либо ошибок, но иногда он выдает исключение NullPointerException
Журнал ошибок
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
at com.app.android.Provider.PrefManager.<init>(PrefManager.java:34)
at com.app.android.ui.fragement.PlayerFragment.addView(PlayerFragment.java:1901)
at com.app.android.ui.fragement.PlayerFragment$25.onPlayerStateChanged(PlayerFragment.java:993)
PrefManager.java
public class PrefManager {
SharedPreferences pref;
SharedPreferences.Editor editor;
Context _context;
// shared pref mode
int PRIVATE_MODE = 0;
// Shared preferences file name
private static final String PREF_NAME = "status_app";
private static final String IS_FIRST_TIME_LAUNCH = "IsFirstTimeLaunch";
public PrefManager(Context context) {
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);//Error Here
editor = pref.edit();
editor.apply();
}
public void setBoolean(String PREF_NAME,Boolean val) {
editor.putBoolean(PREF_NAME, val);
editor.commit();
}
public void setString(String PREF_NAME,String VAL) {
editor.putString(PREF_NAME, VAL);
editor.commit();
}
public void setInt(String PREF_NAME,int VAL) {
editor.putInt(PREF_NAME, VAL);
editor.commit();
}
public boolean getBoolean(String PREF_NAME) {
return pref.getBoolean(PREF_NAME,true);
}
public void remove(String PREF_NAME){
if(pref.contains(PREF_NAME)){
editor.remove(PREF_NAME);
editor.commit();
}
}
public String getString(String PREF_NAME) {
if(pref.contains(PREF_NAME)){
return pref.getString(PREF_NAME,null);
}
if (PREF_NAME.equals("LANGUAGE_DEFAULT")){
return "0";
}
if(PREF_NAME.equals("ORDER_DEFAULT_IMAGE")){
return "created";
}
if(PREF_NAME.equals("ORDER_DEFAULT_GIF")){
return "created";
}
if(PREF_NAME.equals("ORDER_DEFAULT_VIDEO")){
return "created";
}
if(PREF_NAME.equals("ORDER_DEFAULT_JOKE")){
return "created";
}
if(PREF_NAME.equals("ORDER_DEFAULT_STATUS")){
return "created";
}
return "";
}
public int getInt(String key) {
return pref.getInt(key,0);
}
}
PlayerFragment.java
final PrefManager prefManager = new PrefManager(getActivity()); //Error Here
Integer id_user = 0;
String key_user= "";
if (prefManager.getString("LOGGED").toString().equals("TRUE")) {
id_user= Integer.parseInt(prefManager.getString("ID_USER"));
key_user= prefManager.getString("TOKEN_USER");
}
PlayerFragment.java
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == ExoPlayer.STATE_READY) {
simple_arc_loader_exo.setVisibility(View.GONE);
exo_pause.setVisibility(View.GONE);
exo_play.setVisibility(View.GONE);
playing = true;
exo_play.setColorFilter(Color.WHITE, android.graphics.PorterDuff.Mode.SRC_IN);
addView();// Error Here
}
if (playbackState == ExoPlayer.STATE_BUFFERING) {
simple_arc_loader_exo.setVisibility(View.VISIBLE);
exo_pause.setVisibility(View.GONE);
exo_play.setVisibility(View.GONE);
}
}
Комментарии:
1.
getActivity()
возвращает значение null . это означает, что фрагмент не прикреплен. Откуда у вас этот код? в каком методе жизненного цикла?2. Можете ли вы добавить код
PlayerFragment
?3. Ваш контекст равен нулю. Перед созданием
PrefManager
проверьте, является ли фрагмент живым, используяisAdded
inside fragment и вonDestroy
makePrefManager
null .
Ответ №1:
ваш Fragment
не привязан к Activity
при создании new PrefManager(getActivity())
попробуйте поместить свой код в onActivityCreated
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Activity is alive, Fragment attached, can create new PrefManager
final PrefManager prefManager = new PrefManager(getActivity());
// ... rest of code
}
он будет вызван ПОСЛЕ onCreateView
, и это правильный способ. если вам ДЕЙСТВИТЕЛЬНО нужно использовать это PrefManager
, вы можете попробовать это:
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final PrefManager prefManager = new PrefManager(container.getContext());
// ... rest of code
но обратите ViewGroup container
null
внимание, что в некоторых (фактически: в большинстве) случаев это может быть причиной NPE, что, вероятно, является вашим случаем
Комментарии:
1. this.prefManager = новый PrefManager(container.getContext()); я добавляю это при создании, но все равно получаю эту ошибку, сэр
2. в какой метод вы поместили эту строку?
3. спасибо за ответ, сэр, я наконец нашел ошибку, она на Exo player
Ответ №2:
@snachmsm @Bek @ADM @akhilnair Спасибо за ответ, я наконец-то исправил ошибку на Exo player в жизненном цикле
`@Override
public void onPause() {
super.onPause();
if (Util.SDK_INT > 23) {
Log.v("VideoPlayer","onPause");
releasePlayer();
}
releasePlayer();// add this solve the error same line in onstop also
}`