【问题标题】:WebView loadUrl works only onceWebView loadUrl 只工作一次
【发布时间】:2012-12-26 02:30:16
【问题描述】:

编辑:我几年前参与过这个项目,不幸的是我无法验证任何答案是否在给定的场景中有效。

我很难使用一个应该显示我们博客的 WebView。初始化后,它工作得很好。用户可以导航到 WebView 中的不同链接。回到博客,WebView 外面有一个按钮,它应该再次加载主博客站点。

问题是,在第二次调用 loadUrl 之后没有加载任何内容。这是我的代码:

private WebView wv;

        @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

            this.setContentView(R.layout.blog);

    wv = (WebView) findViewById(R.id.blog_webview);
    wv.getSettings().setJavaScriptEnabled(true);
    wv.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon {
            MyLog.logDump("onPageStarted: " + url);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
                            MyLog.logDump("onPageFinished: " + url);
        }
    });

    wv.loadUrl(Constants.BLOG_URL);
}

我的 OnClickListener 调用的函数如下:

    public void reLoadUrl() {
        wv.loadUrl(Constants.BLOG_URL);

}

但是,尽管 onPageFinished 和 onPageStarted 中的日志显示我的 wv.loadUrl 正在被调用并且它正在加载正确的 url,但 webview 本身的内容并没有改变。我尝试清除缓存、历史记录、视图,尝试不同的 WebSettings,尝试使用 webView.goBack() - 没有结果。这些想法也行不通:Strange webview goBack issue in android

有时,reLoadUrl 会显示所需的结果 - 但一旦失败,它就无法再次工作。任何想法可能会发生什么?我确实尝试阅读 WebView 代码,但找不到任何可以帮助我的东西。

我唯一可以补充的是,我们正在使用一些严重依赖 webViews 的广告网络 - 我试图将其关闭,但我没有删除这些库,所以我不确定它们是否没有罪魁祸首。

有什么想法吗??

【问题讨论】:

  • 您的 logcat 中是否收到任何警告?也许是一些 SSL 的东西
  • 虽然这听起来很奇怪,但您可以尝试在wv.loadUrl(..) 之后添加wv.reload()
  • 目前日志中没有错误或警告。 onReceivedError 也没有被触发。在 loadUrl 之后调用 reload 也没有帮助。
  • @Elena hi..你解决了吗?我有完全相同的问题..
  • 我也因为这个问题失去了 2 天的时间。而且仍然没有成功。如果你得到答案,请发布答案

标签: android webview webviewclient


【解决方案1】:

按以下顺序使用exact。

   wv.clearCache(true);
   wv.clearView();
   wv.reload();
   wv.loadUrl("about:blank");
   wv.loadData(Constants.BLOG_URL);

【讨论】:

  • 能否请您在重新加载网址之前检查您的博客网址是否为空。
  • 我确定,它是一个静态常量。
  • 按此链接尝试自定义 webview 客户端并告诉我:stackoverflow.com/questions/16408984/…
  • wv.loadData(Constants.BLOG_URL); 将如何工作?这个方法的其他参数在哪里?
【解决方案2】:

我花了最后一天左右的时间在一个使用 WebView 的应用程序上工作。我在将数据加载到 WebView 时确实遇到了一些问题。

我不完全确定这是否可行,但可能会替换此代码:

public void reLoadUrl() {
    wv.loadUrl(Constants.BLOG_URL);

}

使用此代码:

public void reLoadUrl() {

    wv.clearView();
    wv.loadUrl(Constants.BLOG_URL);

}

也许当你清除 WebView 时它会解决问题

【讨论】:

  • 我确实尝试过,但没有成功。 webview 已清除,但未加载博客 url - 它只是显示一个空白页面。
  • @Elena 您是否尝试过上面在 cmets 调用 wv.reload() 时所说的 harism?奇怪的是,你说它有时会起作用?
  • 我做了,但没有帮助。是的,有时(很少),当我第一次尝试再次加载它时,它可以工作。但几乎从来没有第二次,一旦失败 - 它永远不会再次工作。
  • 嗯,对不起,我无法提供更多帮助。如果在此期间我能想到其他任何事情,我会发布它,否则我希望你能解决它!
  • 自“wv.clearView();”已在 Android v18 上弃用,替换为“ mWebView.loadUrl("about:blank");"
【解决方案3】:

我建议您每次使用 WebView 时都尝试重新创建它,看看是否有什么不同。

首先保存上下文、布局参数和父级。

Context context = wb.getContext();
ViewGroup.LayoutParams lp = wv.getLayoutParams();
ViewGroup parent = (ViewGroup)wv.getParent();

然后停止加载并从其父视图中移除视图。

wv.stopLoading();
parent.removeView(wv);

然后重新创建并添加回来。

wv = new WebView(context);
parent.addView(wv, lp);

这可能是您需要恢复的其他属性,但这是大体思路。

