这个谷歌地图片段中没有被解除分配的是什么?

时间:2015-03-11 11:12:10

标签: android google-maps android-fragments

我有一个应用程序,在内存方面相当密集,我试图尽我所能。我已经注意到了一些我无法解决的问题,谷歌地图即使在(我认为)摆脱它之后也会保留其内存分配。

在调用Google地图之前: Before GoogleMaps is called

调用Google地图后: After Google Maps is called

使用后退按钮从Google地图返回 enter image description here

使用信息窗口按下按钮退回谷歌地图 (稍微高一点的数字只是因为我提供了一些方法,包括一个标记返回) enter image description here

正如您所看到的,它保留了大量内存。所以我将向您展示这是如何运作的:

实际上并未调用Google地图,但谷歌地图的容器是,它位于以下位置:

public class GoogleMapsAndBookmarksContainer extends ActionBarActivity {

private FragmentTabHost mTabHost;
public ArrayList frameListContainer;
public HashMap<String, HashMap> bookmarkInfo;

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

    frameListContainer = (ArrayList) getIntent().getSerializableExtra("arrayListWithFrameAttributes");
    bookmarkInfo = (HashMap) getIntent().getSerializableExtra("hashmapWithBookmarks");

    mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
    mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent);

// The first tab is the google maps fragment which i'll include below

    mTabHost.addTab(
            mTabHost.newTabSpec("tab1").setIndicator("Google Maps", null),
            GoogleMapsFragment.class, null);

    mTabHost.addTab(
            mTabHost.newTabSpec("tab2").setIndicator("Bookmarks", null),
            BookmarksFragment.class, null);

}

@Override
protected void onDestroy() {
    super.onDestroy();
     /// **** THIS WAS JUST ADDED A LOSS FOR WHAT IT COULD BE RETAINING ****
    mTabHost = null;
    frameListContainer = null;
    bookmarkInfo = null;
}

// access for fragments
public HashMap getBookmarkInfo(){
    return bookmarkInfo;
}

public ArrayList getFrameAttributesArrayList(){
    return frameListContainer;
}
}

我设法从班级中删除了所有内容,但仍然存在问题:

公共类GoogleMapsFragment扩展了Fragment {

private GoogleMap map;
private SupportMapFragment mapFragment;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_google_maps, container, false);
    FragmentManager fm = getChildFragmentManager();

    mapFragment = (SupportMapFragment) fm.findFragmentById(R.id.map);
    mapFragment.getMapAsync(new OnMapReadyCallback() {
        public void onMapReady(GoogleMap googleMap) {
            map = googleMap;
            initMap();
        }
    });
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
//        frameListContainer = ((GoogleMapsAndBookmarksContainer) this.getActivity()).getFrameAttributesArrayList();
//        bookmarkInfo = ((GoogleMapsAndBookmarksContainer) this.getActivity()).getBookmarkInfo();
//        markerToFrameAndRoute = new HashMap<Marker, String[]>();
}




@Override
public void onDestroy() {
    super.onDestroy();
    mapFragment = null;
    System.gc();
    map = null; // I did add this in an edit, but it was mistakenly taken away when I was cutting it up, sorry
}
}

那么,这可以解决吗?我无法解决它保留的问题。我确实注意到如果我继续回到谷歌地图上并关闭它,它就是垃圾收集它,所以它不是内存泄漏。

编辑:尝试过map.clear();仍保留记忆

2 个答案:

答案 0 :(得分:3)

Just clear map 

@Override
public void onDestroy() {
    super.onDestroy();
    map.clear();
}

答案 1 :(得分:0)

此问题的一个可能的解决方案可能是使用setRetainInstance(boolean retain)使用保留的片段。在这个过程中,地图片段不会破坏并重新创建自己转储大量内存,而是在需要时保留内存,当你来回切换地图片段时(按后退按钮)。

public class RetainMapActivity extends FragmentActivity {

private GoogleMap mMap;

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

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);

    if (savedInstanceState == null) {
        // First incarnation of this activity.
        mapFragment.setRetainInstance(true);
    } else {
        // Reincarnated activity. The obtained map is the same map instance in the previous
        // activity life cycle. There is no need to reinitialize it.
        mMap = mapFragment.getMap();
    }
    setUpMapIfNeeded();
}

@Override
protected void onResume() {
    super.onResume();
    setUpMapIfNeeded();
}

private void setUpMapIfNeeded() {
    if (mMap == null) {
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        if (mMap != null) {
            setUpMap();
        }
    }
}

private void setUpMap() {
    mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
}

另一个解决方案可能是使用Otto event bus,它旨在解耦应用程序的不同部分,同时仍然允许它们有效地进行通信。

希望这有助于!!