【问题标题】:Update Only Once Per Day每天只更新一次
【发布时间】:2018-10-31 19:58:16
【问题描述】:

我的 Android 应用程序中有一些东西需要每天更新一次。

我认为这很简单,但我不知道我需要用什么格式来格式化日期和时间(如果需要时间)以及如何检查今天是否完成了更新(今天是凌晨 00:01 之间)和用户当地时间下午 23:59)。如果今天已经完成,则不应进行更新。

我知道该怎么做:

  • 在 SharedPreferences 中保存上次更新日期(但我如何获得 它的字符串,我不知道)
  • 从 SharedPreferences 获取内容(但我 不知道如何比较字符串格式的日期)

【问题讨论】:

    标签: android date


    【解决方案1】:

    这与您选择的格式无关。这只是重新计算的问题。

    我建议使用自纪元以来的毫秒数,因为所有系统调用都使用它,因此您使用它会更容易。

    由于 1000 毫秒是 1 秒,因此很容易计算出 1000*60*60*24 等于一天(24 小时)。因此,如果storedMillis 大于NOW - 1000*60*60*24,(而NOWSystem.currentTimeMillis()),那么现在进行检查还为时过早。如果storedMillis 更小,则保存您的NOW 时间戳并进行检查:

    long now = System.currentTimeMillis();
    long diffMillis = now - lastCheckedMillis;
    if( diffMillis >= (3600000  * 24) ) {
      // store now (i.e. in shared prefs)
    
      // do the check
    } else {
       // too early
    }
    

    编辑

    我有兴趣在首次打开应用程序时执行此操作 当天,即使上次更新是在 10 分钟前完成的。

    这只是如何获得合适的毫来比较的问题。将上述代码中的long now = System.currentTimeMillis(); 替换为以下代码块:

    Calendar cal = Calendar.getInstance();
    cal.clear(Calendar.HOUR);
    cal.clear(Calendar.HOUR_OF_DAY);
    cal.clear(Calendar.MINUTE);
    cal.clear(Calendar.SECOND);
    cal.clear(Calendar.MILLISECOND);
    
    long now = cal.getTimeInMillis();
    

    这应该可以解决问题。

    【讨论】:

    • 虽然这是一个很好的答案,但我认为你的问题是错误的。如果上次更新时间超过 24 小时,我对更新不感兴趣。我有兴趣在当天首次打开应用程序时执行此操作,即使最后一次更新是在 10 分钟前完成的。想象一下:最后一次更新是在 1 月 4 日 23:55 完成的。我在 1 月 5 日 00:05 再次打开应用程序。使用您的代码,更新将不会在应该运行时运行。我将不得不再等 23 多个小时,然后重新打开应用程序才能激活更新,导致一天没有更新。
    【解决方案2】:

    如果您以 20121122 (YYYYmmdd) 格式存储日期,则可以比较 20121122 > 20121123。但在比较时必须将其存储为 int 或强制转换为 int。

    【讨论】:

    • 您的回答回答了问题。如果其他人也没有提出代码示例,我肯定会选择你。
    • 我仍然认为我的答案是最简单的,但归根结底是你的选择。
    【解决方案3】:

    存储上次执行的时间戳 (System.currentTimeMillis() ) 并将其与当前执行的时间戳进行比较。如果时差超过 24 小时......你知道吗?

    【讨论】:

    • 查看我对@WebnetMobile.com 答案的评论。这种方法不适合,因为如果应用程序在前一天 23:59 左右更新,我可能会有几天没有更新。
    【解决方案4】:

    使用每 24 小时执行一次的 AlarmManager 设置警报,然后执行操作

    检查这个问题:Alarm Manager Example

    这是一种比其他方法更复杂的方法,但可以确保事情已经完成,而对于其他选项,必须执行应用程序以检查它是否需要更新任何内容。

    【讨论】:

    • 我已经评论了@WebnetMobile.com 关于为什么这种方法不适合我的情况的回答。 Link to comment.
    • 然后接受他的回答并搜索 Preferences 示例,工作在这个线程中完成:)
    【解决方案5】:

    方法如下

    public boolean runOnceADay() {
        SharedPreferences shp= c.getSharedPreferences(Constants.GENERAL_SHP, MODE_PRIVATE);
        SharedPreferences.Editor editor= shp.edit();
        long lastCheckedMillis = shp.getLong(Constants.ONCE_A_DAY, 0); // "KEY" you may change yhe value
        long now = System.currentTimeMillis();
        long diffMillis = now - lastCheckedMillis;
        if (diffMillis >= (3600000 * 24)) { // set up your time circulation
             editor.putLong(Constants.ONCE_A_DAY, now);
            editor.commit();
            Util.showMessage(c, "Once a Day Test");
            return false;
         } else {
            Util.showMessage(c, "Too Early");
            return true;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2022-06-24
      相关资源
      最近更新 更多