当前,我使用这种方式来获取上下文:
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的新手,所以我希望得到一个简化的答案(:
答案 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();
}