Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在SplashScreen中使用SharedReference时使用空指针_Android - Fatal编程技术网

Android 在SplashScreen中使用SharedReference时使用空指针

Android 在SplashScreen中使用SharedReference时使用空指针,android,Android,我正在开发一个应用程序,我想在splashscreen期间在SharedReference中存储一些数据,然后在主活动加载后读取这些数据。如果我从MainActivity保存数据,则数据将被保存,并且我能够将其取回。但如果我试图在splashscreen中保存数据,我会得到nulpointer Exception。例外情况如下: java.lang.RuntimeException: An error occured while executing doInBackground() at

我正在开发一个应用程序,我想在splashscreen期间在SharedReference中存储一些数据,然后在主活动加载后读取这些数据。如果我从MainActivity保存数据,则数据将被保存,并且我能够将其取回。但如果我试图在splashscreen中保存数据,我会得到nulpointer Exception。例外情况如下:

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");