WebView loadUrl 只能工作一次

问题描述 投票:0回答: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 issues in android

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

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

有什么想法吗??

android webview webviewclient
16个回答
11
投票

按以下顺序使用精确值。

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

8
投票

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

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

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

}

使用此代码:

公共无效reLoadUrl(){

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

}

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


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
投票

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


2
投票

尝试先加载空白页面:

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

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


2
投票

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

wv.setWebChromeClient(new WebChromeClient());

2
投票

只需创建一个方法,在其中刷新重新初始化整个 WebView 并从中调用它 重新加载Url()。

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();
}

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

1
投票

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

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

我成功加载了多个网址。


1
投票

我面临着同样的问题,终于能够解决这个问题。我是 Android 新手,不确定这是好是坏,但它对我有用。我只是从 Web 视图中清除捕获,然后在重新加载另一个 url 之前销毁并重新创建.

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

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


0
投票

我也面临着同样的问题。我每次都创建一个新的 Webview。在创建新的 webView 之前,先销毁之前的 webView。我希望这有帮助! 让你的 webview 成为一个全局变量。喜欢-

网页视图;

然后在创建新的 webview 之前销毁之前的 webview

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

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

            }
        }

0
投票

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

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

还需要为 WebView 启用 JavaScript:

webView.getSettings().setJavaScriptEnabled(true);

0
投票

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


0
投票

我也遇到了同样的问题。但设置WebChromeClient后,它工作正常。您也可以重写 onConsoleMessage 来检查任何错误日志。

webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
            ConsoleLogger.d(TAG, consoleMessage.message() + " -- From line "
                    + consoleMessage.lineNumber() + " of "
                    + consoleMessage.sourceId());
            return super.onConsoleMessage(consoleMessage);
        }
    });

-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.