【问题标题】:Edit SharedPreferences with an Alarm使用警报编辑 SharedPreferences
【发布时间】:2016-01-10 18:33:09
【问题描述】:

我是 Android 开发的新手,我试图在每天的特定时间更新一个值,以便当用户打开应用程序时,该值是当天的当前值。 我这样做的方式是调用一个警报,该警报执行我的 mainactivity.java 中的一个方法,该方法编辑 sharedPreferences 中的一个值。代码示例:

--------------MainActivity.java------ --------

 protected void onCreate(Bundle savedInstanceState) {
 [...]
 int myVar=0;
 //Retrieving my saved data
     int sPSavedData=getPreferences(Context.MODE_PRIVATE).getInt("DATA", 0);
     if(sPSavedData!=(0))
       {
        myVar=sPSavedData;
       }
  [...]
    }
//doing my thing
public void myCode(){
myVar=+1;
saveSP();
}
//saving data in Shared Preferences
public void saveSP(){
SharedPreferences.Editor sPEditor=getPreferences(Context.MODE_PRIVATE).edit(); //<---I get an error here
sPEditor.putInt("DATA", myVar);
sPEditor.commit();
}
[...]

然后是我的具有接收器的 Alarm.java 文件:

[...]
public void onReceive(Context context, Intent intent)
    {
        MainActivity code=new MainActivity();
        code.myCode();
     }
[...]

尝试执行此操作时出现错误

sPEditor=getPreferences(Context.MODE_PRIVATE).edit() 

并且理解 logcat 我理解它与无法检索包名称有关。

有什么方法可以修复我的错误或任何其他方法来做我想做的事情吗?

【问题讨论】:

    标签: java android sharedpreferences alarmmanager


    【解决方案1】:

    像这样调整你的代码:

    saveData()

    public void saveData(Context context, int data){
        SharedPreferences sharedPref = getDefaultSharedPreferences(context);
        SharedPreferences.Editor spEditor = sharedPref.edit();
        spEditor.putInt("DATA", data);
        spEditor.commit();
    }
    

    getData()

    public int getData(Context context){
        SharedPreferences sharedPref = getDefaultSharedPreferences(context);
        int sPSavedData= sharedPref.getInt("DATA", 0);
        return sPSavedData;
    }
    

    myCode()

    public void myCode(Context context){
        int sPSavedData = getData(context);
        if(sPSavedData != 0){
            saveData(context, sPSavedData++);
        }
    }
    

    onReceive()

    public void onReceive(Context context, Intent intent){
        MainActivity code=new MainActivity();
        code.myCode(context);
    }
    

    【讨论】:

    • 这可行,但是,这似乎用默认值覆盖了我的共享首选项。因此,例如,如果我在 myVar 中存储了整数 50,则下次应用打开时该值将被重置。
    【解决方案2】:

    试试这个....

    SharedPreferences sPEditor = getSharedPreferences("yourfilename", 0);     
    SharedPreferences.Editor sPEditor = sPEditor.edit();    
    

    应该能解决你的问题

    【讨论】:

    • 所以澄清一下,“你的文件名”只是我想给它的任何名称,还是必须是一个特定的名称?因为我得到一个空指针异常。
    • 它可以是您喜欢的任何名称...顺便说一句,您从哪里得到空指针?需要更多信息才能让您的代码运行...
    • 在同一行,SharedPreferences sPEditor = getSharedPreferences("yourfilename", 0);
    【解决方案3】:

    Context 仅在打开应用程序时创建,而不是在实例化应用程序/活动的类时创建。如果您想访问应用程序的上下文,您需要使用 BroadcastReceiver 并按照此处的示例 Using alarmmanager and broadcastreceiver in android 来安排定期警报。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多