我将标记加载到谷歌地图并且性能非常糟糕:加载地图和40个标记需要大约5秒钟。(在地图和标记加载之前,屏幕为空白)
这是我的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment"/>
</RelativeLayout>
以下代码正在向地图添加标记:
1)迭代所有餐厅对象,获取每个餐厅的地址。
2)将地址转换为LatLng对象
3)添加到标记
//partial of the method
for (Restaurant rest : rests) {
LatLng ll = getLatLng(rest.getAddress());//converts address to LatLng
MarkerOptions marker = new MarkerOptions()
.title(rest.getName())
// .snippet("Briefly description: " + i++)
.position(ll)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker))
.anchor(0.0f, 1.0f);
myMap.addMarker(marker);
}
public LatLng getLatLng(String address) {
try {
ArrayList<Address> addresses = (ArrayList<Address>) geocoder.getFromLocationName(address, MAX_ADDRESS_ALLOWDED);
for (Address add : addresses) {
if (true) {//Controls to ensure it is right address such as country etc.
longitude = add.getLongitude();
latitude = add.getLatitude();
}
}
} catch (Exception e) {
Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT).show();
}
return new LatLng(latitude, longitude);
}
我正在使用onPostExecute
的{{1}}方法添加标记,有人可以帮助我吗?
答案 0 :(得分:1)
同时放置标记&#39;不同的可绘制文件夹(hdpi,mdpi,...)中的图标而不是一个文件夹(可绘制)可能会有所帮助。我的意思是使图标兼容不同的屏幕分辨率。
答案 1 :(得分:0)
AsyncTask的onPostExecute方法在主UI线程中运行。这就是为什么(如果你已经尝试过)你可以从Post执行Toast而不是从Background线程。基本上你想通过从主要活动中取出一些来平衡负荷。特别是尝试在后台保持循环。使用新线程并使用处理程序放置标记。
public void placeMarkers(final ArrayList<String>myArray, final Handler handler){
new Thread(){
@Override
public void run(){
//my for loops
for(int i = 0; i < myArray.size(); i++){
//post with a handler..
handler.post(new Runnable() {
@Override
public void run() {
//place your markers.
}
});
}
//etc etc..
}
}.run();
}
另一种方法是使用Thread和MainActivity之间的接口,从而不再需要处理程序..