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 用页眉和页脚包装内容