Java 如何在Asynctask中修改Google Maps v2标记的代码段文本?

Java 如何在Asynctask中修改Google Maps v2标记的代码段文本?,java,android,google-maps,android-asynctask,Java,Android,Google Maps,Android Asynctask,所以,我到处寻找这个问题的答案 我试图弄清楚如何在asynctask的onPostExecute()调用中修改放置在Google地图(Map api v2)上的标记的代码段文本。我想在我的项目中如何使用它,就是在用户单击标记后更新代码段文本。有点像对该标记上已预设的信息的更新 例如,按照操作顺序: 用户在我的地图上选择一个标记 异步任务被触发(通过onMarkerClickListener()) Asynctask preExecute()将代码段的文本更改为“获取下次到达时间…” Asynct

所以,我到处寻找这个问题的答案

我试图弄清楚如何在asynctask的onPostExecute()调用中修改放置在Google地图(Map api v2)上的标记的代码段文本。我想在我的项目中如何使用它,就是在用户单击标记后更新代码段文本。有点像对该标记上已预设的信息的更新

例如,按照操作顺序:

  • 用户在我的地图上选择一个标记
  • 异步任务被触发(通过onMarkerClickListener())
  • Asynctask preExecute()将代码段的文本更改为“获取下次到达时间…”
  • Asynctask doInBackground()查询我的数据库以获取请求的数据
  • Asynctask postExecute()将所选标记代码段文本设置为“下一步:4:15PM”
  • 我尝试了几种不同的方法,并得出了一个简洁合理的解决方案,但它不起作用。我遇到的问题是,标记需要是“final”类型,当我这样做时,它不会更新显示给用户的代码段文本,但是它仍然运行异步任务并成功完成

    以下是我尝试过的代码:

    map.setOnMarkerClickListener():

        map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                // Update marker next stop time
                updateMarkerSnippet(marker);
                return false;
            }
        });
    
    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);
    }
    
    updateMarkerSnippet():

        map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                // Update marker next stop time
                updateMarkerSnippet(marker);
                return false;
            }
        });
    
    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);
    }
    
    public void updateMarkerSnippet(最终标记){
    最终字符串标题=marker.getTitle();
    AsyncTask update=新建AsyncTask(){
    私有字符串nextArrival=“”;
    @凌驾
    受保护的Void onPreExecute(){
    marker.setSnippet(“获取下次到达时间…”);
    }
    @凌驾
    受保护的空位背景(空位…空位){
    nextArrival=db.getNextArrival(title);//db是我的数据库sql类(运行查询)
    返回null;
    }
    @凌驾
    受保护的void onPostExecute(void结果){
    marker.setsnipet(“下一步:+nextArrival”);
    }
    };
    update.execute((Void[])null);
    }
    

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

    这是安卓谷歌地图API中的一个已知缺陷。查看一些解决方法。

    这很有趣,因为
    标记.setPosition
    工作正常,但
    标记.setNippet
    不工作(对于我的自定义代码段布局),我这样修复了它:

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

    感谢您将我链接到该问题页面。[对于其他人]:在彻底阅读之后,我了解到从标记显示的信息面板不是实时视图。只是内容的预渲染图像。我可以像上面发布的那样保留所有代码,只需要在异步任务的onPostExecute()方法中添加marker.showInfoPanel()。非常感谢。