如何将上下文与SharedPreferences一起使用?

时间:2019-12-10 08:13:15

标签: android sharedpreferences

当前,我使用这种方式来获取上下文:

SharedPreferences sharedPref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Context context = MyApplication.getAppContext();
        sharedPref = context.getSharedPreferences("MyPref", Context.MODE_PRIVATE);
    }

MyApplication类:

public class MyApplication extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        MyApplication.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return MyApplication.context;
    }
}

我正在尝试从MainActivity

中调用MovieUpdatesService中的方法

MainActivity方法:

public void checkNow() {
        new Thread(() -> {
            String site = null;
            if (sharedPref.contains("site")) //line 153
                site = sharedPref.getString("site", "Not available");

            //codes...

        }).run();
}

MovieUpdatesService类:

public class MovieUpdatesService extends JobService {

    //codes...

    public void doBackgroundWork(final JobParameters params) {
        if (jobCancelled)
            return;

        new MainActivity().checkNow();

        Log.d(TAG, "Job finished");
        jobFinished(params, false);
    }

    //codes...
}

我在运行时收到NullPointerException,我认为这与上下文有关

错误:

java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.content.SharedPreferences.contains(java.lang.String)' on a null object reference
        at com.tashila.movieupdates.MainActivity.lambda$checkNow$0(MainActivity.java:153)

该如何解决? 我是Android的新手,所以我希望得到一个简化的答案(:

2 个答案:

答案 0 :(得分:3)

MainActivity中,当您onCreate时会调用startActivity。因此,当您呼叫new MainActivity()时,onCreate不会被呼叫,并且sharedPref不会被初始化。建议您将sharePref移至sigleton类,以管理应用程序中的所有首选项。

class AppPref {
  SharedPreferences sharedPref;
  private static AppPref instance;

  private AppPref(Context context) {
    sharedPref = context.getSharedPreferences("MyPref", Context.MODE_PRIVATE);
  }

  static AppPref getInstance(Context context) {
    if (instance == null) {
      instance = new AppPref(context);
    }
    return context;
  }

  public void someMethod() {
    // ....
  }
}

// Somewhere in your app
AppPref.getInstance(context).someMethod()

答案 1 :(得分:0)

我使用以下方法来解决此问题:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static MainActivity instance;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        instance = this;
    }

    public static MainActivity getInstance() {
        return instance;
    }

    public void myMethod() {
       // do something...
    }
)

AnotherClass.java

public Class AnotherClass() {
     // call this method
     MainActivity.getInstance().myMethod();
}

参考:https://stackoverflow.com/a/47241833/10389123