Обновление локации заборов в Android занимает слишком много времени с большим количеством заборов

Я использую API осведомленности на Android для получения трансляции, когда пользователь входит в определенную область. Когда я впервые разработал эту функцию, у меня было около 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());
}

Я строю и подключаюсь к клиенту Google API через службу намерений. Я строю другой клиент API Google на основной деятельности в моем приложении.

Я делаю следующий тест. Я позволяю забору регистрироваться в первый раз, затем я пытаюсь снова через одну минуту, затем снова через одну минуту.

  • При 100 местоположениях обновление занимает около 1 секунды каждый раз
  • При наличии 1000 и более местоположений первая регистрация занимает одну секунду, вторая - около 5 минут, а третья - намного дольше. Но если я перезагружаю телефон, обновление снова занимает всего одну секунду.
  • При 1000 локациях вторая регистрация занимает всего одну секунду, если я жду около 10 минут.

Как я могу всегда иметь короткое время обновления, когда я пытаюсь обновить заборы повторно (с коротким интервалом)? Конечно, я не хочу, чтобы ограждения обновлялись так часто в версии выпуска, но для целей тестирования это было бы очень полезно.

И наличие такого большого количества зарегистрированных заборов может серьезно повлиять на срок службы батареи или производительность устройства?

1 ответ

Мне кажется, что вы одновременно создаете заборы вокруг локаций, географически распределенных по большой территории (поскольку вы упоминаете 3000 локаций). Возможно, что затраченное время имеет некоторую корреляцию с количеством ограждений, добавленных к запросу. Возможно, вы можете разделить местоположения в иерархической манере и управлять тем, какие ограждения зарегистрированы / незарегистрированы после получения обратных вызовов.

Например, чтобы зарегистрировать заборы вокруг различных кварталов в нескольких городах, возможно, зарегистрируйте заборы, соответствующие только текущему городу, вместе с другим, охватывающим весь город, а если устройство выходит из города, то отмените регистрацию в старом городе и зарегистрируйте в новом городе?

Надеюсь, что этот маленький игрушечный пример поможет донести мою идею о том, какие заборы вы хотите зарегистрировать из большого списка заборов.

Другие вопросы по тегам