1

当用户进入特定区域时,我正在使用 Android 上的感知 API 来接收广播。当我第一次开发此功能时,我有大约 500 个位置,并且运行良好。但是,我现在有 3000 多个位置,当我取消注册并更新栅栏时,更新需要很长时间(大约 5 分钟),或者有时会卡住并且什么也不做。

我像这样创建意识围栏

for (...) {
    ...
    AwarenessFence singleFence = LocationFence.entering(latitude, longitude, radius);

    individualFences.add(singleFence);
}

AwarenessFence allLocationsFence = AwarenessFence.or(individualFences);

其中 individualFences 是一个包含 3000 多个栅栏的列表。然后,我通过运行取消注册并再次注册围栏

private void unregisterFence(final String fenceKey) {

    Awareness.FenceApi.updateFences(
            googleApiClient,
            new FenceUpdateRequest.Builder()
                    .removeFence(fenceKey)
                    .build()).setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            registerFence(individualFences)
        }
    });
}

private void registerFence(AwarenessFence individualFences) {
    Awareness.FenceApi.updateFences(
            googleApiClient,
            new FenceUpdateRequest.Builder()
                    .addFence(LOCATION_FENCE_KEY, individualFences, fencePendingIntent)
                    .build()
    ).setResultCallback(new LocationFenceRegistrationResultCallback());
}

我在意图服务上构建并连接到谷歌 API 客户端。我在我的应用程序的主要活动上构建了一个不同的谷歌 API 客户端。

我进行以下测试。我第一次让栅栏注册,然后我在一分钟后再次尝试,然后在一分钟后再次尝试。

  • 有 100 个位置,每次更新大约需要 1 秒
  • 对于 1000 个或更多位置,第一次注册需要一秒钟,第二次大约需要 5 分钟,第三次需要更长的时间。但是如果我重新启动手机,更新只需要一秒钟。
  • 有 1000 个位置,如果我等待大约 10 分钟,第二次注册只需一秒钟。

当我尝试重复更新栅栏(间隔很短)时,如何始终保持较短的更新时间?当然,我不希望在发布版本上经常更新栅栏,但出于测试目的,它会非常有用。

注册如此大量的围栏会对电池寿命或设备性能产生严重影响吗?

4

1 回答 1

0

在我看来,您同时在地理上分布在大范围内的位置周围创建围栏(因为您提到了 3000 个位置)。可以想象,所花费的时间与添加到请求中的栅栏数量有一定的相关性。也许您可以以分层方式划分位置,并在收到围栏回调后管理注册/取消注册的围栏。

例如,要注册多个城市的各个街区周围的围栏,可能只注册当前城市对应的围栏以及包含整个城市的另一个围栏,如果设备退出城市,则取消注册旧城区的围栏并注册新城里的?

希望这个小玩具示例有助于传达我的想法,即管理您从大量围栏列表中请求注册的围栏。

于 2017-01-28T06:14:01.983 回答