Java SharedReferences问题-丢失上次保存的值
我面临一个奇怪的问题,我的应用程序从用户输入中收集一些数据,并将其保存在SQLite数据库中。我还有一个持续运行的服务(START_STICKY),每30分钟通过查看SQLite DB检查一次来自用户的新更新。如果添加了新记录,则将使用AsyncTask将其发送到我的服务器以上载数据。为了跟踪已经上传的记录,我在SharedReferences上存储了一个int值。因此,这从0值开始,在每次上传中,我都会得到SQLite DB上的最后一个索引,并将其保存在SharedReferences上。如果启动应用程序后,我向服务器发送了10条记录,我将在SharedReferences上保存“10”,并在下一次更新(30分钟后)中选择索引大于10的所有记录 一切正常,但有时Android会终止我的服务,可能是为了内存优化,然后服务重新启动(START_STICKY),应用程序继续工作。只有在这种情况下,有时我会丢失SharedReferences上上次保存的值,并且由于我使用此值作为参考来选择新记录并将其上载到我的服务器,因此我的应用程序在发生此情况时会发送重复信息。。。 我将SharedReferences上的int值保存方式从“apply()”方法更改为“commit()”,因为最后一个方法将信息直接保存在文件中,但问题没有解决 任何关于如何处理这个问题或其他方法的想法都将受到欢迎 我的SharedReferences类如下所示:Java SharedReferences问题-丢失上次保存的值,java,android,sqlite,sharedpreferences,Java,Android,Sqlite,Sharedpreferences,我面临一个奇怪的问题,我的应用程序从用户输入中收集一些数据,并将其保存在SQLite数据库中。我还有一个持续运行的服务(START_STICKY),每30分钟通过查看SQLite DB检查一次来自用户的新更新。如果添加了新记录,则将使用AsyncTask将其发送到我的服务器以上载数据。为了跟踪已经上传的记录,我在SharedReferences上存储了一个int值。因此,这从0值开始,在每次上传中,我都会得到SQLite DB上的最后一个索引,并将其保存在SharedReferences上。如果
public class MySharedPreferences {
private SharedPreferences sharedPref;
public MySharedPreferences(Context context) {
sharedPref = context.getSharedPreferences("com.mypackage", Context.MODE_PRIVATE);
}
public void setIndex(int n) {
//sharedPref.edit().putInt("index", n).apply();
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("index", n);
editor.commit();
}
public int getIndex() {
return sharedPref.getInt("index", 0);
}
}
My SharedReferences对象是在Service onCreate方法上指定的:
MySharedPreferences mySharedPref = new MySharedPreferences(context);
这是在我的服务中运行的AsyncTask的一个示例:
private class UpdateData extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... strings) {
try {
String response = utils.postDataHttps("https://my_url.com", params);
if (response.equals("OK")) {
// Access SQLite DB and select last index
// by using this query: SELECT id FROM my_table ORDER BY id DESC LIMIT 1;
int lastIndex = myDb.getLastIndex();
// Set last index on SharedPreferences:
mySharedPref.setIndex(lastIndex);
}
} catch (Exception e) {
Log.e(LOG_TAG, "UpdateData.doInBackground() - Exception: " + e.getMessage() + "\n" + Log.getStackTraceString(e));
}
return null;
}
}
私有类UpdateData扩展异步任务{
@凌驾
受保护的Void doInBackground(字符串…字符串){
试一试{
字符串响应=utils.postDataHttps(“https://my_url.com“,参数);
如果(响应等于(“确定”)){
//访问SQLite数据库并选择最后一个索引
//使用此查询:按id DESC LIMIT 1从我的表格ORDER中选择id;
int lastIndex=myDb.getLastIndex();
//在SharedReferences上设置最后一个索引:
mySharedPref.setIndex(lastIndex);
}
}捕获(例外e){
Log.e(Log_标记,“UpdateData.doInBackground()-异常:“+e.getMessage()+”\n“+Log.getStackTraceString(e));
}
返回null;
}
}
提前谢谢 您确定在ondestroy之后没有清理SharedReference数据吗 已更新
尝试使用应用程序的上下文而不是活动的上下文。在
应用程序
或多索引应用程序
类中保存共享参考
。似乎在重新创建您的服务时,
正在重置“SharedReference,但我不能100%确定这是否是问题所在。
但是,如果如上所述保留值,则该值不会无意中设置为0。由于
Application或
multi-dexapplication`类在你的android应用程序安装在应用程序中时保持活动状态。在对应用程序进行新的研究后,我发现了这篇文章:由于其他选项对我不起作用,通过创建一个表,其中只包含一条表示需要存储的int值的记录,我将引用变量移动到了SQLite数据库中。所以,在我的应用程序的第一次运行中,如果表中没有记录,我只返回0,在将数据发送到服务器后,我使用INSERT语句将最后一个索引存储在表的第一行中。每30分钟,我只需检查此行中存储的值,以确定需要向服务器发送哪些更新,在成功上传数据后,我使用UPDATE语句再次存储int变量引用上的最后一个索引
也许这不是最聪明的解决方案,但它的工作就像一个魅力 我肯定我没有清理这些值。我只是失去了应用程序重启后的最后一次更新,以前更新的值仍然存在,值永远不会为零。不过还是要谢谢你!您丢失了哪一个最新更新?从数据库或sp?我丢失了上次保存在SharedReferences上的更新。在每次更新服务器时,我首先检查我的SharedReferences值以查看我保存的最后一个索引是什么,因为它表示我发送到服务器的SQLite DB中的最后一条记录。假设我在SharedReferences上保存的最后一个索引是10,然后用户输入3条新记录,然后在服务器的下一次更新中,我将选择索引>10的所有记录,并将新索引13保存在SharedReferences上。所以,下一次更新服务器时,我将检查大于13的新记录。。。问题是:如果在SharedReferences上保存13后重新启动服务,则该值将丢失并返回到10,然后我将再次将记录11、12和13(重复)发送到服务器。。。对不起,如果我不清楚,英语不是我的第一语言@又是diegoveloperThanks!我从我的应用程序生成的日志中跟踪这个问题,大多数情况下,当数据丢失时,只有我的服务在后台运行,因为在一些用户输入后,我通过调用“finish()”来销毁活动。使用应用程序上下文和服务上下文有什么区别,因为我使用第二个上下文来实例化我的SharedReferences对象?再次非常感谢您!谢谢你的意见,但我很抱歉这不是更好的解决方案。我的SharedReference值没有重置为0,以前保存的值仍然存在,只是在我的服务重新启动时丢失了最后一次更新。