Веб-просмотр не загружается в первый раз

Я борюсь со странной проблемой. Я пытаюсь загрузить https-страницу, но в первый раз веб-просмотр не загружается. После ожидания 60 секунд, я должен нажать еще раз на моей кнопке, чтобы загрузить мою страницу. Мое устройство - Nexus 4 с Lollipop, но эта проблема возникает и на устройствах с Android 4.4 и 4.1. URL-адрес не содержит тяжелого содержимого только нескольких файлов javascript и файлов css.

Журнал:

 I/WebViewFactory﹕ Loading com.google.android.webview version 37 (1602158-arm) (code 111201)
 I/LibraryLoader﹕ Loading: webviewchromium
 I/LibraryLoader﹕ Time to load native libraries: 3 ms (timestamps 5331-5334)
 I/LibraryLoader﹕ Expected native library version number "",actual native library version number ""
 I/LibraryLoader﹕ Expected native library version number "",actual native library version number ""
 I/chromium﹕ [INFO:library_loader_hooks.cc(106)] Chromium logging enabled: level = 0, default verbosity = 0
 I/BrowserStartupController﹕ Initializing chromium process, renderers=0
 W/art﹕ Attempt to remove local handle scope entry from IRT, ignoring
 W/chromium﹕ [WARNING:resource_bundle.cc(315)] locale_file_path.empty()
 I/chromium﹕ [INFO:aw_browser_main_parts.cc(63)] Load from apk succesful, fd=72 off=159196 len=3264
 I/chromium﹕ [INFO:aw_browser_main_parts.cc(78)] Loading webviewchromium.pak from, fd:73 off:229484 len:643667
 W/AudioManagerAndroid﹕ Requires BLUETOOTH permission
 W/chromium﹕ [WARNING:proxy_service.cc(901)] PAC support disabled because there is no system implementation
 W/chromium﹕ [WARNING:data_reduction_proxy_settings.cc(403)] SPDY proxy OFF at startup
 W/art﹕ Attempt to remove local handle scope entry from IRT, ignoring
 W/AwContents﹕ onDetachedFromWindow called when already detached. Ignoring
 I/chromium﹕ [INFO:SkUtilsArm.cpp(179)] Device supports ARM NEON instructions!

Мой код:

final WebView wv = (WebView) alert.findViewById(R.id.modal_wv);

    wv.getSettings().setAppCacheEnabled(true);
    wv.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
    wv.getSettings().setAppCachePath("/data/data/" + getPackageName() + "/cache");
    wv.getSettings().setAllowFileAccess(true);
    wv.getSettings().setJavaScriptEnabled(true);
    wv.loadUrl(connectionResponse.getUrl());
/*
//Same behavior ...
    wv.post(new Runnable() {
        @Override
        public void run() {
            wv.loadUrl(connectionResponse.getUrl());
        }
    });
*/

Я установил новый WebClient(), переопределяя следующие методы: shouldOverrideUrlLoading, onLoadResource, onPageFinished. Для целей тестирования я удалил этот настраиваемый WebClient, но он все еще не был загружен в первый раз.

Спасибо

Ответ 1

Я встретил ту же проблему. Я потратил более 3 дней и нашел причину того, что другой объект WebView вызывает pauseTimers() для сохранения некоторой производительности ЦП, которая фактически "приостанавливает весь макет, синтаксический анализ и таймеры JavaScript для всех WebView".

Ответ 2

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

myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {
            Toast.makeText(MainActivity.this, description,
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onReceivedSslError(WebView view,
                SslErrorHandler handler, SslError error) {
            // TODO Auto-generated method stub
            // this method will proceed your url however if certification issues are there or not
            handler.proceed();
        }

    });
myWebView.loadUrl(url);

EDIT:, если вы хотите включить интерфейс javascript для своего веб-просмотра выполните следующую процедуру.

private JavascriptInterface jsInterface;


engine.getSettings().setJavaScriptEnabled(true);
        jsInterface = new JavascriptInterface();
        try {
            ComponentName comp = new ComponentName(this, Dashboard.class);
            PackageInfo pinfo = getPackageManager().getPackageInfo(comp.getPackageName(), 0);
            jsInterface.versionCode = pinfo.versionCode;
            } catch (android.content.pm.PackageManager.NameNotFoundException e) {
            }
            engine.addJavascriptInterface(jsInterface, "androidlearnscripture");
                            engine.requestFocus(View.FOCUS_DOWN);
        }

И код javascript пойдет здесь

    public void onPageStarted(WebView view, String url,Bitmap favicon) {
            jsInterface.enablePreferencesMenu = false;
            jsInterface.modalIsVisible = false;
            jsInterface.urlForSharing = null;
            bLoadingFinished = false;
}

Ответ 3

Я решил такую ​​же проблему, добавив webview в макет из функции onPageFinished(WebView view, String url) после того, как он закончил загрузку.

Ответ 4

Вы объявили интернет-разрешение в androidmanifest.xml?

<manifest...>
.. .
<uses-permission android:name="android.permission.INTERNET" />
..
</manifest>

также попробуйте установить клиент webview.

          //default browser
          wv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                L.log(url);
                return super.shouldOverrideUrlLoading(view, url);
            }
        });
        //chrome browser
        wv.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress)
            {
                progressBar.setProgress(progress);
                if (progress == 100) {
                    progressBar.setVisibility(View.GONE);
                }
            }

        });