Android 中 enable/disable webview 的最佳实践
Best practice on enable/disable webview in Android
想就在 Android 上启用和禁用 Web 视图的最佳实施方式寻求一些建议?
我有这个应用程序,它可以在其中打开 urls(通过使用网络视图),然后当用户导航到另一个页面时弹出并覆盖 UI 的 80%该应用程序应该 hide/close 网络视图,但可以在需要时再次打开。
这是代码片段
private WebViewInterface webViewInterface = new WebViewInterface() {
@Override
public void onOpenURL(String url) {
navBrowserWV.setVisibility(View.VISIBLE);
navBrowserWV.getSettings().setJavaScriptEnabled(true);
navBrowserWV.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
handler.proceed();
}
});
navBrowserWV.loadUrl(url);
}
};
那我就是这样关闭的
private void closeWebView() {
Log.d(LOGTAG, "closing webview...");
// Destroy WebView if it exists
if (this.navBrowserWV != null) {
this.navBrowserWV.stopLoading();
this.navBrowserWV.loadUrl("about:blank");
this.navBrowserWV.clearHistory();
this.navBrowserWV.clearCache(true);
this.navBrowserWV.pauseTimers();
this.navBrowserWV.setVisibility(View.GONE);
}
}
这个实现的问题是它一开始能正确显示页面,但是当我关闭它然后用 url 再次打开网络视图时,它不再加载页面只是一个白色背景(顺便说一句,记录器上没有错误)。
想寻求帮助解决这个问题。谢谢
终于,在网上找了很久的答案后,我发现了这个关于杀掉 Android webview [link].
的旧 post
没有真正的方法来终止 WebView(它将始终 运行 在您的进程中并且您无法对其 ATM 做任何事情)。所以你只需要告诉 WebView 加载一个虚假页面,对我来说我做了:
this.navBrowserWV.loadUrl("about:blank");
现在可以使用了!
引自网站
4.1 .getSettings().setJavaScriptEnabled() Inhalt
嗯,你会认为在 WebView 的设置中禁用 JavaScript 会立竿见影,简而言之:它不会。只有重新加载页面后,才会不再有 javascript,这在设计上并不好,因为页面或多或少仍然呈现得很好。
4.2 .stopLoading() Inhalt
由于 XHR 从另一台服务器“加载”某些内容,您可能认为调用“webview.stopLoading()”会产生效果。简而言之:它没有。仅适用于 HTML 文件中包含的资源。可惜,不是吗……好吧,也许不是,因为无论如何在恢复 activity 之后没有“startLoading()”方法来恢复 XHR。
4.3 .destroy() Inhalt
作为最后的手段,人们可能会考虑“destroy()”那个东西,确实如此,WebView 本身在那之后就无法访问了。然而,它的线程继续作为僵尸存在于巨大的 RAM space 中的某个地方,并且还继续发送 XHR 请求…
4.4 .pauseTimers() / resumeTimers() Inhalt
简而言之:不行,行不通。如果不是为了控制 JavaScript 定时器,我什至不知道这些方法有什么用。 HTML,AFAIK 中没有任何内容。
更新:当只涉及定时器时,这些函数似乎在 2.3.5 及更高版本上工作,但是,当调用函数时没有激活定时器时,一切都是徒劳的。对于我的用例:当 XHR 处于活动状态时暂停应用程序(而不是安排下一个 XHR 调用的 运行ning 定时器),没有任何反应,下一个定时器继续不受阻碍。
我希望这对和我有同样问题的人有所帮助。
想就在 Android 上启用和禁用 Web 视图的最佳实施方式寻求一些建议?
我有这个应用程序,它可以在其中打开 urls(通过使用网络视图),然后当用户导航到另一个页面时弹出并覆盖 UI 的 80%该应用程序应该 hide/close 网络视图,但可以在需要时再次打开。
这是代码片段
private WebViewInterface webViewInterface = new WebViewInterface() {
@Override
public void onOpenURL(String url) {
navBrowserWV.setVisibility(View.VISIBLE);
navBrowserWV.getSettings().setJavaScriptEnabled(true);
navBrowserWV.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
handler.proceed();
}
});
navBrowserWV.loadUrl(url);
}
};
那我就是这样关闭的
private void closeWebView() {
Log.d(LOGTAG, "closing webview...");
// Destroy WebView if it exists
if (this.navBrowserWV != null) {
this.navBrowserWV.stopLoading();
this.navBrowserWV.loadUrl("about:blank");
this.navBrowserWV.clearHistory();
this.navBrowserWV.clearCache(true);
this.navBrowserWV.pauseTimers();
this.navBrowserWV.setVisibility(View.GONE);
}
}
这个实现的问题是它一开始能正确显示页面,但是当我关闭它然后用 url 再次打开网络视图时,它不再加载页面只是一个白色背景(顺便说一句,记录器上没有错误)。
想寻求帮助解决这个问题。谢谢
终于,在网上找了很久的答案后,我发现了这个关于杀掉 Android webview [link].
的旧 post没有真正的方法来终止 WebView(它将始终 运行 在您的进程中并且您无法对其 ATM 做任何事情)。所以你只需要告诉 WebView 加载一个虚假页面,对我来说我做了:
this.navBrowserWV.loadUrl("about:blank");
现在可以使用了!
引自网站
4.1 .getSettings().setJavaScriptEnabled() Inhalt
嗯,你会认为在 WebView 的设置中禁用 JavaScript 会立竿见影,简而言之:它不会。只有重新加载页面后,才会不再有 javascript,这在设计上并不好,因为页面或多或少仍然呈现得很好。
4.2 .stopLoading() Inhalt
由于 XHR 从另一台服务器“加载”某些内容,您可能认为调用“webview.stopLoading()”会产生效果。简而言之:它没有。仅适用于 HTML 文件中包含的资源。可惜,不是吗……好吧,也许不是,因为无论如何在恢复 activity 之后没有“startLoading()”方法来恢复 XHR。
4.3 .destroy() Inhalt
作为最后的手段,人们可能会考虑“destroy()”那个东西,确实如此,WebView 本身在那之后就无法访问了。然而,它的线程继续作为僵尸存在于巨大的 RAM space 中的某个地方,并且还继续发送 XHR 请求…
4.4 .pauseTimers() / resumeTimers() Inhalt
简而言之:不行,行不通。如果不是为了控制 JavaScript 定时器,我什至不知道这些方法有什么用。 HTML,AFAIK 中没有任何内容。
更新:当只涉及定时器时,这些函数似乎在 2.3.5 及更高版本上工作,但是,当调用函数时没有激活定时器时,一切都是徒劳的。对于我的用例:当 XHR 处于活动状态时暂停应用程序(而不是安排下一个 XHR 调用的 运行ning 定时器),没有任何反应,下一个定时器继续不受阻碍。
我希望这对和我有同样问题的人有所帮助。