0

我有一个包含大约 1700 个标记的文件,我正在尝试将其加载到 gmap v2 上。在我运行 4.2.2 的 Galaxy nexus 上,它加载没有问题,但是一些使用 4.0.x 和 4.1.x 的人没有得到相同的结果。他们得到了地图,但没有积分,或者应用程序在大约 30 秒后崩溃。我正在加载本地文件...

这是我的方法:

public void BuildMap() {

        FileInputStream fXmlFile;
        markerInfo = new HashMap<Marker, MapMarkers>();
        try {
            fXmlFile = new FileInputStream(
                    "/storage/emulated/0/snoteldata/kml/snotelwithlabels.kml");

            XmlDom xml = new XmlDom(fXmlFile);
            List<XmlDom> locations = xml.tags("Placemark");
            String Name, Description, Lat, Lon;
            markerInfo = new HashMap<Marker, MapMarkers>();
            for (XmlDom location : locations) {
                MapMarkers marks = new MapMarkers();
                Name = location.tag("name").text();
                Description = location.tag("description").text();

                Lat = location.tag("latitude").text();
                Lon = location.tag("longitude").text();

                la = Float.parseFloat(Lat);
                lo = Float.parseFloat(Lon);

                marks.setTitle(Name);
                marks.setDesc(Description);

                Marker m = map.addMarker(new MarkerOptions()
                        .position(new LatLng(la, lo))
                        .title(marks.getTitle())
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.drawable.snotel_marker)));

                markerInfo.put(m, marks);

                map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
                    @Override
                    public void onInfoWindowClick(Marker marker) {

                        MapMarkers markInfo = markerInfo.get(marker);

                        Intent i = new Intent(MainActivity.this,
                                MarkerInformation.class);
                        i.putExtra("name", markInfo.getTitle()).putExtra(
                                "description", markInfo.getDesc());
                        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(i);

                    }

                });
            }

        } catch (SAXException e) {
            // TODO Auto-generated catch block
            Log.e("SAXException", e.getMessage());
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            Log.e("FileNotFoundException", e.getMessage());
        }
    }

我已经尝试将它放在 AsyncTask 中,但每次都会出现 Not on Main Thread 错误......所以我不确定如何在后台运行它以保持它为人们加载,直到解析完全发生。

为什么这显示在我的 Gnex 和 Nexus 7 平板电脑上,而不是 4.0.x 等?我怎样才能找出问题在其他设备上的位置?

4

2 回答 2

2

您的代码有两个问题。

首先,您正在主线程上读取文件。在后台执行此部分,例如使用返回 MarkerOptions 列表的 AsyncTask。迭代 onPostExecute 中返回的列表以将它们添加到地图中。

第二个问题可能是标记的数量。有几种方法可以处理这个问题。检查这个答案:在 Google Maps v2 for Android 上动态添加标记

于 2013-09-27T05:42:43.987 回答
0

这样做

public void BuildMap() {

        final Handler mHandler = new Handler();

        new Thread(new Runnable() {

            @Override
            public void run() {
                FileInputStream fXmlFile;
                markerInfo = new HashMap<Marker, MapMarkers>();
                try {
                    fXmlFile = new FileInputStream("/storage/emulated/0/snoteldata/kml/snotelwithlabels.kml");

                    XmlDom xml = new XmlDom(fXmlFile);
                    List<XmlDom> locations = xml.tags("Placemark");
                    String Name, Description, Lat, Lon;
                    markerInfo = new HashMap<Marker, MapMarkers>();
                    for (XmlDom location : locations) {
                        final MapMarkers marks = new MapMarkers();
                        Name = location.tag("name").text();
                        Description = location.tag("description").text();

                        Lat = location.tag("latitude").text();
                        Lon = location.tag("longitude").text();

                        la = Float.parseFloat(Lat);
                        lo = Float.parseFloat(Lon);

                        marks.setTitle(Name);
                        marks.setDesc(Description);

                        mHandler.post(new Runnable() {

                            @Override
                            public void run() {

                                Marker m = map.addMarker(new MarkerOptions().position(new LatLng(la, lo)).title(marks.getTitle())
                                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.snotel_marker)));

                                markerInfo.put(m, marks);

                                map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
                                    @Override
                                    public void onInfoWindowClick(Marker marker) {

                                        MapMarkers markInfo = markerInfo.get(marker);

                                        Intent i = new Intent(MainActivity.this, MarkerInformation.class);
                                        i.putExtra("name", markInfo.getTitle()).putExtra("description", markInfo.getDesc());
                                        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                        startActivity(i);

                                    }

                                });
                            }
                        });
                    }

                } catch (SAXException e) {
                    // TODO Auto-generated catch block
                    Log.e("SAXException", e.getMessage());
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    Log.e("FileNotFoundException", e.getMessage());
                }
            }
        }).start();

    }
于 2013-09-27T04:12:52.220 回答