Я создаю приложение, которое содержит 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 МБ +, остающейся, когда приложение работает.Любое предложение приветствуется.