Как уменьшить использование памяти приложения, которое содержит веб-просмотр и медиаплеер? - PullRequest
0 голосов
/ 20 октября 2018

Я создаю приложение, которое содержит 1 WebView и имеет функцию потокового видео.Парни, которые имеют опыт работы с любым из этих двух, знают, что, если вы испортили хотя бы только WebView или MediaPlayer, обнаружатся утечки памяти и следующая головная боль.

Иногда мое приложениеЯ не могу воспроизвести видео из-за, я думаю, OutOfMemoryException.Поэтому я попытался запустить свое приложение на устройстве, а затем посмотрел на профилировщик.Я обнаружил, что приложение использует более 50 МБ памяти только для одного изображения.Профилировщик говорит, что приложение использует: 7 МБ для Java, 7,1 МБ для нативной, 50,6 МБ для графики, 5 МБ для стека, 25,9 МБ для кода и 1,9 МБ для других.

Я уже много занимался утечкой памяти для приложения.Я уже использовал 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 минут, я воспроизводю видео с заставкой на 70 Мб, которое зацикливается, пока пользователь не нажмет любую кнопку на пульте дистанционного управления..

Я уже не представляю, как уменьшить использование памяти приложением.И по причинам, я должен заставить приложение работать на устройстве с 700 МБ + оперативной памяти, которая получила 150 МБ +, остающейся, когда приложение работает.Любое предложение приветствуется.

...