【问题标题】:SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)
【发布时间】:2020-12-09 08:04:24
【问题描述】:

我不明白为什么会这样

我在代码中提到 /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);

    }
}

【问题讨论】:

  • getActivity() 正在返回 null 。这意味着 Fragment 未附加。你在哪里有这个代码?在哪个生命周期方法中?
  • 可以添加PlayerFragment的代码吗?
  • 您的上下文为空。在创建 PrefManager 之前,使用片段内部的 isAddedonDestroy 中的 PrefManager 检查片段是否处于活动状态。

标签: java android android-fragments sharedpreferences


【解决方案1】:

当您创建 new PrefManager(getActivity()) 时,您的 Fragment 未附加到 Activity

尝试将您的代码放入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 在某些(事实上:大多数)导致 NPE 的情况下可能是 null,这可能是您的情况

【讨论】:

  • this.prefManager = new PrefManager(container.getContext());我在创建时添加这个仍然有这个错误先生
  • 这条线是用什么方法放的?
  • 谢谢大佬的回复,终于找到Exo播放器的错误了
【解决方案2】:

@snachmsm @Bek @ADM @akhilnair 感谢您的回复,我终于在生命周期中的 Exo 播放器上解决了错误

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

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多