Производительность Android WebView

В моем приложении я загружаю список внешнего url в webview и позволяю пользователю перелистывать их. Веб-просмотры загружаются на флиппер просмотра. Я считаю, что производительность очень плохо в URL-адресе загрузки webview. Я попробовал все от использования рамки, чтобы ограничить количество загружаемых веб-просмотров. Тем не менее производительность не является удовлетворительной.

Как оптимизировать производительность webview? Это должно быть обычным явлением. Я пропустил что-то очевидное.

Настройки моего веб-представления -

    webView.setInitialScale(WEBVIEW_SCALE);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(false);
    webView.setWebViewClient(new MyWebViewClient());    
    webView.setOnTouchListener( new OnTouchListener());

Ответ 1

Попробуйте следующее:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
} else {
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Ответ 2

Я думаю, что лучше всего работает следующее:

if (Build.VERSION.SDK_INT >= 19) {
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}       
else {
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Android 19 имеет движок Chromium для WebView. Я думаю, он работает лучше с аппаратным ускорением.

Для получения дополнительной информации Android 4.4 KitKat, браузер и веб-браузер Chrome

Ответ 3

Это уже обсуждалось здесь: Повысить производительность веб-браузера (должна быть такая же производительность, что и собственный веб-браузер)

У меня возникла аналогичная проблема, и после некоторой тяжелой отладки заметили родной браузер и браузер WebView, похоже, используют разные кеши.

Этот код можно использовать для отключения кэша WebView и сделал WebView гораздо быстрее для меня (хотя за счет не кэширования). Обратите внимание, что он использует частные API-интерфейсы, поэтому, используя это, вы рискуете, что код будет перерыв в будущих выпусках:

try
{
  Method m = CacheManager.class.getDeclaredMethod("setCacheDisabled", boolean.class);
  m.setAccessible(true);
  m.invoke(null, true);
}
catch (Throwable e)
{
  Log.i("myapp","Reflection failed", e);
}