如何在Asynctask中修改Google Maps v2 Markers的片段文本?

时间:2014-01-30 03:25:55

标签: java android google-maps android-asynctask

所以,我已经搜索了高低,找到了这个问题的答案。

我想知道如何在asynctask的onPostExecute()调用中修改放置在我的Google Map(map api v2)上的标记的片段文本。我想如何在我的项目中使用它,是在用户点击标记后更新片段文本。有点像对该标记上预先设置的信息的更新。

示例,按操作顺序:

  1. 用户在我的地图上选择一个标记,
  2. 触发Asynctask(通过onMarkerClickListener())
  3. Asynctask preExecute()将代码段文本更改为“获取下次到达时间......”
  4. Asynctask doInBackground()在我的数据库中查询所请求的数据
  5. Asynctask postExecute()将选定的标记片段文本设置为“下一个:下午4:15”
  6. 我尝试了一些不同的方法,并得出了一个简洁合理的解决方案,但它不起作用。我得到的问题是,标记需要是'final'类型,当我这样做时,它不会更新显示给用户的片段文本,但是它仍然通过asynctask运行并成功完成。 / p>

    以下是我尝试过的代码:

    map.setOnMarkerClickListener():

        map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                // Update marker next stop time
                updateMarkerSnippet(marker);
                return false;
            }
        });
    

    updateMarkerSnippet():

    public void updateMarkerSnippet(final Marker marker) {
        final String title = marker.getTitle();
        AsyncTask<Void, Void, Void> update = new AsyncTask<Void, Void, Void>() {
            private String nextArrival = "";
    
            @Override
            protected Void onPreExecute() {
                marker.setSnippet("Fetching next arrival time...");
            }
    
            @Override
            protected Void doInBackground(Void... voids) {
                nextArrival = db.getNextArrival(title); // db is my database sql class (runs queries)
                return null;
            }
    
            @Override
            protected void onPostExecute(Void result) {
                marker.setSnippet("Next: " + nextArrival);
            }
        };
        update.execute((Void[]) null);
    }
    

    我只是不希望地图挂起,而我的数据库正在筛选数百个时间记录。非常感谢任何帮助,因为我相信这不仅仅对我自己有帮助。

2 个答案:

答案 0 :(得分:1)

这是Android Google Maps API中的一个众所周知的缺点。看看here了解一些变通方法。

答案 1 :(得分:0)

这很有趣,因为marker.setPosition效果不错但marker.setSnippet没有(对于我的自定义代码段布局),我修复了它:

if(marker.isInfoWindowShown())
{
  marker.hideInfoWindow();
  marker.showInfoWindow();
}