Android Webview замедляет работу устройств Nexus при включенном JavaScript

У меня возникла эта странная проблема на устройствах Nexus, таких как Nexus 4, Galaxy Nexus и Nexus 7. У меня есть браузерное приложение с несколькими вкладками, каждая из которых имеет веб-просмотр.

Если я открою сайт, например Google.com, на нескольких вкладках (2 или более), веб-просмотры не будут получать клики. Также сайты загружаются довольно медленно. Ниже приведены мои настройки веб-просмотра.

    private void doWebSettings(WebView webview) {
        webview.setScrollbarFadingEnabled(true);
        webview.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
        WebSettings webSettings = webview.getSettings();
        webSettings.setJavaScriptEnabled(true);
        // enable smooth transition for better performance during panning or
        // zooming
        if (currentSdk >= OS_3_0) {
            webSettings.setEnableSmoothTransition(true);
        }
        // For Zooming out completely
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setUseWideViewPort(true);
        webSettings.setSupportZoom(true);

        webSettings.setBuiltInZoomControls(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setAllowFileAccess(true);
        try {
            webSettings.setAllowContentAccess(false);
        } catch (NoSuchMethodError e) {
            e.printStackTrace();
        }
        String databasePath = this.getApplicationContext()
                .getDir("database", Context.MODE_PRIVATE).getPath();
        webSettings.setDatabasePath(databasePath);
        webSettings.setGeolocationDatabasePath(this.getApplicationContext()
                .getDir("geolocation", 0).getPath());


        webSettings.setRenderPriority(RenderPriority.HIGH);
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        webSettings.setDatabaseEnabled(true);
        // Dont focus on any webview item by default
        webSettings.setNeedInitialFocus(false);
        if (!isTablet) {
            webSettings
                    .setUserAgentString("Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17");
        }
}

Если я установлю для Javascript значение «False», все веб-просмотры будут работать без сбоев. Эта проблема заметно наблюдается на всех устройствах Nexus, иногда веб-просмотры не принимают клики в течение нескольких минут. Такое поведение делает приложение непригодным для использования. Я предполагаю, что какой-то Javascript использует поток пользовательского интерфейса для веб-просмотра, и это причина его зависания. Я получаю предупреждение в Eclipse для setJavascriptEnabled(true); поскольку «Использование setJavaScriptEnabled может привести к XSS-уязвимостям в вашем приложении, внимательно изучите». Я искал это предупреждение в Интернете, но не нашел подходящего ответа. Также я проверил некоторые сообщения, связанные с людьми, столкнувшимися с проблемами производительности Webview на Jellybean. Что мне здесь не хватает?


person Alok Kulkarni    schedule 02.07.2013    source источник


Ответы (1)


Виновника нашли.

webview.freeMemory() 

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

person Alok Kulkarni    schedule 19.07.2013