SharedReferences android.content.context.getSharedReferences(java.lang.string,int)

ddrv8njm  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(549)

我不明白为什么会这样
我在代码中提到了/错误,所以您可以很容易地找到
你知道怎么解决这个问题吗?有时它正常工作,没有任何错误,但有时它抛出nullpointerexception
错误日志

  1. java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
  2. at com.app.android.Provider.PrefManager.<init>(PrefManager.java:34)
  3. at com.app.android.ui.fragement.PlayerFragment.addView(PlayerFragment.java:1901)
  4. at com.app.android.ui.fragement.PlayerFragment$25.onPlayerStateChanged(PlayerFragment.java:993)

prefmanager.java文件

  1. public class PrefManager {
  2. SharedPreferences pref;
  3. SharedPreferences.Editor editor;
  4. Context _context;
  5. // shared pref mode
  6. int PRIVATE_MODE = 0;
  7. // Shared preferences file name
  8. private static final String PREF_NAME = "status_app";
  9. private static final String IS_FIRST_TIME_LAUNCH = "IsFirstTimeLaunch";
  10. public PrefManager(Context context) {
  11. this._context = context;
  12. pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);//Error Here
  13. editor = pref.edit();
  14. editor.apply();
  15. }
  16. public void setBoolean(String PREF_NAME,Boolean val) {
  17. editor.putBoolean(PREF_NAME, val);
  18. editor.commit();
  19. }
  20. public void setString(String PREF_NAME,String VAL) {
  21. editor.putString(PREF_NAME, VAL);
  22. editor.commit();
  23. }
  24. public void setInt(String PREF_NAME,int VAL) {
  25. editor.putInt(PREF_NAME, VAL);
  26. editor.commit();
  27. }
  28. public boolean getBoolean(String PREF_NAME) {
  29. return pref.getBoolean(PREF_NAME,true);
  30. }
  31. public void remove(String PREF_NAME){
  32. if(pref.contains(PREF_NAME)){
  33. editor.remove(PREF_NAME);
  34. editor.commit();
  35. }
  36. }
  37. public String getString(String PREF_NAME) {
  38. if(pref.contains(PREF_NAME)){
  39. return pref.getString(PREF_NAME,null);
  40. }
  41. if (PREF_NAME.equals("LANGUAGE_DEFAULT")){
  42. return "0";
  43. }
  44. if(PREF_NAME.equals("ORDER_DEFAULT_IMAGE")){
  45. return "created";
  46. }
  47. if(PREF_NAME.equals("ORDER_DEFAULT_GIF")){
  48. return "created";
  49. }
  50. if(PREF_NAME.equals("ORDER_DEFAULT_VIDEO")){
  51. return "created";
  52. }
  53. if(PREF_NAME.equals("ORDER_DEFAULT_JOKE")){
  54. return "created";
  55. }
  56. if(PREF_NAME.equals("ORDER_DEFAULT_STATUS")){
  57. return "created";
  58. }
  59. return "";
  60. }
  61. public int getInt(String key) {
  62. return pref.getInt(key,0);
  63. }
  64. }

playerfragment.java文件

  1. final PrefManager prefManager = new PrefManager(getActivity()); //Error Here
  2. Integer id_user = 0;
  3. String key_user= "";
  4. if (prefManager.getString("LOGGED").toString().equals("TRUE")) {
  5. id_user= Integer.parseInt(prefManager.getString("ID_USER"));
  6. key_user= prefManager.getString("TOKEN_USER");
  7. }

playerfragment.java文件

  1. public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
  2. if (playbackState == ExoPlayer.STATE_READY) {
  3. simple_arc_loader_exo.setVisibility(View.GONE);
  4. exo_pause.setVisibility(View.GONE);
  5. exo_play.setVisibility(View.GONE);
  6. playing = true;
  7. exo_play.setColorFilter(Color.WHITE, android.graphics.PorterDuff.Mode.SRC_IN);
  8. addView();// Error Here
  9. }
  10. if (playbackState == ExoPlayer.STATE_BUFFERING) {
  11. simple_arc_loader_exo.setVisibility(View.VISIBLE);
  12. exo_pause.setVisibility(View.GONE);
  13. exo_play.setVisibility(View.GONE);
  14. }
  15. }
0qx6xfy6

0qx6xfy61#

你的 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
}

  1. 它将被称为后 `onCreateView` 这是一个正确的方法。如果你真的需要用这个 `PrefManager` 您可以选择尝试以下操作:

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

  1. 但请注意 `ViewGroup container` 可能是 `null` 在某些(事实上:大多数)情况下导致npe,这可能是你的情况
展开查看全部
zbdgwd5y

zbdgwd5y2#

@snachmsm@bek@adm@akhilnair感谢您的回复,我终于在exo播放器的生命周期中找出了错误

  1. `@Override
  2. public void onPause() {
  3. super.onPause();
  4. if (Util.SDK_INT > 23) {
  5. Log.v("VideoPlayer","onPause");
  6. releasePlayer();
  7. }
  8. releasePlayer();// add this solve the error same line in onstop also
  9. }`

相关问题