我正在创建一个包含1个WebView
并具有视频流功能的应用程序。对于两个人都有经验的人都知道,即使您只是搞混了WebView
或MediaPlayer
,也会出现内存泄漏,接下来是头痛。
有时候,我的应用因为OutOfMemoryException
而无法播放任何视频。因此,我尝试在设备上运行我的应用程序,然后查看了探查器。我发现该应用程序仅用于图像就使用50 mb以上的内存。探查器说,该应用使用:Java占7mb,本机占7.1mb,图形占50.6mb,堆栈占0.5 mb,代码占25.9mb,其他占1.9mb。
我已经为该应用程序做了很多内存泄漏处理。我已经使用过NonLeakingWebView
和把WebView
放在FrameLayout
内的技巧。另外,我已经通过执行以下代码来完成VideoView
内存泄漏的修复。
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(AudioServiceContext.getContext(newBase));
}
在视频播放完成或用户停止播放视频时,请执行以下代码。
if(player != null) {
if (player.isPlaying()) {
player.stop();
}
player.reset();
player.release();
player = null;
}
我正在使用此WebSettings
。
WebSettings settings = webMain.getSettings();
settings.setJavaScriptEnabled(true);
settings.setLoadWithOverviewMode(true);
settings.setSupportZoom(false);
settings.setBuiltInZoomControls(false);
settings.setPluginState(android.webkit.WebSettings.PluginState.ON_DEMAND);
settings.setDatabaseEnabled(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
settings.setRenderPriority(WebSettings.RenderPriority.HIGH);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setDomStorageEnabled(false);
settings.setUseWideViewPort(true);
settings.setAllowFileAccess(true);
settings.setAppCacheEnabled(true);
settings.setAppCachePath(appCachePath);
settings.setAppCacheMaxSize(availMemInBytes * 4);
我已经使用android:largeHeap="true"
来使我的应用获得更多的内存,但是设备的内存确实非常有限。我仍然不明白如何使变量成为弱引用。
此外,当应用程序闲置5分钟时,我会播放一个70mb的屏幕保护程序视频,该视频一直循环播放,直到用户按下遥控器上的任何按钮为止。
我已经不知道如何减少应用程序的内存使用量。并且由于种种原因,我需要使该应用程序在700mb + RAM的设备上运行,并且在运行该应用程序时剩余150mb +。任何建议表示赞赏。