Журнал ‹GATE-M›DEV_ACTION_COMPLETED‹/GATE-M›, похоже, задерживает выполнение на Android

Недавно я заметил, что в моем приложении время от времени возникают LAG. и под LAG я подразумеваю, что это может занять до 40 секунд, зависит от того, использую ли я Wi-Fi или мобильные данные...

Я загружаю URL-адрес страницы, а затем загружаю js для выполнения:

    webView = (WebView) view.findViewById(R.id.WebView);

    webView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            logDebug("Loading URL: " + url);
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return WrappingClass.this.shouldOverrideUrlLoading(view, url);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
        logInfo("loading JavaScript to webview.");
        webView.loadUrl("full-js-here");

        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            logError("error code:" + errorCode);
            super.onReceivedError(view, errorCode, description, failingUrl);
        }
    });

    WebSettings webSettings = webView.getSettings();
    webSettings.setSavePassword(false);
    webSettings.setSaveFormData(false);
    webSettings.setJavaScriptEnabled(true);
    webView.requestFocus(View.FOCUS_DOWN);
    webView.loadUrl("url");

После вызова URL-адреса загрузки страница отображается в веб-представлении, пользовательский интерфейс реагирует, я могу нажимать кнопки, возвращаться и перемещаться по приложению...

НО

Сценарий, который я пытаюсь запустить, не выполняется до тех пор, пока DEV_ACTION_COMPLETED не будет напечатано в журнале, затем все возвращается в нормальное русло, вызывается onPageFinished и мгновенно запускает сценарий. Проблема в том, что это может занять до 40 секунд.

== ОБНОВЛЕНИЕ ==

Кажется, что задержка растет до какого-то момента, а после этого задержка сокращается до нуля и снова растет... это как последовательность: 0,1,2,4,8,16,32... и затем начинается от 0.

Может быть, это потому, что я создаю новые действия с веб-просмотром за слишком короткое время?

Есть предположения?


person TacB0sS    schedule 01.08.2013    source источник
comment
Попробуйте добавить webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new WebViewClient()); перед webSettings.setJavaScriptEnabled(true);. Также посмотрите на это: stackoverflow. ком/вопросы/5820237/   -  person Vrashabh Irde    schedule 15.08.2013
comment
Попробую через пару часов...   -  person TacB0sS    schedule 15.08.2013


Ответы (1)


Нам удалось набросать решение этой дрянной проблемы... что бы я ни пытался, я не смог найти решение этой проблемы на Java, но мы нашли решение HTML + JavaScript:

Вместо того, чтобы ждать onPageFinish для java, мы вводим java-скрипт для прослушивания события window.onLoad...

и там мы вводим наш реальный JavaScript... работает как шарм...

Подробнее.

person TacB0sS    schedule 19.08.2013
comment
Ваше решение работает хорошо, и я поставил +1 вашему решению. Но я был бы счастливее, если бы смог выяснить основную причину проблемы, поскольку это происходит при выборе URL-адреса. Например, с URL-адресом google.com onPageFinished всегда срабатывает немедленно. С другим URL-адресом, таким как URL-адрес аутентификации linkedIn, onPageFinished не срабатывает при первой загрузке после очистки кеша приложения через настройки. И, наблюдая за переопределением методов webviewclient и web chromeclient, на этой странице не происходит никаких перенаправлений или ошибок. - person mainframe; 30.10.2013
comment
Я думаю, что это связано с загрузкой контента... если бы вы создали простое приложение веб-просмотра и распечатали все обратные вызовы, вы бы заметили, что метод shouldOverride...url() не вызывается для каждой загрузки, он зависит от того, является ли запрос полученным или отправленным, это зависит от того, являются ли это вызовами AJAX, я обнаружил, что для этого есть много причин, а также то, что ChromeClient сообщает то же самое, что и WebViewClient. - person TacB0sS; 30.10.2013