1

我在文本文件中有一组点,我想在地图上绘制(API v2)并画一条线。每个点都是一个<Lat, Lng>,在文本文件中总共有 7253 个这样的点。代码如下:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_my_route_mock);

        //Step 0. Get google map instance.
        map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

        if(map == null) {
            Toast.makeText(getApplicationContext(), "Map is not available.", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplicationContext(), "Map is available.", Toast.LENGTH_LONG).show();
        }

        //Step 0.a. Load a type of map.
        map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);

        //Step 0.b. Load your current location on the map.
        map.setMyLocationEnabled(true);
        if(po == null) {
            po = new PolylineOptions();
        }
        //Toast.makeText(getApplicationContext(), "Location lat = " + loc.getLatitude() + " and longitude = " + loc.getLongitude(), Toast.LENGTH_LONG).show();

        //Step 1. Set GPS to service provider.
        locMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
        mocLocProvider = locMgr.GPS_PROVIDER;
        locMgr.addTestProvider(mocLocProvider, false, false, true, false, true, false, false, 0, 5);
        locMgr.setTestProviderEnabled(mocLocProvider, true);
        //locMgr.requestLocationUpdates(mocLocProvider, 0, 0, locLstnr);

        //Step 2. Open file for reading from.
        try {
            is = getAssets().open("locationLogs.txt");
            br = new BufferedReader(new InputStreamReader(is));
            String line = null;
            try {
                line = br.readLine();
                while(line != null) {
                //while((line = br.readLine()) != null) {
                    //there is still a line in the file. parse for gps coordinates etc.
                    Location l = new Location(LocationManager.GPS_PROVIDER);
                    String[] details = line.split(",");  //the array will contain date, time, lat, long, speed, altitude and accuracy.
                    l.setTime(System.currentTimeMillis());
                    l.setLatitude(Double.parseDouble(details[2]));
                    l.setLongitude(Double.parseDouble(details[3]));
                    l.setSpeed((float) Double.parseDouble(details[4]));
                    l.setAltitude(Double.parseDouble(details[5]));
                    l.setAccuracy((float) Double.parseDouble(details[6]));
                    //Toast.makeText(getApplicationContext(), l.getLatitude() + "," + l.getLongitude() + "," + l.getSpeed() + "," + l.getAltitude() + "," + l.getAccuracy() + "\n", Toast.LENGTH_SHORT).show();
                    locMgr.setTestProviderLocation(mocLocProvider, l);
                    po.add(new LatLng(l.getLatitude(), l.getLongitude()));
                    Log.v(this.toString(), "Number of po objects = " + po.getPoints().size());
                    //pl = map.addPolyline(po);
                    //Log.v(this.toString(), "number of polyline objects added = " + pl.getPoints().size());
                    line = br.readLine();
                }
            } catch(FileNotFoundException e) {
                Log.v(this.toString(), "File not found.");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Log.v(this.toString(), "Cannot open file for reading from.");
        }
}

在读取大约 1300 点后,应用程序崩溃并出现OutOfMemory异常。尽管在 Google Maps API v2 上有大量线程处理内存泄漏,但对 MAT 进行更仔细的分析后发现:pl = map.addPolyline(po)是罪魁祸首,占用了大部分内存。事实证明这是真的,因为在注释掉该行之后,上述代码的内存占用非常小~8MB,大约读取了 7k 点。

我的问题: 1.使用对象在地图上绘制
的方式有什么问题吗?Polylines每次更新一次?
2. 如果是这样,怎样才能画出一条不占用太多内存的线?使用Canvas等或仅在一定数量的点(例如10个左右)之后画一条线?
3. 一些在他们的应用程序中使用过 Maps API v2 的开发人员可能会了解一些正确的方法来做到这一点?

4

1 回答 1

1

在循环之后调用pl = map.addPolyline(po);以创建一条折线,而不是尝试创建 7000 条折线,每条折线都比之前的“长一点”。

于 2013-06-02T13:08:12.393 回答