我正在使用android maps api v2和android-maps-extensions进行聚合,并将近1000个标记添加到地图上。在应用程序第一次运行时,我使用后台线程从Web服务下载数据并保存在SQLite中,之后将这些标记添加到地图上。当我在地图上添加这些标记时,当地图显示时,UI线程会被阻塞3秒钟,此时无法移动地图,我使用的进度条也停止了。
以下是我用于在地图上添加标记的代码:
我正在使用addMarkersDinamically:
问题仅在第一次运行时发生!下载数据后,当应用程序打开时,我从SQLite中读取数据非常快,当地图显示时,标记已经显示在地图上,没有任何延迟。完美!
我认为问题是在地图显示后放置标记时出现的。我发现从数据库中读取标记并将其添加到地图上的时间通常为800毫秒。
我尝试了以下几件事:
1. 在onPostExecute中添加标记 2. 仅创建BitmapDescriptor 如何使这些添加标记而不阻塞UI线程?所有读取和下载都已在后台线程中完成,但添加标记需要在UI线程中执行!这是正确的吗?有没有办法在后台线程中添加这些标记?我该如何修复或解决问题?
附言:对不起我的英语不好,我正在同时学习Android和英语!! =D
谢谢
以下是我用于在地图上添加标记的代码:
private class ReadMarkersFromDB extends AsyncTask<String, UpdateEstacionamentoMap, ArrayList<UpdateEstacionamentoMap>> {
@Override
protected ArrayList<UpdateEstacionamentoMap> doInBackground(String... params) {
EstacionamentoDAO estacionamentoDAO = new EstacionamentoDAO();
SQLiteHelper sqh = new SQLiteHelper(getApplicationContext());
SQLiteDatabase sqdb = sqh.getWritableDatabase();
//Caso tenha informado a string para seleção, usa
String selection = "";
if(params[0] != null && !params[0].isEmpty())
{
selection = params[0];
}
//Pega todos os estacionamentos
ArrayList<Estacionamento> estacionamentos = estacionamentoDAO.get(sqdb,selection);
sqdb.close();
sqh.close();
//Armazena o que deve ser feito no mapa. Operações: Excluir, Incluir ou Atualizar os estacionamentos
ArrayList<UpdateEstacionamentoMap> atualizarMapa = new ArrayList<UpdateEstacionamentoMap>();
//Se não passou nenhuma string para seleção, logo retornou todos os registros e no mapa não tem nada, portanto somente inclui tudo no mapa
if(selection == null || selection.isEmpty())
{
//Itera os estacionamentos retornados na consulta
for(Estacionamento estacAux : estacionamentos)
{
//AQUI É ONDE MANDA INCLUIR O PIN NO MAPA
publishProgress(new UpdateEstacionamentoMap(estacAux,null,0)); //0 = Incluir Pin do Estacionamento
}
}else //Se passou algum "selection" assume que já tem coisas no mapa e precisa apenas atualizar o conteúdo já existente no mapa
{
...
}
return atualizarMapa;
}
@Override
protected void onProgressUpdate(UpdateEstacionamentoMap... updateEstac)
{
if(updateEstac[0].operacao == 0) //Incluir pin no mapa
{
//AQUI É ONDE INCLUI O PIN NO MAPA
if(!updateEstac[0].estac.getDeletado()) //Inclui no mapa se o estacionamento não estiver deletado
map.addMarker(options.data(updateEstac[0].estac).position(updateEstac[0].estac.getLocation()).title(updateEstac[0].estac.getNome()).snippet(updateEstac[0].estac.getEndereco()).icon(icon));
}
else
{
...
}
}
@Override
protected void onPostExecute(ArrayList<UpdateEstacionamentoMap> estacionamentos) {
}
}
我正在使用addMarkersDinamically:
ClusteringSettings clusteringSettings = new ClusteringSettings().clusterOptionsProvider(new MyClusterOptionsProvider(getResources()));
clusteringSettings.addMarkersDynamically(true); //Adiciona os pins somente na região visível pelo usuário
double clusterSize = 70; //Configuração para considerar dois pontos um cluster
clusteringSettings.clusterSize(clusterSize);
map.setClustering(clusteringSettings);
问题仅在第一次运行时发生!下载数据后,当应用程序打开时,我从SQLite中读取数据非常快,当地图显示时,标记已经显示在地图上,没有任何延迟。完美!
我认为问题是在地图显示后放置标记时出现的。我发现从数据库中读取标记并将其添加到地图上的时间通常为800毫秒。
我尝试了以下几件事:
1. 在onPostExecute中添加标记 2. 仅创建BitmapDescriptor 如何使这些添加标记而不阻塞UI线程?所有读取和下载都已在后台线程中完成,但添加标记需要在UI线程中执行!这是正确的吗?有没有办法在后台线程中添加这些标记?我该如何修复或解决问题?
附言:对不起我的英语不好,我正在同时学习Android和英语!! =D
谢谢