在我的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);
}
}
}
我不知道要解决这个问题,请帮助我。
答案 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>
,以确保您不会两次添加指定地点。