Добавление элементов в менеджер кластеров и вызов cluster() не имеют никакого эффекта до завершения AsyncTask
Моя ситуация:
Я использую AsyncTask
подготовить данные для карты Google. Поскольку эта задача занимает некоторое время, я хотел бы отобразить объекты, как они готовы (и не все сразу, когда закончите). Поэтому я использую publishProgress
&onProgressUpdate
обновить карту.
Я использую служебную библиотеку Google Maps Android API для добавления маркеров на карту. Я звоню ClusterManager.cluster()
после изменения данных для принудительной перезагрузки маркеров.
Эта проблема:
Ничего не произошло. Обновление ProgressBar
от onProgressUpdate()
работает без нареканий, но отображение маркеров на карте - нет. Я вижу, что все методы, которые должны вызываться, вызывают, и я проверил, что эти методы работают нормально, если они вызваны не из AsyncTask
, После завершения AsyncTask все маркеры отображаются магическим образом, даже если не вызывается никакой другой метод.
Если я использую тот же метод для добавления маркеров непосредственно на карту через стандартный API (то есть вместо добавления их в диспетчер кластеров), маркеры отображаются так, как они должны.
Таким образом, вопрос заключается в том, есть ли у администратора кластера какая-либо причина для ожидания повторной кластеризации до завершения AsyncTask? РЕДАКТИРОВАТЬ: Точнее, не после doInBackground
заканчивается, но после onPostExecute
отделки.
У меня проблемы с пониманием и отладкой этой проблемы, я провел с ней целый день.
Заранее спасибо!
1 ответ
Оказывается, проблема была в смешивании muplitple AsyncTask
s - одна моя и одна в диспетчере кластеров. Исправление - не очень приятное - заключалось в том, чтобы внести изменения в библиотеку (я не нашел способа приятно расширить ее из-за закрытых полей) и выполнить задачу кластеризации задач по-другому в cluster()
метод:
if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
mClusterTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
mMap.getCameraPosition().zoom);
} else {
mClusterTask.execute(mMap.getCameraPosition().zoom);
}
Нашел совет - скорее одновременно - на GitHub.
Надеюсь, это может спасти кого-то еще от головной боли.