如何减少包含Webview和Mediaplayer的应用程序的内存使用量?

时间:2018-10-20 07:57:52

标签: android android-webview android-mediaplayer

我正在创建一个包含1个WebView并具有视频流功能的应用程序。对于两个人都有经验的人都知道,即​​使您只是搞混了WebViewMediaPlayer,也会出现内存泄漏,接下来是头痛。

有时候,我的应用因为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 +。任何建议表示赞赏。

0 个答案:

没有答案