所以,我四处寻找这个问题的答案。
我想弄清楚如何在异步任务的 onPostExecute() 调用中修改放置在我的 Google map (map api v2)上的标记的 fragment 文本。我想在我的项目中使用它的方式是在用户单击标记后更新代码段文本。有点像对该标记上已经预先设置的信息进行更新。
示例,按操作顺序:
- 用户在我的 map 上选择一个标记,
- Asynctask 被触发(通过 onMarkerClickListener())
- Asynctask preExecute() 将 fragment 的文本更改为“获取下一个到达时间...”
- Asynctask doInBackground() 在我的数据库中查询请求的数据
- Asynctask postExecute() 将选定的标记 fragment 文本设置为“Next: 4:15PM”
我尝试了几种不同的方法,得出了一个简洁合理的解决方案,但还是不行。我遇到的问题是,标记需要是“最终”类型,当我这样做时,它不会更新显示给用户的 fragment 文本,但它仍然会运行异步任务并成功完成。
以下是我试过的代码:
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);
}
我只是不想在我的数据库筛选数百条时间记录时 map 挂起。非常感谢任何帮助,因为我相信这不仅对我有帮助。
最佳答案
这是 Android Google Maps API 中的一个已知缺陷。看看here一些解决方法。
关于java - 如何在 Asynctask 中修改 Google Maps v2 标记的 fragment 文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21447229/