gpt4 book ai didi

带有 Android-Maps-Extensions 的 Android Maps V2 添加大量标记非常慢

转载 作者:太空狗 更新时间:2023-10-29 15:07:04 27 4
gpt4 key购买 nike

我正在使用带有 android-maps-extensions 的 android maps api v2 进行集群,并向 map 添加近 1000 个标记。在应用程序的第一次运行中,我使用后台线程从 web 服务下载数据并保存在 SQLite 中,之后将标记添加到 map 中。当我在显示 map 时在 map 上添加这些标记时,ui 线程在 3 秒内被阻塞,在此期间无法移动 map ,我使用的进度条也停止了。

这是我用来在 map 上添加标记的代码:

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 读取数据,速度非常快,当显示 map 时,标记已经在 map 上,没有任何延迟。完美!!

我认为问题是在显示 map 后将标记放在 map 上。我看到从数据库中读取标记并添加到 map 上的时间通常为 800 毫秒。

我试过这些东西:

  1. 在onPostExecute中添加标记
  2. 创建一次 BitmapDescriptor

如何在不阻塞 UI 线程的情况下添加这些标记?我已经在后台线程中完成了所有读取和下载,但是添加标记需要在 UI 线程中执行!这是正确的吗?有没有办法在后台线程中添加这些标记?我该如何修复或采取变通办法?

P.s: 对不起,因为我的英语不好,我正在同时学习 android 和英语!! =D

谢谢

最佳答案

您的代码的问题似乎是在循环中调用 publishProgress。而是在 onPostExecute 中执行该循环。

关于带有 Android-Maps-Extensions 的 Android Maps V2 添加大量标记非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20980519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com