Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 向地图添加标记/多段线/多边形的更快/更高效的方法_Android_Google Maps_Google Maps Android Api 2 - Fatal编程技术网

Android 向地图添加标记/多段线/多边形的更快/更高效的方法

Android 向地图添加标记/多段线/多边形的更快/更高效的方法,android,google-maps,google-maps-android-api-2,Android,Google Maps,Google Maps Android Api 2,目前,我有一个地图元素(标记点、多段线点和多边形点及其信息)的数据库(调用为database1),对于多段线/多边形点,我将其点(Lat/Lng)保存在一个单独的数据库中(称为database2)其中,每个点都是一个单独的数据库项,用database1的元素id引用 当MapFragment加载时,我以AsyncTask c = getActivity().getContentResolver().query(MapElements.CONTENT_URI,new String[] { MapE

目前,我有一个地图元素(标记点、多段线点和多边形点及其信息)的数据库(调用为
database1
),对于多段线/多边形点,我将其点(Lat/Lng)保存在一个单独的数据库中(称为
database2
)其中,每个点都是一个单独的数据库项,用
database1
的元素id引用

当MapFragment加载时,我以
AsyncTask

c = getActivity().getContentResolver().query(MapElements.CONTENT_URI,new String[] { MapElements.ID,MapElements.LOCATION_STRING,MapElements.LAYER_ID,MapElements.NEW_OR_MOD}, null, null, null);
在光标中循环,如果元素是多段线或多边形,我将使用该元素的
id
提取所有点,并创建一个列表,以便稍后在创建直线或多边形时使用

Cursor c2 = context.getContentResolver().query(MapPoints.CONTENT_URI,new String[] { MapPoints.LAYER_ID, MapPoints.LATITUDE,MapPoints.LONGITUDE },
                        MapPoints.ELEMENT_ID + "=?",new String[] { String.valueOf(id) }, null);
    if (c2 != null && c2.moveToFirst()) {
        do {
            locationArray.add(new LatLng(c2.getFloat(1), c2.getFloat(2)));
        } while (c2.moveToNext());

    }
c2.close();
然后我用列表把它标到地图上

Polyline line = map.addPolyline(new PolylineOptions().addAll(mElement.getLocationArray()));
整个过程可能需要很长时间,例如,使用
250
不同的元素大约需要10-15秒来加载所有元素,并且地图元素的数量可能会大大增加或减少,因此显然点数越多,所需时间越长

看看谷歌地图应用程序,看起来他们所有的标记都加载得很快,有没有什么方法可以加快加载速度

更新

我从traceview中了解到,
Handler
操作是运行时间第二和第三长的操作。因此,我所做的是取出asynctask中的处理程序,我使用这些处理程序回调主线程,将其放到映射中,进程在2秒内完成

我提取了处理程序代码并将其放在自己的方法中,现在就是这个方法

private void test(final MapElement mElement){
        if (mElement.getType() > 0) {
            try{
                Handler h = new Handler(getActivity().getMainLooper());
                if (mElement.getType() == 3) {
                    h.post(new Runnable(){

                        public void run() {
                            Polygon poly = map.addPolygon(new PolygonOptions()
                            .addAll(mElement.getLocationArray()));

                    String color = mElement.getFillColor();
                    String borderColor = mElement.getBorderCOlor();

                    poly.setFillColor(Color.parseColor("#"+color));
                    poly.setStrokeColor(Color.parseColor("#"+borderColor));
                    poly.setStrokeWidth(4);

                    poly.setVisible(false);

                    Marker m = map.addMarker(new MarkerOptions()
                    .position(mElement.getPoint())
                    .icon(BitmapDescriptorFactory.fromResource(mElement.getMarkerIcon())));

                    m.setVisible(false);
                    m.setSnippet(String.valueOf(mElement.getID()));
                    mElement.setMarker(m);

                    mElement.setPolygon(poly);
                        }

                    });
                    mapElements.put(mElement.getID(), mElement);
                } else if (mElement.getType() == 2) {
                    h.post(new Runnable(){

                        public void run() {
                            Polyline line = map
                                    .addPolyline(new PolylineOptions()
                                            .addAll(mElement.getLocationArray()));

                            String borderColor = mElement.getBorderCOlor();

                            if(borderColor == null){
                                line.setColor(Color.BLUE);
                            }else{
                                line.setColor(Color.parseColor("#"+borderColor));
                            }

                            line.setWidth(mElement.getThickness());
                            line.setVisible(false);

                            if(mElement.getLayerId() != 16){
                                Marker m = map.addMarker(new MarkerOptions()
                                .position(mElement.getPoint())
                                .icon(BitmapDescriptorFactory.fromResource(mElement.getMarkerIcon())));

                            m.setVisible(false);
                            m.setSnippet(String.valueOf(mElement.getID()));

                            mElement.setMarker(m);
                            }

                            mElement.setPolyLine(line);

                        }

                    });
                    mapElements.put(mElement.getID(), mElement);
                } else {
                    h.post(new Runnable(){

                        public void run() {
                            Marker m = map.addMarker(new MarkerOptions()
                            .position(mElement.getPoint()).icon(
                                    BitmapDescriptorFactory.fromResource(mElement.getMarkerIcon())));

                                m.setVisible(false);
                                m.setSnippet(String.valueOf(mElement.getID()));
                                mElement.setMarker(m);
                        }

                    });
                    mapElements.put(mElement.getID(), mElement);
                }
                ContentValues values = new ContentValues();
                values.put(MapElements.PLOTTED, 1);
                getActivity().getContentResolver().update(Uri.withAppendedPath(MapElements.CONTENT_ID_URI_BASE,String.valueOf(mElement.getID())), values, null, null);


            }catch(NullPointerException e){
                e.printStackTrace();
            }
        }
    }
即使取出处理程序并将
test
方法放在onPostExecute中,仍然会导致延迟。完成此方法需要
0.058秒
,乘以250等于
15秒

这似乎就是问题所在,我应该以不同的方式处理对主线程的回调吗

在光标中循环,如果元素是多段线或多边形,我将使用该元素的id拉动所有点


这很可能是你的罪魁祸首。每个Hibernate用户都会告诉您N+1查询非常非常糟糕。删除循环,在一个查询中加载所有点,并在代码中生成逻辑。

您是否已将延迟隔离到实际绘图而不是数据库调用?当我说绘图时,我指的是获取/循环/放入地图的整个过程。延迟可能更多地是由于循环遍历所有内容,然后在我得到所有值后将其添加到地图中。我建议的是隔离延迟。如果您创建250个静态项目,并尝试循环列表并将其添加到映射中,是否会有延迟?如果不是的话,你的问题是从数据库中提取数据的延迟,你应该专注于这一方面,以加快整个过程。当你使用Traceview来确定你在哪里花费时间时,你学到了什么?@Commonware老实说,我不确定我在Traceview中寻找什么。我拍了一张截图,从片段加载到@tyczj加载的所有内容。这段代码是一个问题。为什么不将
List
doInBackground
返回到
onPostExecute
并在其上进行紧密循环?为什么需要
ContentResolver.update
?如果让它们不可见,为什么还要将所有这些对象添加到
GoogleMap
?地图元素的工作原理还有很多,只需打印即可。想象一下谷歌地图应用程序,你可以启用和禁用图层,这样我就有了不同的地图元素图层。我首先将它们全部隐藏起来,然后显示以后应该启用的。我在onPostExecute中做了一个测试,返回了一个
列表
,但它对速度没有影响,甚至有时会阻塞UI。更新(我忘记了)是为了告诉我,如果有推送进来,说有一些新的地图元素需要绘制,我只需查找
0
的任何东西,这意味着它没有被绘制