【讨论】:

  • 感谢您的建议。虽然这个解决方案可能会奏效,但重新创建整个 WebView 正是我想要避免的。
  • 那么你可能不走运了。以我的经验,Android 中的 WebViews 有点不可靠。除非每次重新创建 WebView 都会对性能造成巨大影响,否则如果它有效,总比没有好。在某些时候,您只需要继续解决下一个问题即可。
  • 它可以在 JellyBean 之前的设备上运行。但是,一旦我更新到 JellyBean,就会遇到这个问题。就像 Shirish Herwade 说的。我有 onJsAlert 方法被调用。这可能是这个问题的原因,但我真的需要这个。
  • 现在我可以绝对确认问题是由onJsAlert 被调用引起的。一旦我删除警报呼叫,它就可以正常工作。
  • 如果您认为需要覆盖 onJsAlert,请决定是否覆盖 onConsoleMessage 会起作用。然后,重新加载没有问题。在我的例子中,我重写了 onJsAlert 只是为了传回数据。
【解决方案4】:

我遇到了同样的问题,调用 resumeTimers() 为我解决了问题...

【讨论】:

  • 谢谢,这对我有用。你节省了我的时间。因为我的代码之前是 call.pause() 。我忘了恢复它。
【解决方案5】:

尝试加载之前的空白页面:

wv.loadUrl("about:blank");
wv.clearHistory();
wv.clearView();
wv.loadUrl(Constants.BLOG_URL);

编辑: 这是我之前使用的代码,因为我也遇到过这个问题,请尝试一下。

【讨论】:

  • @ShirishHerwade,我已经编辑了我的答案,试试我添加的代码。
【解决方案6】:

尝试设置 WebChrome 客户端。 webview 在某些情况下需要 WebChrome Clint 的支持才能正常工作。

wv.setWebChromeClient(new WebChromeClient());

【讨论】:

    【解决方案7】:

    只需创建一个方法,您将在其中刷新重新初始化整个 WebView 并从中调用它 reLoadUrl().

    void loadWebView() {
        wv = (WebView) findViewById(R.id.blog_webview);
        wv.getSettings().setJavaScriptEnabled(true);
        wv.setWebViewClient(new WebViewClient() {
    
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon {
            MyLog.logDump("onPageStarted: " + url);
        }
    
        @Override
        public void onPageFinished(WebView view, String url) {
                            MyLog.logDump("onPageFinished: " + url);
        }
    });
    
    wv.loadUrl(Constants.BLOG_URL);
    }
    
    public void reLoadUrl() {
       loadWebView();
    }
    

    【讨论】:

    • 感谢您的建议。不幸的是,它对我不起作用:(
    【解决方案8】:
    @override
    public void onFormResubmission(WebView view, Message dontResend, Message resend){
       resend.sendToTarget();
    }
    

    【讨论】:

      【解决方案9】:

      我遇到了同样的问题,并通过以下步骤使其正常工作:

      webView.clearCache(true);
      webView.loadUrl("Url");
      

      我成功加载了多个 url。

      【讨论】:

      • 好吧,在我的最后,我尝试了两个不同的 url,它运行成功。虽然我和你有同样的问题
      【解决方案10】:

      我遇到了同样的问题,终于设法解决了这个问题。我是 android 新手,不确定这是好是坏,但它对我有用。我只是从 web 视图中清除捕获并在重新加载之前销毁并重新创建另一个网址。

      mWebView.clearCache(true);
      // destroy before reload new url
      parentView.removeView(mWebView);
      mWebView.clearHistory();    
      mWebView.destroy();
      

      虽然 mWebView.destroy();生成错误“java.lang.Throwable: Error: WebView.destroy() called while still attach!”我搜索它但没有得到任何解决方案,许多人说它直到现在才影响应用程序(我仍然不知道解决这个问题:我使用 WebChromeClient )。

      【讨论】:

        【解决方案11】:

        我遇到了同样的问题。我每次都在创建一个新的 Webview。只需在创建新的 webView 之前先销毁您以前的 webView。我希望这有帮助! 使您的 webview 成为全局变量。喜欢-

        Webview w;

        然后在创建新的 webview 之前,只需销毁前一个

                        if(null != w)
                        {
                            //destroy the previous webview, before creating the new one
                            w.destroy();
                        }
                        w= new WebView(activity);
        

        【讨论】:

          【解决方案12】:

          onPause()调用这个方法

           private void pauseWebView() {
                      try {
                          Class.forName("android.webkit.WebView")
                                  .getMethod("onPause", (Class[]) null)
                                  .invoke(webview, (Object[]) null);
          
                      } catch(ClassNotFoundException cnfe) {
          
                      } catch(NoSuchMethodException nsme) {
          
                      } catch(InvocationTargetException ite) {
          
                      } catch (IllegalAccessException iae) {
          
                      }
                  }
          

          【讨论】:

            【解决方案13】:

            我遇到了同样的问题,上述解决方案都不适合我。所以我通过使用 JavaScript 重新加载 WebView 来修复它,如下所示:

            webView.loadUrl( "javascript:window.location.reload( true )" );
            

            还需要为 WebView 启用 JavaScript:

            webView.getSettings().setJavaScriptEnabled(true);
            

            【讨论】:

              【解决方案14】:

              尝试重新加载 url 并正确销毁 webview 以避免缓存和内存泄漏问题,正如我在这里回答的 https://stackoverflow.com/a/67450119/1843984

              【讨论】:

                【解决方案15】:

                onCreate 中,不要使用wv.loadUrl(Constants.BLOG_URL);,而是使用wv.loadDataWithBaseURL(baseUrl, readFileAsString("index.html") , mimeType, "UTF-8", null);

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-26
                  • 2015-09-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-06-14
                  • 1970-01-01
                  相关资源
                  最近更新 更多