【发布时间】:2017-06-23 18:01:05
【问题描述】:
我遇到了一个奇怪的问题,我的应用程序从用户输入中收集了一些数据并将其保存在 SQLite 数据库中。我还有一个持续运行的服务(START_STICKY),它每 30 分钟通过查看 SQLite DB 来检查用户的新更新。如果添加了新记录,则会使用 AsyncTask 将其发送到我的服务器以上传数据。为了跟踪已上传的记录,我在 SharedPreferences 中存储了一个 int 值。因此,这从 0 值开始,在每次上传时,我都会在我的 SQLite DB 上获得最后一个索引,并将其保存在我的 SharedPreferences 中。如果启动应用程序后我向服务器发送了 10 条记录,我将在 SharedPreferences 上保存“10”,并在下一次更新(30 分钟后)中选择索引大于 10 的所有记录。
一切正常,但有时 Android 会终止我的服务,可能是为了优化内存,然后服务重新启动 (START_STICKY) 并且应用程序继续工作。只有在这种情况下,有时我会丢失 SharedPreferences 上最后保存的值,并且由于我使用此值作为参考来选择新记录并将其上传到我的服务器,因此我的应用程序在发生这种情况时会发送重复信息...... 我将在 SharedPreferences 上保存 int 值的方式从“apply()”方法更改为“commit()”,因为最后一个方法将信息直接保存在文件中,但问题没有解决。
欢迎任何关于如何处理此问题或其他方法的想法。
我的 SharedPreferences 类如下所示:
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);
}
}
我的 SharedPreferences 对象在 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;
}
}
提前致谢!
【问题讨论】:
标签: java android sqlite sharedpreferences