24

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

我很难使用一个应该显示我们博客的 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 的广告网络——我试图将其关闭,但我没有删除这些库,所以我不确定它们是否是罪魁祸首。

有任何想法吗??

4

15 回答 15

12

按以下顺序使用exact。

   wv.clearCache(true);
   wv.clearView();
   wv.reload();
   wv.loadUrl("about:blank");
   wv.loadData(Constants.BLOG_URL);
于 2013-05-01T07:05:12.777 回答
8

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

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

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

}

使用此代码:

公共无效重载Url(){

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

}

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

于 2013-01-11T13:44:05.417 回答
3

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

于 2015-02-17T15:45:22.017 回答
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);

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

于 2013-05-05T14:18:17.937 回答
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();
}
于 2013-05-03T12:16:52.253 回答
2
@override
public void onFormResubmission(WebView view, Message dontResend, Message resend){
   resend.sendToTarget();
}
于 2013-05-03T06:42:18.667 回答
2

尝试加载一个空白页之前:

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

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

于 2013-04-28T14:23:28.047 回答
2

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

wv.setWebChromeClient(new WebChromeClient());
于 2013-05-01T08:27:04.237 回答
1

我面临同样的问题,并通过以下步骤使其工作:

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

我成功加载了多个网址。

于 2013-07-08T09:05:04.717 回答
1

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

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

于 2014-05-10T07:16:51.857 回答
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);
于 2015-07-24T07:37:29.403 回答
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) {

            }
        }
于 2017-01-24T06:22:57.697 回答
0

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

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

还需要为 WebView 启用 JavaScript:

webView.getSettings().setJavaScriptEnabled(true);
于 2017-02-14T18:39:39.923 回答
0

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

于 2021-05-08T17:05:38.800 回答
-1

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

于 2014-08-08T04:16:08.303 回答