地图

时间:2016-02-13 09:46:07

标签: android google-maps bitmap android-memory

在我的Android应用程序中,我每隔10秒调用一次服务器请求,并使用标记更新结果(创建位图,我的标记有图像和文本)。我使用Android map utils library来创建我的布局的位图,这工作正常,但是我的力量在一段时间后因内存不足而关闭。

Note:
My marker has image and text like a layout.
its updates with dynamic result by every 10 seconds.

我使用了library

中的两个主要课程

1。BubbleDrawable 2。IconGenerator,我使用这两个类来创建布局的位图。

在我的地图活动中,我每隔10秒调用一次库,并使用自定义标记刷新地图。

代码:

public class MainActivity extends Activity{

 private IconGenerator  icGen ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         icGen = new IconGenerator(this);
         serverResponse(); // this method call every 10 seconds
    } // onCreate ends here.

    void updateResult(String placeName){
         markerPin = googleMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(icGen.makeIcon(placeName))) // dynamic name 
             .position(markerLatLng).anchor(0.5f, 1.0f)); // I got out of memory exception here
        ....
        googleMap.addMarker(markerPin);     
    }

    void serverResponse(){
        JSONArray arr = new JSONArray(serverResponse);
        for(int i=0;i<all.length();i++){
          name = arr.getJSONObject.getStrig(name);
          updateResult(name);
        }
    }
}

我不知道要解决这个问题,请帮助我。

1 个答案:

答案 0 :(得分:2)

来自评论:

  

我会说你的OutOfMemory是由保留大量的   地图中的标记。你真的不需要维护所有的标记   在你的地图中(它会破坏性能),你只需要展示   可见的。因此,您可以删除所有标记   (map.clear())并在onCameraChange事件中添加可见的。至   为此,您需要维护一个存储位置的结构   您从服务中下载并检查地点是否在   可见视口。

以下是每次相机更改时清除地图并添加所有可见标记的示例(我只显示相关代码。请注意它没有经过测试):

public class MainActivity extends Activity implements GoogleMap.OnCameraChangeListener, GoogleMap.OnMapReadyCallback {
    private GoogleMap googleMap;
    private List<Place> places = new ArrayList<>();

    // ...

    void serverResponse() {
        JSONArray arr = new JSONArray(serverResponse);
        for (int i = 0; i < all.length(); i++) {
            name = arr.getJSONObject.getStrig(name);

            // TODO: Get the LatLong

            // Add a new Place to the list 
            places.add(new Place(name, latLng));
        }
    }

    @Override
    public void onCameraChange(final CameraPosition cameraPosition) {
        // Clear the map to avoid keeping tons of markers
        googleMap.clear();

        // Find the current visible region
        final LatLngBounds bounds = googleMap.getProjection()
                .getVisibleRegion().latLngBounds;

        // Draw the visible markers
        for (Place place : places) {
            if (bounds.contains(place.getLatLng())) {
                googleMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(icGen.makeIcon(place.getName())))
                        .position(place.getLatLng()).anchor(0.5f, 1.0f));
            }
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        this.googleMap = googleMap;
        googleMap.setOnCameraChangeListener(this);
    }

    private class Place {
        private String name;
        private LatLng latLng;

        public Place(String name, LatLng latLng) {
            this.name = name;
            this.latLng = latLng;
        }

        public String getName() {
            return name;
        }

        public void setName(final String name) {
            this.name = name;
        }

        public LatLng getLatLng() {
            return latLng;
        }

        public void setLatLng(final LatLng latLng) {
            this.latLng = latLng;
        }
    }
}

也许您需要改进代码,将List<Place>更改为Map<String, Place>,以确保您不会两次添加指定地点。