Android的GoogleMap的内存不足。内存不足、Android、GoogleMap

2023-09-06 06:28:27 作者:鹿晗乃我天

我与GoogleMap的API的Andr​​oid应用程序,并在覆盖得出一些16x16的PNG(约200计)。当我移动或放大的/在图形页面,内存不足的错误发生非常频繁。

I made an android application with googlemap api, and draw some 16x16 png (about 200 count) on overlay. When I move or zoom on/in mapview, "out of memory" error occurs very often.

我也用在我的HTC本身的GoogleMap的器件的应用。它采用14 + MB memmory,并从未发生内存不足。

I also used the googlemap appication in my htc itself. Seams that it uses about 14+MB memmory, and never happens "out of memory".

如何保存memmory使用在GoogleMap的API或如何扩大Android的API memmory限制。

How to save memmory usage in a googlemap api, or how to enlarge android api memmory limit.

非常感谢!

推荐答案

我自己的解决方案:捕获的OutOfMemoryError时zoomin / zoomout,将prevent API由VM被杀死。因为它通常死做地图缩放时,转换后。

My own solution: Catching OutOfMemoryError when zoomin/zoomout, will prevent api to be killed by VM. Because it dies usually when doing map zoom after a translation.

    mapView.setBuiltInZoomControls(true);  
    ZoomButtonsController zoomctrl = mapView.getZoomButtonsController(); 
    zoomctrl.setAutoDismissed(false);//自动隐藏关闭
    zoomctrl.setVisible(true);
    zoomctrl.setOnZoomListener(new ZoomButtonsController.OnZoomListener() {

        public void onZoom(boolean zoomIn) {
            // TODO Auto-generated method stub
            try{
                Log.i(TAG, "OnZoomListener");
                System.gc();
                if(zoomIn)
                {                       
                    mc.zoomIn();
                }
                else
                {
                    mc.zoomOut();
                }
                System.gc();
            }
            catch(OutOfMemoryError e)
            {
                e.printStackTrace();
                Log.e(TAG, e.toString());
                Toast.makeText(GoogleMap.this, e.toString(), Toast.LENGTH_LONG);
            }
            catch (Exception e)
            {
                Log.w(TAG, e.toString());
                Toast.makeText(GoogleMap.this, e.toString(), Toast.LENGTH_LONG);
            }               
        }

        public void onVisibilityChanged(boolean visible) {
            // TODO Auto-generated method stub

        }
    });

    private boolean myDoubleTouch(float x, float y, MapView mapView)
    {
    Log.i(mParent.TAG, "myDoubleTouch: " + x +","+y);
    try
    {
        mapView.getController().zoomInFixing((int)x, (int)y);
    }
    catch(OutOfMemoryError e)
    {
        System.gc();
        e.printStackTrace();
        Log.e(mParent.TAG, e.toString());
        Toast.makeText(m_mapview.getContext(), e.toString(), Toast.LENGTH_LONG);
    }
    catch (Exception e)
    {
        Log.w(mParent.TAG, e.toString());
        Toast.makeText(m_mapview.getContext(), e.toString(), Toast.LENGTH_LONG);
    }           

    return true;
}
 
精彩推荐
图片推荐