Android: WebView повышает скорость загрузки локальных файлов html

Есть ли способ повысить скорость загрузки локального файла .html в WebView. Файлы .html хранятся в папке /assets.

Как вы можете видеть на видео (извините, ссылка сломана!), TextView (red beackground) отображается до начала транзистора, а текст в WebView отображается после этого. Как я могу достичь загрузки WebView так же быстро, как TextView?

//current implementation
webView.setInitialScale(1);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setScrollbarFadingEnabled(false);

webView.loadUrl("file:///android_asset/disclaimer.html");

СУЩНОСТЬ

Это невозможно. Я пробовал все комментарии здесь, и это не имело никакого значения.

Я спрашиваю, что у нас было приложение для iOS и Android, которое в основном состоит из простых TextViews и Images. Поэтому у нас возникла идея создания локальных html файлов, которые мы могли бы использовать в обоих приложениях. В iOS это работает как шарм, но в Android мы не могли избавиться от времени загрузки, поэтому у меня всегда был пустой экран, и через 100-200 м. Появился контент.

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

Теперь мы действительно сейчас, почему телефонная связь и сосание.

Только для записи: В конце я использовал операцию с пустым контейнером LinearLayout, где вы могли вставлять содержимое программно. Каждый стиль (Headline 1, Headline 2, Content...) имел собственный XML файл макета

public void insertHeadline(int id){

    String text = getString(id);
    TextView headline = (TextView) inflater.inflate(R.layout.layout_text_headline, null, false);
    headline.setText(text);

    //add this TextView to the empty container
    myLinearLayoutContainerView.addView(headline);

}

Ответ 1

Веб-просмотр никогда не может отображаться так быстро, как текстовое представление (если вы действительно не злоупотребляете текстовым видом, например, загружаете тысячи строк текста) независимо от того, сколько переключателей вы включаете/выключаете и сколько оптимизаций и настроек вы пытаетесь сделать. Механизм рендеринга поддерживает текстовое представление, потому что он более ограничен в том, как вы можете указать изменения в его нормальном представлении, поскольку веб-просмотр может загружать внешние ресурсы, поскольку css модифицирует представление, потому что javascript может влиять на презентацию, потому что ему требуется больше памяти и инициализации для поддержки все эти функции,...

Это причина, по которой приложение phonegap/cordova никогда не может быть столь же быстрым и интерактивным, как родное приложение. Ну, если родное приложение создано только из веб-просмотров: P

Вы по-прежнему можете попытаться улучшить время загрузки/рендеринга веб-просмотра, изменив его конфигурацию, но вам лучше подождать, пока не будет определен ваш контент. Все эти настройки, позволяющие улучшить при определенных обстоятельствах и, например, изменение типа слоя, могут помочь или ухудшить время рендеринга для разных страниц. Как упоминал Нирмал в своем ответе, некоторые из тех, кто, как известно, оказывают большее влияние, это layerType, cacheMode и renderPriority

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

По моему опыту, способ, которым вы реализовали свой переход, - это лучший пользовательский интерфейс, и я подожду, пока вы не определите свой контент html, прежде чем пытаться оптимизировать время загрузки.

Если вы уже обнаружите, что текущий опыт уже раздражает, я бы подумал о том, чтобы удалить все html-контент/веб-страницы.

Ответ 2

Это зависит от загружаемого веб-приложения. Попробуйте следующие подходы:

Установить более высокий приоритет рендеринга (устаревший от API 18 +):

webview.getSettings().setRenderPriority(RenderPriority.HIGH);

Включение/выключение аппаратного ускорения:

if (Build.VERSION.SDK_INT >= 19) {
// chromium, enable hardware acceleration
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
   // older android version, disable hardware acceleration
   webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Отключить кеш:

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

Ответ 3

WebView всегда будет иметь больше времени визуализации, чем собственный TextView. Я думаю, что это характер платформы, но, возможно, вы можете попробовать прочитать содержимое html на String перед загрузкой экрана (чтобы избежать веб-просмотра из работы файловой системы). Затем установите String с помощью:

webview.loadDataWithBaseURL("", earlyReadedHtmlString, "text/html", "UTF-8", "");

Теоретически это должно быть более быстрым и справедливым для веб-просмотра. Другой способ ждет onPageFinished(), а затем show textview. Это может быть обходной путь.

Ответ 4

Активы медленны для доступа, поскольку они содержатся в файле apk, который по существу является прославленным zip файлом.

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

Как только вы извлекли их из активов apk, они намного быстрее доступны.