【问题标题】:Force execution of GCMNetworkManager OneoffTask in Android在 Android 中强制执行 GCMNetworkManager OneoffTask
【发布时间】:2015-09-23 03:39:45
【问题描述】:

我正在使用 GcmNetworkManager 来安排 OneoffTask,其执行窗口从 0 开始。在 documentations 中提到

请注意,您可以请求在未来任何时候执行一次性任务,但为防止滥用,调度程序只会在未来至少 30 秒设置警报。如果发生某些网络事件来唤醒调度程序,您的任务仍然可以在此之前运行。

这对我来说是有问题的,因为我必须等待 30 秒才能执行任务,而我希望它在可能的情况下立即执行。有什么方法可以实现吗?

【问题讨论】:

    标签: android google-cloud-messaging


    【解决方案1】:

    有一种方法可以实现强制立即执行任何任务。

    虽然下面的方法乍一看似乎是糟糕的代码,但在使用 GcmNetworkManager 编写后台数据同步代码后,大多数开发人员希望在应用程序处于前台时重用同一段代码。为什么任何应用都应该有一个 GcmTskService 和一个 AsyncTask/IntentService,都调用同一个数据同步 API 端点?

    我遇到了同样的问题,使用下面的代码sn-p-实现了一次性任务的立即执行

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null && MY_ACTION.equals(intent.getAction())) {
            Log.v(LOG_TAG, "onStartCommand - called by our code);
            if (network-is-connected)) {
                // do below calls in run method of a thread
                    TaskParams taskParams = new TaskParams(TASK_TAG);
                    int result = onRunTask(taskParams);
                    if (result == GcmNetworkManager.RESULT_RESCHEDULE) {
                    // schedule task
                    }
                    stopSelf();
                // thread's run end
            } else {
                // schedule task
                stopSelf();
            }
            return START_NOT_STICKY;
        } else {
            Log.v(LOG_TAG, "onStartCommand - called by GCM Nw Mngr");
            // call super so that GCM's code may run as it was intended
            return super.onStartCommand(intent, flags, startId);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您的意思是您希望能够强制执行以调试您的 OneoffTask?

      目前您无法触发之前计划的任务。但是,您可以运行一个 adb shell 命令来触发具有特定标记的特殊一次性调试任务。 documentation on GcmNetworkManager 有详细信息。

      或者您的意思是您希望 OneoffTask 能够立即运行?

      不幸的是,如果没有一些事件除了警报来唤醒网络管理员,这是不可能的。 GNM 当前的工作方式是将客户端调用 schedule(Task) 视为唤醒(或任何其他 API 调用)。

      如果您安排了您的任务,然后在第二次“安排”调用后不久安排了另一个任务,则可能会使 GNM 运行第一次。这是未记录的,不是 API 的一部分,并且可能会更改,因此我不建议使用它来执行除调试以外的任何操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-13
        • 2011-08-09
        • 2021-05-05
        • 2010-09-10
        相关资源
        最近更新 更多