2015-04-29 148 views
2

我目前正在学习制作一个使用Google地图向用户显示数据的Android应用。目前我正在使用Polyline绘制出想要在地图上显示的所有“数据/线条”,但我直接在Google Map上绘制它,例如mMap.addPolyline(...)。 (我希望我可以张贴屏幕截图,但我至少没有10个声望:-()如何高效地在Google地图中绘制多条折线?

但是我在绘制地图上的所有这些行时遇到了一些性能问题,因为它们由500〜 900线在一个小地方(通过放大)。问题是,当应用程序正在绘制所有这些数据,应用程序挂起/停止一秒钟,就像冻结,然后一旦完成绘图,应用程序继续工作

所以我的问题是,如何在绘制地图时,让应用程序在一秒钟内不会挂起/停止,从而平滑地绘制多条多段线?例如,用户可以在地图上移动,而多段线被绘制在地图上?

我试图在不同的线程在地图上绘制多段线,但是我得到了一个类似于必须在主线程上绘制的错误(不记得确切的异常错误)。除此之外,我还在互联网上搜索了这样的例子,但我只找到Overlay或ItemizedOverlay的例子,但据我所知,这些例子已被弃用。还有其他的选择吗?你能向我展示一些例子或指导我选择正确的资源吗?给我看一些代码会很有帮助。

谢谢

更新: 忘记,包括在这里我的代码,这里是我画折线代码:

private class LoadDataTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     // Show a message saying this app is fetching data 
     Toast.makeText(mMainActivity, 
       "Fetching data ...", 
       Toast.LENGTH_SHORT) 
       .show(); 
    } 

    @Override 
    protected Void doInBackground(String... urls) { 
     // Load then read the data from a url in the background 
     loadData(); 

     readData(); 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 

     // draw lines here 
     PolylineOptions lineOptions = new PolylineOptions() 
       .add(new LatLng(locations[0].getLatitude(), locations[0].getLongitude())) 
       .add(new LatLng(locations[1].getLatitude(), locations[1].getLongitude())) 
       .color(Color.GREEN) 
       .width(5f); 

     Polyline polyline = mMap.addPolyline(lineOptions); 
     lineList.add(polyline); 

    } 
} 

回答

0

你应该使用asynclass为,并显示progressdialog

private class ShowPolyLine extends 
       AsyncTask<Void, Void, Void> { 
    ProgressDialog pdDialog; 
      @Override 
      protected void onPreExecute() { 
       try { 
     pdDialog = new ProgressDialog(YourActivity.this); 
        pdDialog.show(); 
        pdDialog.setCancelable(false); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      protected TicketTemplate doInBackground(Void... params) { 
       try { 
        // show pollyline code 
       } catch (Exception e) { 
        Log.d("exception", ".........................." + e); 
        return null; 
       } 
      } 

      @Override 
      protected void onPostExecute(Void result) { 

        super.onPostExecute(result); 
        pdDialog.dismiss(); 




      } 

     } 

,并把它作为ShowPolyLine().execute();

+0

是不是说仍然会导致应用程序/地图在绘制所有行时停止响应一会儿? – khai

+0

是的,这肯定需要时间,但它不会挂你的用户界面,用户会知道一些工作正在进行。 – jyomin

0

运行中获取数据绘制在后台线程,只有在主胎面画线,使用下面的代码,我们正在绘制3000行

Set<String> routeNames=cordinatePojos.keySet(); 
      arrayList=new ArrayList<String>(); 
      arrayList.addAll(routeNames); 
      iterator=routeNames.iterator(); 
      color[0]=Color.BLUE; 
      color[1]=Color.GREEN; 
      color[2]=Color.RED; 
      color[3]=Color.CYAN; 
      conuter=0;  

Thread thread=new Thread(new Runnable() { 

         @Override 
         public void run() { 
          // TODO Auto-generated method stub 
          while (iterator.hasNext()) { 

          latLngs = cordinatePojos.get(iterator.next()); 
          sortLocations(latLngs, latLngs.get(0).latitude, latLngs.get(0).longitude); 
          Log.d("test on background======",""+latLngs.get(0)+"======"+conuter); 
          final PolylineOptions polyLineOptions = new PolylineOptions(); 
          polyLineOptions.addAll(latLngs); 
          polyLineOptions.width(15-i-i); 
          polyLineOptions.color(color[i]); 
          float[] result1 = new float[3]; 


          android.location.Location.distanceBetween(latLngs.get(0).latitude,latLngs.get(0).longitude, latLngs.get(latLngs.size()-1).latitude, latLngs.get(latLngs.size()-1).longitude, result1); 
          Float distance1 = result1[0]; 
          totalDistance=totalDistance+distance1; 
    //      final MarkerOptions markerOptions=new MarkerOptions().position(latLngs.get(0)).title(arrayList.get(conuter)+"==distance between this road is "+ distance1/1000 + " Km"); 
    //      final MarkerOptions lastMarkerOptions=new MarkerOptions().position(latLngs.get(latLngs.size()-1)).title(arrayList.get(conuter)+"==distance between this road is "+distance1/1000+ " Km"); 
          runOnUiThread(new Runnable() { 

            @Override 
            public void run() { 
             // TODO Auto-generated method stub 
              /*googleMap.addMarker(markerOptions); 
              googleMap.addMarker(lastMarkerOptions);*/ 
              googleMap.addPolyline(polyLineOptions); 
              if (i>2) {                                                
               i=0; 
              } 
              i++; 

            } 
           }); 
          if (conuter>3000) { 
           break; 
          } 
          conuter++; 

         } 
+0

非常感谢,我有机会试试看。但是只是另一个问题,所以我创建这个新线程并在我想绘制多段线时执行它? – khai

0

试一下这个::

GoogleMap mMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap(); 

List<Polyline> mPolylines = new ArrayList<Polyline>(); 
// Add polylines to the map and the list 
mPolylines.add(mMap.addPolyline(polyOpts)); 
... 
mPolylines.add(mMap.addPolyline(polyOpts)); 


mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
    @Override 
    public void onMapClick(LatLng clickCoords) { 
     for (PolylineOptions polyline : mPolylines) { 
      for (LatLng polyCoords : polyline.getPoints()) { 
       float[] results = new float[1]; 
       Location.distanceBetween(clickCoords.latitude, clickCoords.longitude, 
         polyCoords.latitude, polyCoords.longitude, results); 

       if (results[0] < 100) { 
        polyline.setVisible(false); 
        Log.e(TAG, "Found @ "+clickCoords.latitude+" "+clickCoords.longitude); 
        return; 
       } 
      } 
     } 
    } 
}); 
+0

感谢您的回答,但我已经尝试了您的做法,而这正是我现在仍然面临的问题(在地图上绘制数据时缓慢/挂起/停止)。 – khai

+0

这可能是您的手机问题检查另一个设备......... – vijay

+0

我已经在7个不同的设备,Note2,Note3,三星平板电脑,nexus,中国品牌手机等测试它们。他们都有同样的问题,所以我确信这不是我的设备问题。 – khai