【问题标题】:Webview not loading at first timeWebview第一次没有加载
【发布时间】:2015-03-25 14:33:45
【问题描述】:

我正在与一个奇怪的问题作斗争。我正在尝试加载 https 网页,但第一次没有加载 webview。等待 60 秒后,我必须再次单击按钮来加载我的页面。我的设备是带有 Lollipop 的 Nexus 4,但这个问题也发生在带有 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,但它仍然没有在第一次加载。

谢谢

【问题讨论】:

  • 你有解决这个问题的办法,因为我也面临同样的问题。
  • 这里一样,第一次不工作...
  • 你解决了这个问题吗?我也面临同样的事情。
  • @Esdras 是否有任何答案解决了这个问题?
  • 面临同样的问题,这是地狱

标签: android webview https


【解决方案1】:

在完成加载后,我通过将 webview 从函数 onPageFinished(WebView view, String url) 添加到布局中解决了同样的问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢老兄救了我的命 :) 经过一整天的调试:|
    • 解决办法是什么?
    【解决方案3】:

    由于你在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(来自 code.jquery.com 的 jquery)和来自 fonts.google.com 的字体。这两个文件都是使用 https 协议请求的。我将尝试在我的服务器中添加这两个文件并再次测试。你还有什么想法吗?
    【解决方案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);
                    }
                }
    
            });
    

    【讨论】:

    • 是的,我已经添加了这个权限。我添加了 Chrome 客户端,并且总是在第一次时进度停止在 10%
    • 如果他没有设置权限,它永远不会加载...即使在 60 秒后...
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多