如何加快android谷歌地图标记?

时间:2014-10-01 23:05:18

标签: android google-maps-android-api-2

我将标记加载到谷歌地图并且性能非常糟糕:加载地图和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}}方法添加标记,有人可以帮助我吗?

2 个答案:

答案 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之间的接口,从而不再需要处理程序..