如何使用requestSync延迟syncAdapter的执行

时间:2014-09-26 08:37:00

标签: android google-cloud-messaging android-syncadapter

Google建议在收到GCM推送通知时推迟执行syncAdapter:

  

注意:如果您使用GCM通过广播来触发同步适配器   安装应用程序的所有设备,请记住他们收到的   你的消息大致在同一时间。这种情况可能会导致   同步适配器的多个实例同时运行,   导致服务器和网络过载。为了避免这种情况   广播到所有设备,你应该考虑推迟开始   同步适配器,用于每个设备唯一的时间段。 (source

但是,我找不到使用延迟参数(API)发出SyncRequest的方法。我能想到的另一个(非常hacky)替代方案是启动服务(必须保持唤醒锁定,因为它是推送通知的广播接收器),它会休息几秒钟,发出SyncRequest,并释放唤醒锁定。有更好的想法吗?

1 个答案:

答案 0 :(得分:2)

您可以简单地使用处理程序。

static final long c_delayMax = 120 * 1000;
static Random r = new Random();

public static void delayedNotification(Bundle data) {
    Handler h = new Handler();
    long delay = r.nextLong() % c_delayMax;
    h.postDelayed(new Runnable() {
        @Override
        public void run() { makeSyncRequest(data); }
    }, delay);
}