Добавление элементов в менеджер кластеров и вызов cluster() не имеют никакого эффекта до завершения AsyncTask

Моя ситуация:

Я использую AsyncTask подготовить данные для карты Google. Поскольку эта задача занимает некоторое время, я хотел бы отобразить объекты, как они готовы (и не все сразу, когда закончите). Поэтому я использую publishProgress&onProgressUpdate обновить карту.
Я использую служебную библиотеку Google Maps Android API для добавления маркеров на карту. Я звоню ClusterManager.cluster() после изменения данных для принудительной перезагрузки маркеров.

Эта проблема:

Ничего не произошло. Обновление ProgressBar от onProgressUpdate() работает без нареканий, но отображение маркеров на карте - нет. Я вижу, что все методы, которые должны вызываться, вызывают, и я проверил, что эти методы работают нормально, если они вызваны не из AsyncTask, После завершения AsyncTask все маркеры отображаются магическим образом, даже если не вызывается никакой другой метод.
Если я использую тот же метод для добавления маркеров непосредственно на карту через стандартный API (то есть вместо добавления их в диспетчер кластеров), маркеры отображаются так, как они должны.

Таким образом, вопрос заключается в том, есть ли у администратора кластера какая-либо причина для ожидания повторной кластеризации до завершения AsyncTask? РЕДАКТИРОВАТЬ: Точнее, не после doInBackground заканчивается, но после onPostExecute отделки.

У меня проблемы с пониманием и отладкой этой проблемы, я провел с ней целый день.
Заранее спасибо!

1 ответ

Решение

Оказывается, проблема была в смешивании muplitple AsyncTasks - одна моя и одна в диспетчере кластеров. Исправление - не очень приятное - заключалось в том, чтобы внести изменения в библиотеку (я не нашел способа приятно расширить ее из-за закрытых полей) и выполнить задачу кластеризации задач по-другому в 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.

Надеюсь, это может спасти кого-то еще от головной боли.

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