WebView loadUrl只能工作一次

时间:2013-01-11 13:37:04

标签: android webview webviewclient

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

我很难用一个应该显示我们博客的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代码,但我找不到任何可以帮助我的东西。

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

任何想法??

15 个答案:

答案 0 :(得分:9)

使用以下序列中的确切。

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

答案 1 :(得分:8)

我花了大约一天时间研究一个使用WebView的应用程序。我在将数据加载到WebView时遇到了一些问题。

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

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

}

使用此代码:

public void reLoadUrl(){

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

}

也许当您清除WebView时它将解决问题

答案 2 :(得分: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);

这可能是您需要恢复的其他属性,但这是一般的想法。

答案 3 :(得分:2)

尝试在之前加载空白页:

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

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

答案 4 :(得分:2)

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

wv.setWebChromeClient(new WebChromeClient());

答案 5 :(得分:2)

@override
public void onFormResubmission(WebView view, Message dontResend, Message resend){
   resend.sendToTarget();
}

答案 6 :(得分:2)

只需创建一个方法,在其中刷新一个重新初始化的整个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();
}

答案 7 :(得分:2)

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

答案 8 :(得分:1)

我面临同样的问题,并按照以下步骤开始工作:

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

我成功加载了多个网址。

答案 9 :(得分:1)

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

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

虽然是mWebView.destroy();生成错误" java.lang.Throwable:错误:WebView.destroy()在仍然附加时调用!"我搜索它但没有得到任何解决方案,很多人说它直到现在都不影响应用程序(我仍然不知道解决这个N.B:我使用WebChromeClient)。

答案 10 :(得分:0)

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

Webview w;

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

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

答案 11 :(得分:0)

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) {

            }
        }

答案 12 :(得分:0)

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

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

还需要为WebView启用JavaScript:

webView.getSettings().setJavaScriptEnabled(true);

答案 13 :(得分:0)

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

答案 14 :(得分:-1)

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