简体   繁体   中英

SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)

I don't understand why this is happening

I Mention /Error Here in the code so you can easily find out

Any idea how to fix the issue? Sometimes it works as normal without any error but some times it throws NullPointerException

Error Log

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

    }
}

your Fragment isn't attached to Activity when you create new PrefManager(getActivity())

try to put your code in 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
}

it will be called AFTER onCreateView and this is a proper way. if you REALLY need to use this PrefManager you may optionally try this:

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final PrefManager prefManager = new PrefManager(container.getContext());
    // ... rest of code

but note that ViewGroup container may be null in some (in fact: most) cases causing NPE, which is probably your case

@snachmsm @Bek @ADM @akhilnair Thanks for the reply I finally font out the error it on the Exo player in the lifecycle

`@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
}`

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM