2013-09-27 79 views
0

我有一個包含大約1700個標記的文件,我試圖將其加載到gmap v2上。在運行4.2.2的我的星系連結中,它沒有問題,但4.0.x和4.1.x的一些人沒有得到相同的結果。他們得到地圖,但約30秒後沒有點或應用程序崩潰。我加載本地文件...在谷歌地圖v2上加載1700個標記Android超時

這裏是我的方法:

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,但每次得到的不是在主線程上的錯誤...所以我不知道如何在後臺運行它,以保持它爲人加載,直到解析完全發生。

爲什麼會顯示我的Gnex和Nexus 7平板電腦,但不是4.0.x等?如何找出問題出現在其他設備上的問題?

+0

這可能是由於內存限制 –

回答

2

有兩個問題與您的代碼。

首先,您正在讀取主線程中的文件。在後臺執行此部分,例如使用返回MarkerOptions列表的AsyncTask。遍歷onPostExecute中的返回列表以將其添加到地圖。

第二個問題可能是標記的數量。有幾種方法可以解決這個問題。檢查這個答案:Add markers dynamically on Google Maps v2 for Android

+0

感謝您的信息。我已經檢查了你的圖書館...我想我會在這裏試一試。 :) – jasonflaherty

+0

好吧,我有點困惑。我該返回什麼?或者更好,我如何在異步中返回標記?保護標記[] doInBackground(Marker ... m){}? – jasonflaherty

+0

我使用Async方法更好地工作......感謝您指出onPostExecute。 – jasonflaherty

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(); 

    } 
+0

感謝您的答覆。有一種方法可以將對話放在那裏,而它正在全力以赴? – jasonflaherty

+0

那裏有什麼奇怪的東西。我跑這個,有時得到所有的點,然後有時不。如果我運行我的舊方法,我總是得到所有的要點。有什麼想法嗎? – jasonflaherty

+0

把一個try..catch內循環也試試 –