【问题标题】:How to Run AsyncTask at a certain time from a Activity?如何在某个时间从 Activity 运行 AsyncTask?
【发布时间】:2011-10-04 14:49:53
【问题描述】:

我在一个我只想每周运行一次的活动中有一个 AsyncTask。我该怎么做呢?

我正在检索其中大约 7 个 URL 的列表,然后将它们放入 SharedPreference。

我只想从我的活动中每周更新和检查一次新 URL。这将在我的主要活动中。

【问题讨论】:

    标签: android asynchronous android-asynctask


    【解决方案1】:

    您可以在共享首选项中保存使用异步任务时的日期。 因此,每当主活动开始时,您都可以检查当前日期和共享首选项中的日期,如果超过 7 天,您可以再次执行异步任务并将保存的日期更新为当前日期。

    我相信您已经知道如何将字符串放入共享首选项并访问它们。

    这只是要做什么的基本代码。您需要对其进行一些修改以使其适合您。

    private static String getToday(){
        Calendar objCalendar = new GregorianCalendar(Calendar.getInstance().getTimeZone());
        DateFormat objFormatter = new SimpleDateFormat("dd-MM-yyyy");
        return objFormatter.format(objCalendar.getTime());
    }
    
    private static String getAfter7DaysDate(){
        Calendar objCalendar = new GregorianCalendar(Calendar.getInstance().getTimeZone());
        DateFormat objFormatter = new SimpleDateFormat("dd-MM-yyyy");
        objCalendar.add(Calendar.DATE, 7);
        return objFormatter.format(objCalendar.getTime());
    }
    
    public int daysBetween(Date d1, Date d2){
         return (int)( (d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24));
    }
    

    如果你把它放在 onCreate 中

        String today = getToday();
        String afterSevenDate = getAfter7DaysDate();
    
        DateFormat objFormatter = new SimpleDateFormat("dd-MM-yyyy");
        try {
            Log.e(today,Integer.toString(daysBetween(objFormatter.parse(today),
                    objFormatter.parse(afterSevenDate))));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    

    上面的代码只检索当前日期,7天后的日期,还求出这2个日期之间的天数差。您将需要获取保存的日期并找到 7 天后的日期,并检查当前日期之间的差异是否 >= 到 7。如果为真,请执行异步任务。

    这是最简单的方法。

    正如 JoeLallouz 所说,这只有在用户参加该活动时才有效。但由于 >= 检查,即使他在一个月后打开它也会起作用。但是,如果即使用户没有打开您的应用程序,您也需要这样做,您将需要查看 AlarmManager 类。

    【讨论】:

    • 好主意!您能否提供一个示例,说明我将如何进行此操作?
    • 我已经创建了我的 AsyncTask。我将如何将日期放入 SharedPreference 中。我如何检查它是否已经 7 天,然后在每次打开活动时运行?
    • 这将假定用户每周打开一次主要活动,否则异步任务将永远不会触发。如果您希望它发生,您应该考虑使用 AlarmManager 类和服务。
    • 我以前用过AlarmManager 吗?但是我可以让它把上次更新的日期从偏好中拉出来吗?如果它比今天的当前日期大 7 点,那么更新...这两种方法都行吗?当它更新时,只需将它刚刚更新的当前日期放入共享偏好中。如果用户在 7 天后打开活动,您是否也可以在您的代码中发布如何测试它是否从它从偏好中拉出的当前日期起 7 天通过?
    • 我可以将 asynctask 的最后一次更新之间的天数放在一个共享首选项中,并且每次检查当前天数是否小于等于或大于..如果大于或等于运行 asynctask
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多