Разница между сегодняшней датой и старше Дата не рассчитана правильно - PullRequest
0 голосов
/ 08 марта 2020

Я знаю, что об этом уже спрашивали, но не могу найти точную проблему.

Когда пользователь нажимает кнопку, чтобы добавить маркер на карту, я сохраняю истинное логическое значение 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. Пользователь нажимает кнопку
  2. Пользователь перенаправлен на действие карты
  3. 1-й маркер добавлен.
  4. Пользователь ждет 30 секунд и снова нажимает кнопку
  5. Разница во времени> = 20 секунд
  6. 2-й маркер добавлен.

Фактический результат:

  1. Пользователь нажимает кнопку

  2. Пользователь перенаправлен на активность карты

  3. 1-й маркер добавлен.

  4. Пользователь ждет 30 секунд и снова нажимает кнопку

  5. Разница во времени составляет всего 81 (или 70, 44 , 126 et c.) Миллисекунды.

  6. Пользователь снова нажимает кнопку через несколько секунд

  7. Разница во времени верна, и если> = 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. Любые идеи высоко ценятся?

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

НАКОНЕЦ ПОЛУЧИЛ ЭТО !!!!!

Мне нужно иметь «старое значение даты» и «новое значение даты», в дополнение к непосредственному значению даты, с которым я сравниваю. Всякий раз, когда время обновляется, я перемещаю новый в старый слот, так что я всегда могу обратиться к предыдущему.

Кроме того, мое старое значение вызывалось при нажатии положительной кнопки, которая находится на начало технологического процесса. Поэтому, когда мой таймер истек, значение для следующего щелчка уже достигнуто, вместо того, чтобы начинаться с нуля снова.

В основном ниже вызывается в начале потока процесса, а не в конце.

sharedPreferences.edit().putLong("addedTagDate", millis).commit();

Я понял это, когда поместил следующую строку в самый конец потока процесса, чтобы сделать мой журнал более понятным. Я понял, что моя переменная таймера была установлена ​​в строке после последней конечной точки, а не сразу до следующей.

Log.i(TAG, "*********************************Marker Created******************************");

Наконец!

0 голосов
/ 08 марта 2020

В checkTimerForNewTag у вас есть:

sharedPreferences.edit().putInt("addedTagCount", 0).commit();

Вы проверяете это в вашем первом методе:

int i = sharedPreferences.getInt("addedTagCount", 0);
    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);
    }

Разве я не всегда буду <1, если вы установите его в 0 в checkTimerForNewTag </p>

...