Webview第一次加载失败

17

我遇到了一个奇怪的问题。我试图加载一个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,但第一次加载仍然无法完成。

谢谢


4
你有解决这个问题的方法吗?我也遇到了同样的问题。 - amit singh
3
这里也一样,第一次不起作用... - David_Wang
3
你解决了这个问题吗?我也遇到了同样的情况。 - Sagar Maiyad
2
@Esdras,有没有任何答案解决了这个问题? - André Herculano
面对相同的问题,这真是一场噩梦。 - Nouman Ch
4个回答

3

我遇到了同样的问题。我花费了三天以上的时间,找到了原因,是另一个WebView对象调用了pauseTimers()函数来节省一些CPU性能,实际上这个函数“暂停所有WebView的布局、解析和JavaScript计时器”。


谢谢老铁救了我一命,整整一天都在调试 : | - droida
3
什么是解决方案? - Ahmed Elsayed

2

因为您在Webview中加载了一个https URL,这将导致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);

编辑:如果您想为Webview启用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;
}

没起作用 =/。我意识到URL从其他服务器加载CSS和JS(jquery来自code.jquery.com),以及从fonts.google.com加载字体。这两个文件都使用https协议请求。我将尝试将这两个文件添加到我的服务器并再次测试。你有其他想法吗? - Esdras

-1
你在 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);
                }
            }

        });

是的,我已经添加了这个权限。我添加了Chrome客户端,但每次第一次进度都会停在10%。 - Esdras
1
如果他没有获得权限设置,它甚至在60秒后也无法加载... - der_michael

-1

我通过在函数onPageFinished(WebView view,String url)中添加Web视图来解决相同的问题,在它完成加载之后。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接