Я знаю, что об этом уже спрашивали, но не могу найти точную проблему.
Когда пользователь нажимает кнопку, чтобы добавить маркер на карту, я сохраняю истинное логическое значение tagUserLocation
( сообщить моей активности на карте onCreate, что для местоположения пользователей сохранены широта и долгота, которые необходимо добавить в базу данных перед заполнением карты). Затем пользователь видит действие с переключателями для выбора типа маркера.
Когда они выбирают тип маркера и нажимают положительную кнопку в диалоговом окне «Предупреждение», я сохраняю количество маркеров, добавленных пользователем, и дата самой последней addedTagDate
в моих общих настройках. Это сделано для того, чтобы я мог на время добавить еще один маркер.
Когда моя операция Map начинается в onCreate, он обнаруживает, что tagUserLocation
имеет значение true, и запускает метод для сохранения новых данных маркера в БД перед созданием карты.
Это метод onClick для диалогового окна Alert, которое устанавливает addedTagCount
и addedTagDate
в миллисекундах. Затем ИТ-персонал направляет пользователя обратно к операции «Карта», которая обнаруживает новый маркер и сохраняет его в БД перед повторным созданием карты.
builder.setPositiveButton(yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int i = sharedPreferences.getInt("addedTagCount", 0);
Log.i(TAG, "Testing_" + "posButton 1 " + " " + i);
if(i < 1){
Date todaysDate = new Date();
long millis = todaysDate.getTime();
i++;
sharedPreferences.edit().putInt("addedTagCount", i).commit();
sharedPreferences.edit().putLong("addedTagDate", millis).commit();
Log.i(TAG, "Testing_" + "posButton 2 " + " " + i);
}
Intent intentMapsActivity = new Intent(context, Activity_MapsActivity.class);
context.startActivity(intentMapsActivity);
passedActivity.finish();
dialog.dismiss();
}
});
Когда пользователь пытается добавить другой маркер, я Я проверяю сохраненные значения addedTagDate
против todaysDate
, чтобы узнать, истек ли определенный промежуток времени, прежде чем позволить ему добавить еще один маркер.
public boolean checkTimerForNewTag(Activity passedActivity) {
SharedPreferences sharedPreferences = passedActivity.getSharedPreferences("com.name.myApp", Context.MODE_PRIVATE);
//Check if timer to allow another tag has expired
Date todaysDate = new Date();
Date taggedDate = new Date(sharedPreferences.getLong("addedTagDate", 0));
long taggedDateAsLong = taggedDate.getTime();
Log.i(TAG, "checkTimerForNewTag_" + "taggedDateAsLong: " + taggedDate.getTime());
if (taggedDateAsLong != 0) {
long diffInMillis = todaysDate.getTime() - taggedDate.getTime();
long sec = diffInMillis / 1000;
long min = sec / 60;
long hours = min / 60;
Log.i(TAG, "checkTimerForNewTag_" + "Date Adjust: " + taggedDate.getTime() + " - " + todaysDate.getTime() + " = diffInMills: " + diffInMillis + " and sec: " + sec + " and min: " + min + " and hours: " + hours);
if (sec >= 20) {
Log.i(TAG, "checkTimerForNewTag_" + " hours > 1");
sharedPreferences.edit().putInt("addedTagCount", 0).commit();
sharedPreferences.edit().remove("addedTagDate").commit();
return true;
}
}
return false;
}
Первый маркер добавлен, и addedTagDate
сохраняется. Но когда пользователь нажимает кнопку 2 раза, checkTimerForNewTag()
дает разницу во времени, которая является неправильной. Это слишком мало. Пример действий по воспроизведению:
Ожидаемый результат:
- Пользователь нажимает кнопку
- Пользователь перенаправлен на действие карты
- 1-й маркер добавлен.
- Пользователь ждет 30 секунд и снова нажимает кнопку
- Разница во времени> = 20 секунд
- 2-й маркер добавлен.
Фактический результат:
Пользователь нажимает кнопку
Пользователь перенаправлен на активность карты
1-й маркер добавлен.
Пользователь ждет 30 секунд и снова нажимает кнопку
Разница во времени составляет всего 81 (или 70, 44 , 126 et c.) Миллисекунды.
Пользователь снова нажимает кнопку через несколько секунд
Разница во времени верна, и если> = 20 se c добавлен второй маркер.
Журнал: 1-й щелчок работает нормально, добавляется маркер и addedTagCount
сохраняется в SP.
2020-03-08 17:06:12.327 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_taggedDateAsLong: 1583687115677
2020-03-08 17:06:12.327 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_Date Adjust: 1583687115677 - 1583687172327 = diffInMills: 56650 and sec: 56 and min: 0 and hours: 0
2-й клик не сработал, я вай 30 секунд, но разница составляет всего 81 миллис.
2020-03-08 17:06:16.134 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_taggedDateAsLong: 1583687176053
2020-03-08 17:06:16.134 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_Date Adjust: 1583687176053 - 1583687176134 = diffInMills: 81 and sec: 0 and min: 0 and hours: 0
3-й щелчок работает, я ждал 2 секунды, 7 секунд c и 12 секунд c - все снова работает.
2020-03-08 17:06:18.100 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_taggedDateAsLong: 1583687176053
2020-03-08 17:06:18.101 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_Date Adjust: 1583687176053 - 1583687178100 = diffInMills: 2047 and sec: 2 and min: 0 and hours: 0
2020-03-08 17:06:23.072 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_taggedDateAsLong: 1583687176053
2020-03-08 17:06:23.072 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_Date Adjust: 1583687176053 - 1583687183072 = diffInMills: 7019 and sec: 7 and min: 0 and hours: 0
2020-03-08 17:06:28.248 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_taggedDateAsLong: 1583687176053
2020-03-08 17:06:28.249 17912-17912/com.name.myApp I/UserTagging_: checkTimerForNewTag_Date Adjust: 1583687176053 - 1583687188248 = diffInMills: 12195 and sec: 12 and min: 0 and hours: 0
Я проверил свое приложение, чтобы убедиться, что я не делаю ничего плохого с общим значением pref. Я убежден, что это должна быть проблема округления или что-то подобное с функцией Date. Любые идеи высоко ценятся?