SharedPreferences 在使用前不断被删除
SharedPreferences keep being deleted before use
这是一个傻瓜。我将 int 值存储在我的共享首选项中,本质上是缓存它们,以便我可以在下次启动时将它们放入数据库中。我有一种方法可以在启动时将它们保存到数据库中。
这之后是一个从共享首选项中删除值以重置它们的方法。
但在我将它们存储到数据库之前,它们似乎一直在删除。就像 deleteMetrics();
是 运行 之前 setMetrics();
不管我做什么。
- 我试过将共享首选项值的删除放在自己的位置
启动方法Activity.
- 我试过删除
启动时 setMetrics 方法中的共享 pref 值
Activity.
- 我试过删除共享偏好值
在启动的 onCreate 的不同位置 activity.
- 我试过将共享首选项值的删除放在
Metrics
class内外startupUpdateMetrics()
方法。
- 我试过将共享偏好值的删除放在
runOnUiThread
以防我有漏线(见下文)。
- 我已经在
settMetrics();
和 deleteMetrics();
之间的 onCreate 中尝试 Thread.sleep(5000) 以启动 activity
没有任何效果。在 setMetrics();
方法将它们存储到 DB 之前删除这些值。
如果我注释掉 deleteMetrics();
数据库值存储良好,但它们呈指数级增长,因为 sharedPrefs 不会为每次应用程序使用重置。
启动 activity onCreate:
Activity_Splash.this.runOnUiThread(new Runnable() {
@Override
public void run() {
setMetrics();
deleteMetrics();
}
});
setMetrics();和 deleteMetrics();
private void setMetrics() {
SharedPreferences sharedPreferences = Activity_Splash.this.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
//Check if device has a network connection
boolean connectionExists = new NetworkConnection().haveNetworkConnection(passedActivity, TAG);
//If device has a network connection continue
if (connectionExists) {
Log.i(" => ", "Test1");
try {
String userId = mAuth.getCurrentUser().getUid();
int teamCreated2 = sharedPreferences.getInt("teamCreatedForMetrics", 0);
Log.i(" => ", "Test2 " + teamCreated2);
callMetrics.startupUpdateMetrics(userId, context);
} catch (Exception e) {
Log.e(TAG + "onCreate", "Error setting metrics");
}
}
}
private void deleteMetrics() {
SharedPreferences sharedPreferences = Activity_Splash.this.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
try {
sharedPreferences.edit().remove("acceptedForMetrics").commit();
sharedPreferences.edit().remove("rejectedForMetrics").commit();
sharedPreferences.edit().remove("requestedForMetrics").commit();
sharedPreferences.edit().remove("sm2AppointedForMetrics").commit();
sharedPreferences.edit().remove("teamCreatedForMetrics").commit();
sharedPreferences.edit().remove("teamDeletedForMetrics").commit();
sharedPreferences.edit().remove("noOfPlayersForMetrics").commit();
sharedPreferences.edit().remove("teamsMemberLeaveForMetrics").commit();
} catch (Exception e) {
Log.e(TAG + "onCreate", "Error setting metrics");
}
}
callMetrics 被 setMetrics 方法调用:
public void startupUpdateMetrics(String userId, Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
db.collection("userteammetrics").document(userId).collection("teammetrics").document("generalteammetrics").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
int teamCreated4 = sharedPreferences.getInt("teamCreatedForMetrics",0);
Log.i(" => ", "Test4 " + teamCreated4);
DocumentSnapshot document = task.getResult();
if (document.exists()) {
int teamCreated5 = sharedPreferences.getInt("teamCreatedForMetrics",0);
Log.i(" => ", "Test5 " + teamCreated5);
int oldAccepted = Integer.parseInt(document.get("accepted").toString());
int oldRejected = Integer.parseInt(document.get("rejected").toString());
int oldRequested = Integer.parseInt(document.get("requested").toString());
int oldsm2Appointed = Integer.parseInt(document.get("scrummaster2sappointed").toString());
int oldTeamsCreated = Integer.parseInt(document.get("teamscreated").toString());
int oldTeamsDeleted = Integer.parseInt(document.get("teamsdeleted").toString());
int oldTeamsMemberLeave = Integer.parseInt(document.get("memberLeave").toString());
int addAccepted = sharedPreferences.getInt("acceptedForMetrics",0);
int addRejected = sharedPreferences.getInt("rejectedForMetrics",0);
int addRequested = sharedPreferences.getInt("requestedForMetrics",0);
int addsm2Appointed = sharedPreferences.getInt("sm2AppointedForMetrics",0);
int addTeamsCreated = sharedPreferences.getInt("teamCreatedForMetrics",0);
int addTeamsDeleted = sharedPreferences.getInt("teamDeletedForMetrics",0);
int playersPerGame = sharedPreferences.getInt("noOfPlayersForMetrics",0);
int addTeamsMemberLeave = sharedPreferences.getInt("teamsMemberLeaveForMetrics",0);
Log.i("Test6 ", "startupUpdateMetrics: " + addAccepted + " " + addRejected + " " + addRequested + " " + addsm2Appointed + " " + addTeamsCreated + " " + addTeamsDeleted + " " + playersPerGame + " " + addTeamsMemberLeave);
int newAccepted = oldAccepted + addAccepted;
int newRejected = oldRejected + addRejected;
int newRequested = oldRequested + addRequested;
int newsm2Appointed = oldsm2Appointed + addsm2Appointed;
int newTeamsCreated = oldTeamsCreated + addTeamsCreated;
int newTeamsDeleted = oldTeamsDeleted + addTeamsDeleted;
int newTeamsMemberLeave = oldTeamsMemberLeave + addTeamsMemberLeave;
Log.i("Test7 ", "startupUpdateMetrics: " + newAccepted + " " + newRejected + " " + newRequested + " " + newsm2Appointed + " " + newTeamsCreated + " " + newTeamsDeleted + " " + newTeamsMemberLeave);
db.collection("userteammetrics").document(userId).collection("teammetrics").document("generalteammetrics").update("accepted", newAccepted, "rejected", newRejected, "requested", newRequested, "scrummaster2sappointed", newsm2Appointed, "teamscreated", newTeamsCreated, "teamsdeleted", newTeamsDeleted, "memberLeave", newTeamsMemberLeave, "numberofplayerspergame" ,FieldValue.arrayUnion(playersPerGame));
}
}
}
});
}
LogCat(我不知道为什么都出现了两次...因此我认为可能是漏线):
2020-02-01 23:19:28.954 21586-21586/? I/Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("xxxxxxxxxxxxx") to get test ads on this device.
2020-02-01 23:19:29.026 21586-21586/? I/Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("xxxxxxxxxxxxx") to get test ads on this device.
2020-02-01 23:19:29.078 21586-21586/? I/ =>: Test1
2020-02-01 23:19:29.078 21586-21586/? I/ =>: Test2 0
2020-02-01 23:19:29.085 21586-21586/? I/ =>: Test1
2020-02-01 23:19:29.085 21586-21586/? I/ =>: Test2 0
2020-02-01 23:19:29.207 21586-21586/? I/Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("xxxxxxxxxxxxx") to get test ads on this device.
2020-02-01 23:19:29.219 21586-21586/? I/Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("xxxxxxxxxxxxx") to get test ads on this device.
2020-02-01 23:19:29.344 21586-21586/? I/ =>: Test4 0
2020-02-01 23:19:29.344 21586-21586/? I/ =>: Test5 0
2020-02-01 23:19:29.345 21586-21586/? I/Test6: startupUpdateMetrics: 0 0 0 0 0 0 0 0
2020-02-01 23:19:29.345 21586-21586/? I/Test7: startupUpdateMetrics: 0 0 0 0 0 0 0
2020-02-01 23:19:29.345 21586-21586/? I/ =>: Test4 0
2020-02-01 23:19:29.346 21586-21586/? I/ =>: Test5 0
2020-02-01 23:19:29.346 21586-21586/? I/Test6: startupUpdateMetrics: 0 0 0 0 0 0 0 0
2020-02-01 23:19:29.346 21586-21586/? I/Test7: startupUpdateMetrics: 0 0 0 0 0 0 0
2020-02-01 23:21:04.323 21908-21927/? I/PrimesTesting: GserviceFlagsSupplier.get()
2020-02-01 23:22:40.049 22041-22041/? D/OmtpVvmCarrierCfgHlpr: overrideConfigForTest is null
我对此一头雾水,如有任何建议,我们将不胜感激。
事情是这样的:
setMetrics()
首先被调用
setMetrics()
调用 startupUpdateMetrics()
startupUpdateMetrics()
通过回调调用 db.collection...
(addOnCompleteListener
调用中的参数)
deleteMetrics()
被称为
回调是异步完成的。
因此您启动了一个异步任务,然后在该任务启动(但尚未完成)后立即删除所有数据。
您需要等待回调发生,然后您才能删除您的数据。
将 deleteMetrics()
作为最后一行放在 if (document.exists())
括号内。
您可以尝试设置一个计时器来持续检查 setMetrics()
是否已完成其所有代码的执行,以便 deleteMetrics()
方法在之后启动。
private static boolean done = false;
Activity_Splash.this.runOnUiThread(new Runnable() {
@Override
public void run() {
setMetrics();
final Timer t=new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
if(done){
deleteMetrics();
t.cancel();
t.purge();
}
}
}, 1000);
}
});
将done
的布尔值赋给setMetrics()
末尾的true
。
private void setMetrics() {
SharedPreferences sharedPreferences = Activity_Splash.this.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
//Check if device has a network connection
boolean connectionExists = new NetworkConnection().haveNetworkConnection(passedActivity, TAG);
//If device has a network connection continue
if (connectionExists) {
Log.i(" => ", "Test1");
try {
String userId = mAuth.getCurrentUser().getUid();
int teamCreated2 = sharedPreferences.getInt("teamCreatedForMetrics", 0);
Log.i(" => ", "Test2 " + teamCreated2);
callMetrics.startupUpdateMetrics(userId, context);
done=true;
} catch (Exception e) {
Log.e(TAG + "onCreate", "Error setting metrics");
}
}
}
这是一个傻瓜。我将 int 值存储在我的共享首选项中,本质上是缓存它们,以便我可以在下次启动时将它们放入数据库中。我有一种方法可以在启动时将它们保存到数据库中。
这之后是一个从共享首选项中删除值以重置它们的方法。
但在我将它们存储到数据库之前,它们似乎一直在删除。就像 deleteMetrics();
是 运行 之前 setMetrics();
不管我做什么。
- 我试过将共享首选项值的删除放在自己的位置 启动方法Activity.
- 我试过删除 启动时 setMetrics 方法中的共享 pref 值 Activity.
- 我试过删除共享偏好值 在启动的 onCreate 的不同位置 activity.
- 我试过将共享首选项值的删除放在
Metrics
class内外startupUpdateMetrics()
方法。 - 我试过将共享偏好值的删除放在
runOnUiThread
以防我有漏线(见下文)。 - 我已经在
settMetrics();
和deleteMetrics();
之间的 onCreate 中尝试 Thread.sleep(5000) 以启动 activity
没有任何效果。在 setMetrics();
方法将它们存储到 DB 之前删除这些值。
如果我注释掉 deleteMetrics();
数据库值存储良好,但它们呈指数级增长,因为 sharedPrefs 不会为每次应用程序使用重置。
启动 activity onCreate:
Activity_Splash.this.runOnUiThread(new Runnable() {
@Override
public void run() {
setMetrics();
deleteMetrics();
}
});
setMetrics();和 deleteMetrics();
private void setMetrics() {
SharedPreferences sharedPreferences = Activity_Splash.this.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
//Check if device has a network connection
boolean connectionExists = new NetworkConnection().haveNetworkConnection(passedActivity, TAG);
//If device has a network connection continue
if (connectionExists) {
Log.i(" => ", "Test1");
try {
String userId = mAuth.getCurrentUser().getUid();
int teamCreated2 = sharedPreferences.getInt("teamCreatedForMetrics", 0);
Log.i(" => ", "Test2 " + teamCreated2);
callMetrics.startupUpdateMetrics(userId, context);
} catch (Exception e) {
Log.e(TAG + "onCreate", "Error setting metrics");
}
}
}
private void deleteMetrics() {
SharedPreferences sharedPreferences = Activity_Splash.this.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
try {
sharedPreferences.edit().remove("acceptedForMetrics").commit();
sharedPreferences.edit().remove("rejectedForMetrics").commit();
sharedPreferences.edit().remove("requestedForMetrics").commit();
sharedPreferences.edit().remove("sm2AppointedForMetrics").commit();
sharedPreferences.edit().remove("teamCreatedForMetrics").commit();
sharedPreferences.edit().remove("teamDeletedForMetrics").commit();
sharedPreferences.edit().remove("noOfPlayersForMetrics").commit();
sharedPreferences.edit().remove("teamsMemberLeaveForMetrics").commit();
} catch (Exception e) {
Log.e(TAG + "onCreate", "Error setting metrics");
}
}
callMetrics 被 setMetrics 方法调用:
public void startupUpdateMetrics(String userId, Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
db.collection("userteammetrics").document(userId).collection("teammetrics").document("generalteammetrics").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
int teamCreated4 = sharedPreferences.getInt("teamCreatedForMetrics",0);
Log.i(" => ", "Test4 " + teamCreated4);
DocumentSnapshot document = task.getResult();
if (document.exists()) {
int teamCreated5 = sharedPreferences.getInt("teamCreatedForMetrics",0);
Log.i(" => ", "Test5 " + teamCreated5);
int oldAccepted = Integer.parseInt(document.get("accepted").toString());
int oldRejected = Integer.parseInt(document.get("rejected").toString());
int oldRequested = Integer.parseInt(document.get("requested").toString());
int oldsm2Appointed = Integer.parseInt(document.get("scrummaster2sappointed").toString());
int oldTeamsCreated = Integer.parseInt(document.get("teamscreated").toString());
int oldTeamsDeleted = Integer.parseInt(document.get("teamsdeleted").toString());
int oldTeamsMemberLeave = Integer.parseInt(document.get("memberLeave").toString());
int addAccepted = sharedPreferences.getInt("acceptedForMetrics",0);
int addRejected = sharedPreferences.getInt("rejectedForMetrics",0);
int addRequested = sharedPreferences.getInt("requestedForMetrics",0);
int addsm2Appointed = sharedPreferences.getInt("sm2AppointedForMetrics",0);
int addTeamsCreated = sharedPreferences.getInt("teamCreatedForMetrics",0);
int addTeamsDeleted = sharedPreferences.getInt("teamDeletedForMetrics",0);
int playersPerGame = sharedPreferences.getInt("noOfPlayersForMetrics",0);
int addTeamsMemberLeave = sharedPreferences.getInt("teamsMemberLeaveForMetrics",0);
Log.i("Test6 ", "startupUpdateMetrics: " + addAccepted + " " + addRejected + " " + addRequested + " " + addsm2Appointed + " " + addTeamsCreated + " " + addTeamsDeleted + " " + playersPerGame + " " + addTeamsMemberLeave);
int newAccepted = oldAccepted + addAccepted;
int newRejected = oldRejected + addRejected;
int newRequested = oldRequested + addRequested;
int newsm2Appointed = oldsm2Appointed + addsm2Appointed;
int newTeamsCreated = oldTeamsCreated + addTeamsCreated;
int newTeamsDeleted = oldTeamsDeleted + addTeamsDeleted;
int newTeamsMemberLeave = oldTeamsMemberLeave + addTeamsMemberLeave;
Log.i("Test7 ", "startupUpdateMetrics: " + newAccepted + " " + newRejected + " " + newRequested + " " + newsm2Appointed + " " + newTeamsCreated + " " + newTeamsDeleted + " " + newTeamsMemberLeave);
db.collection("userteammetrics").document(userId).collection("teammetrics").document("generalteammetrics").update("accepted", newAccepted, "rejected", newRejected, "requested", newRequested, "scrummaster2sappointed", newsm2Appointed, "teamscreated", newTeamsCreated, "teamsdeleted", newTeamsDeleted, "memberLeave", newTeamsMemberLeave, "numberofplayerspergame" ,FieldValue.arrayUnion(playersPerGame));
}
}
}
});
}
LogCat(我不知道为什么都出现了两次...因此我认为可能是漏线):
2020-02-01 23:19:28.954 21586-21586/? I/Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("xxxxxxxxxxxxx") to get test ads on this device.
2020-02-01 23:19:29.026 21586-21586/? I/Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("xxxxxxxxxxxxx") to get test ads on this device.
2020-02-01 23:19:29.078 21586-21586/? I/ =>: Test1
2020-02-01 23:19:29.078 21586-21586/? I/ =>: Test2 0
2020-02-01 23:19:29.085 21586-21586/? I/ =>: Test1
2020-02-01 23:19:29.085 21586-21586/? I/ =>: Test2 0
2020-02-01 23:19:29.207 21586-21586/? I/Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("xxxxxxxxxxxxx") to get test ads on this device.
2020-02-01 23:19:29.219 21586-21586/? I/Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("xxxxxxxxxxxxx") to get test ads on this device.
2020-02-01 23:19:29.344 21586-21586/? I/ =>: Test4 0
2020-02-01 23:19:29.344 21586-21586/? I/ =>: Test5 0
2020-02-01 23:19:29.345 21586-21586/? I/Test6: startupUpdateMetrics: 0 0 0 0 0 0 0 0
2020-02-01 23:19:29.345 21586-21586/? I/Test7: startupUpdateMetrics: 0 0 0 0 0 0 0
2020-02-01 23:19:29.345 21586-21586/? I/ =>: Test4 0
2020-02-01 23:19:29.346 21586-21586/? I/ =>: Test5 0
2020-02-01 23:19:29.346 21586-21586/? I/Test6: startupUpdateMetrics: 0 0 0 0 0 0 0 0
2020-02-01 23:19:29.346 21586-21586/? I/Test7: startupUpdateMetrics: 0 0 0 0 0 0 0
2020-02-01 23:21:04.323 21908-21927/? I/PrimesTesting: GserviceFlagsSupplier.get()
2020-02-01 23:22:40.049 22041-22041/? D/OmtpVvmCarrierCfgHlpr: overrideConfigForTest is null
我对此一头雾水,如有任何建议,我们将不胜感激。
事情是这样的:
setMetrics()
首先被调用
setMetrics()
调用 startupUpdateMetrics()
startupUpdateMetrics()
通过回调调用 db.collection...
(addOnCompleteListener
调用中的参数)
deleteMetrics()
被称为
回调是异步完成的。
因此您启动了一个异步任务,然后在该任务启动(但尚未完成)后立即删除所有数据。
您需要等待回调发生,然后您才能删除您的数据。
将 deleteMetrics()
作为最后一行放在 if (document.exists())
括号内。
您可以尝试设置一个计时器来持续检查 setMetrics()
是否已完成其所有代码的执行,以便 deleteMetrics()
方法在之后启动。
private static boolean done = false;
Activity_Splash.this.runOnUiThread(new Runnable() {
@Override
public void run() {
setMetrics();
final Timer t=new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
if(done){
deleteMetrics();
t.cancel();
t.purge();
}
}
}, 1000);
}
});
将done
的布尔值赋给setMetrics()
末尾的true
。
private void setMetrics() {
SharedPreferences sharedPreferences = Activity_Splash.this.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
//Check if device has a network connection
boolean connectionExists = new NetworkConnection().haveNetworkConnection(passedActivity, TAG);
//If device has a network connection continue
if (connectionExists) {
Log.i(" => ", "Test1");
try {
String userId = mAuth.getCurrentUser().getUid();
int teamCreated2 = sharedPreferences.getInt("teamCreatedForMetrics", 0);
Log.i(" => ", "Test2 " + teamCreated2);
callMetrics.startupUpdateMetrics(userId, context);
done=true;
} catch (Exception e) {
Log.e(TAG + "onCreate", "Error setting metrics");
}
}
}