【问题标题】:Shared preference is taking wrong context共享偏好采用错误的上下文
【发布时间】:2014-02-18 06:56:50
【问题描述】:

嗨,我正在使用 共享偏好 保存我的数据。在我的项目中,活动 1 中有 2 个活动,我将数据保存在 asynctask 内的 shared preference 中 >> @ 987654322@ 方法。在异步任务中,我正在从服务器下载多个文件。当我的第一个文件下载开始并且我正在更改活动时,我的 Activity-1 在后台,我的 Activity-2 在前台。我的文件正在后台下载我的@ 987654323@这次也调用SharedePreference返回空上下文,它给出了空指针异常。

如果 Activity-1 在前台,我没有收到空指针异常。 如果任何其他活动出现在前台,为什么它会返回空上下文?

我的日志:

02-18 06:45:55.503: W/System.err(1242): java.lang.NullPointerException
02-18 06:45:55.503: W/System.err(1242):     at info.helper.MyPreferences.savePreferences(MyPreferences.java:17)
02-18 06:45:55.503: W/System.err(1242):     at info.activity.DownloadActivity$DownloadFileFromURL.doInBackground(DownloadActivity.java:820)
02-18 06:45:55.503: W/System.err(1242):     at info.activity.DownloadActivity$DownloadFileFromURL.doInBackground(DownloadActivity.java:1)
02-18 06:45:55.503: W/System.err(1242):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
02-18 06:45:55.503: W/System.err(1242):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-18 06:45:55.503: W/System.err(1242):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-18 06:45:55.503: W/System.err(1242):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-18 06:45:55.503: W/System.err(1242):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-18 06:45:55.503: W/System.err(1242):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-18 06:45:55.503: W/System.err(1242):     at java.lang.Thread.run(Thread.java:856)
02-18 06:45:55.503: W/dalvikvm(1242): threadid=24: thread exiting with uncaught exception (group=0xa62b6288)

编辑#1

保存应用数据的常用方法:

public static void savePreferences(Context context, String key, String value) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(
            MY_ST_PREFS, Context.MODE_PRIVATE);
    Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();
}

像这样在 AsyncTask 中保存数据:

 MyPreferences.savePreferences(DownloadActivity.this.getActivity(),
                        "downloading_storyid", downloadingStoryId);

【问题讨论】:

  • 代码在哪里??在此处添加相应的代码..
  • 在 asyn 的后期执行中保存共享首选项
  • 请检查我的编辑。
  • 你的类是用 Fragment 还是 FragmentActivity 扩展的??
  • 我的 DownloadActivity 扩展了 Fragment。

标签: android nullpointerexception sharedpreferences


【解决方案1】:

因为您在 asyntask 中使用上下文,所以它指向 asyntask 而不是活动。你必须像这样在 asyntask 中传递上下文:

youractivityname.this ;

【讨论】:

  • 请检查我的编辑#1。我的活动扩展了片段
  • 为什么要将其设为私有。默认情况下是私有的。
  • 是的,默认情况下它采用 int 值 0(MODE_PRIVATE) 而不是 0 我提到了 MODE_PRIVATE。根据我的问题提到这个 MODE_PRIVATE 有什么问题吗?
  • 尝试删除这个 SharedPreferences sharedPreferences = context.getSharedPreferences(MY_ST_PREFS, Context.MODE_PRIVATE);并添加
  • SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferecences(youtactivityname.this);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多