WebView loadUrl 只工作一次

Posted

技术标签:

【中文标题】WebView loadUrl 只工作一次【英文标题】:WebView loadUrl works only once 【发布时间】: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 天的时间。而且仍然没有成功。如果你得到答案,请发布答案 【参考方案1】:

按以下顺序使用exact。

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

【讨论】:

能否请您在重新加载网址之前检查您的博客网址是否为空。 我确定,它是一个静态常量。 按此链接尝试自定义 webview 客户端并告诉我:***.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://***.com/a/67450119/1843984

【讨论】:

【参考方案15】:

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

【讨论】:

以上是关于WebView loadUrl 只工作一次的主要内容,如果未能解决你的问题,请参考以下文章

webView.loadUrl 错误:A WebView method was called on thread 'JavaBridge'.

Android webview在调用loadurl时启动浏览器

在 Android 的 WebView 中使用 LoadUrl 用页眉和页脚包装内容

webView loadUrl 打开浏览器选择对话框

Android Webview - 使用一个 loadUrl 缩放图像以正确适合屏幕

Android layer type与WebView白屏-第一次加载webview很慢