Android 在SplashScreen中使用SharedReference时使用空指针
我正在开发一个应用程序,我想在splashscreen期间在SharedReference中存储一些数据,然后在主活动加载后读取这些数据。如果我从MainActivity保存数据,则数据将被保存,并且我能够将其取回。但如果我试图在splashscreen中保存数据,我会得到nulpointer Exception。例外情况如下:Android 在SplashScreen中使用SharedReference时使用空指针,android,Android,我正在开发一个应用程序,我想在splashscreen期间在SharedReference中存储一些数据,然后在主活动加载后读取这些数据。如果我从MainActivity保存数据,则数据将被保存,并且我能够将其取回。但如果我试图在splashscreen中保存数据,我会得到nulpointer Exception。例外情况如下: java.lang.RuntimeException: An error occured while executing doInBackground() at
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at com.example.amandeepsingh.loginregisterandother.SharedPreferncesExecutor.save(SharedPreferncesExecutor.java:22)
at com.example.amandeepsingh.loginregisterandother.SplashScreenActivityWithAsyncTask$PrefetchData.doInBackground(SplashScreenActivityWithAsyncTask.java:79)
at com.example.amandeepsingh.loginregisterandother.SplashScreenActivityWithAsyncTask$PrefetchData.doInBackground(SplashScreenActivityWithAsyncTask.java:36)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
以下是我的示例代码:
SplashScreenActivityWithAsyncTask:
public class SplashScreenActivityWithAsyncTask extends Activity{
//String now_playing, earned;
private SharedPreferncesExecutor sharedPreference;
Activity context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_screen);
/**
* Showing splashscreen while making network calls to download necessary
* data before launching the app Will use AsyncTask to make http call
*/
Activity context = this;
new PrefetchData().execute();
}
/**
* Async Task to make http call
*/
private class PrefetchData extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// before making http calls
}
@Override
protected Void doInBackground(Void... arg0) {
sharedPreference = new SharedPreferncesExecutor();
sharedPreference.save(context,"SchoolData","Updated data from Splash Screen");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// After completing http call
// will close this activity and lauch main activity
Intent i = new Intent(SplashScreenActivityWithAsyncTask.this, MainActivity.class);//Here Main activity is the splash screen.
//i.putExtra("now_playing", now_playing);
//i.putExtra("earned", earned);
startActivity(i);
// close this activity
finish();
}
}
}
公共类SplashScreenActivityWithAsyncTask扩展活动{
//弦乐演奏,赢得;
私人股份参考执行人股份参考;
活动语境;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_屏幕);
/**
*显示splashscreen,同时拨打网络电话进行必要的下载
*启动应用程序之前的数据将使用AsyncTask进行http调用
*/
活动上下文=此;
新建预取数据().execute();
}
/**
*进行http调用的异步任务
*/
私有类预取数据扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//在进行http调用之前
}
@凌驾
受保护的Void doInBackground(Void…arg0){
sharedPreference=新的SharedPreferenceExecutor();
save(上下文,“学校数据”,“从启动屏幕更新的数据”);
试一试{
睡眠(3000);
}捕捉(中断异常e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
//完成http调用后
//将关闭此活动并启动主活动
Intent i=新Intent(SplashScreenActivityWithAsyncTask.this,MainActivity.class);//这里的主活动是初始屏幕。
//i、 putExtra(“正在播放”,正在播放);
//i、 额外收入(“挣来的”,挣来的);
星触觉(i);
//关闭此活动
完成();
}
}
}
请提供帮助。您的类成员
上下文
为空,因为在onCreate
中,声明
Activity context = this;
您正在隐藏成员类的可见性,以支持本地成员。为避免歧义,您可以使用活动的名称。此(SplashScreenActivityWithAsyncTask。此
,在您的情况下),而不指定任何引用。在异步任务中,从
sharedPreference.save(context,
到
您正在onCreate中声明一个局部变量,并为其分配活动的值。未修改成员变量上下文。它保持为空,您将获得NPE。 不需要创建任何成员变量。你可以这么做 而不是
sharedPreference.save(context,"SchoolData","Updated data from Splash Screen");
使用
异步任务是SplashScreenActivityWithAsyncTask的非静态内部类,因此它已经有了对该活动的引用
sharedPreference.save(context,"SchoolData","Updated data from Splash Screen");
sharedPreference.save(SplashScreenActivityWithAsyncTask.this, "SchoolData",
"Updated data from Splash screen");