Обновление локации заборов в 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 локаций). Возможно, что затраченное время имеет некоторую корреляцию с количеством ограждений, добавленных к запросу. Возможно, вы можете разделить местоположения в иерархической манере и управлять тем, какие ограждения зарегистрированы / незарегистрированы после получения обратных вызовов.
Например, чтобы зарегистрировать заборы вокруг различных кварталов в нескольких городах, возможно, зарегистрируйте заборы, соответствующие только текущему городу, вместе с другим, охватывающим весь город, а если устройство выходит из города, то отмените регистрацию в старом городе и зарегистрируйте в новом городе?
Надеюсь, что этот маленький игрушечный пример поможет донести мою идею о том, какие заборы вы хотите зарегистрировать из большого списка заборов.