White/blank screen when opens multiple PDF times xamarin (似乎是内存错误)
White/blank screen when opening PDF multiple times xamarin (Seems to be a memory error)
我目前正在制作一个 xamarin 应用程序,其中包含一个列表视图,当单击该列表视图时,它会在网络视图中使用 google.docs 打开生成的 pdf(这不是最干净的方式,但可以满足我的需要)。使用包含 webview 的 rg.plugin 弹出窗口 window 打开 PDF。当用户完成查看 pdf 后,他们可以退出并 return 到列表视图页面。
一切正常,但一旦我有 opened/closed 4/5 pdf,webview 开始只显示一个空白屏幕。我相信这一定是 webview/application 保留这些 pdf 而不是释放该内存的错误。
我真正想问的是,可以做些什么来缓解这个问题,是在弹出 window 关闭后清理还是其他什么?
非常感谢
我也遇到过类似的问题。这是 Android Webview 的问题,与 Xamarin 无关。你可以看到我的问题
Android Webview cannot render the pdf sometimes and shows blank/white page instead
您可以通过两种方式解决问题。
1.一种是在服务器端使用Js.Pdf插件。
2. 第二个选项不推荐。可以递归调用加载webview的函数。下面是代码:
private void showPdf(final String imageString) {
pdfView.invalidate();
pdfView.getSettings().setJavaScriptEnabled(true);
pdfView.getSettings().setSupportZoom(true);
pdfView.loadUrl("http://docs.google.com/gview?embedded=true&url=" + imageString);
pdfView.setWebViewClient(new WebViewClient() {
boolean checkhasOnPageStarted = false;
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
}
@Override
public void onPageFinished(WebView view, String url) {
if(view.Title == ""){
view.Reload();
}
});}
我设法根据您之前所说的内容解决了我的问题,只是认为我会 post 我的解决方案,以防它对其他寻找它的人有用。
在我的自定义 webview 渲染器中 android 我创建了一个自定义 webviewclient,它使用 onPageCommitVisible 检查页面是否已正确加载。如果加载不成功,将再次加载页面以解决问题。
class CustomWebViewClient : WebViewClient
{
bool pageCommitted = false;
public override void OnPageFinished(Android.Webkit.WebView view, string url)
{
if (!pageCommitted)
{
view.LoadUrl(url);
}
base.OnPageFinished(view, url);
}
public override void OnPageCommitVisible(Android.Webkit.WebView view, string url)
{
pageCommitted = true;
}
}
将其附加到我的 OnElementChanged 事件
protected override void OnElementChanged(ElementChangedEventArgs<CustomWebView> e)
{
base.OnElementChanged(e);
//Control.LoadUrl("about:blank");
if (Control == null)
{
var webView = new Android.Webkit.WebView(_context);
webView.Settings.SetSupportZoom(true);
webView.Settings.BuiltInZoomControls = true;
webView.Settings.DisplayZoomControls = false;
webView.Settings.JavaScriptEnabled = true;
webView.Settings.SetEnableSmoothTransition(true);
webView.SetWebViewClient(new CustomWebViewClient());
SetNativeControl(webView);
Control.LoadUrl(Element.Uri);
}
}
我目前正在制作一个 xamarin 应用程序,其中包含一个列表视图,当单击该列表视图时,它会在网络视图中使用 google.docs 打开生成的 pdf(这不是最干净的方式,但可以满足我的需要)。使用包含 webview 的 rg.plugin 弹出窗口 window 打开 PDF。当用户完成查看 pdf 后,他们可以退出并 return 到列表视图页面。
一切正常,但一旦我有 opened/closed 4/5 pdf,webview 开始只显示一个空白屏幕。我相信这一定是 webview/application 保留这些 pdf 而不是释放该内存的错误。
我真正想问的是,可以做些什么来缓解这个问题,是在弹出 window 关闭后清理还是其他什么?
非常感谢
我也遇到过类似的问题。这是 Android Webview 的问题,与 Xamarin 无关。你可以看到我的问题 Android Webview cannot render the pdf sometimes and shows blank/white page instead
您可以通过两种方式解决问题。 1.一种是在服务器端使用Js.Pdf插件。 2. 第二个选项不推荐。可以递归调用加载webview的函数。下面是代码:
private void showPdf(final String imageString) {
pdfView.invalidate();
pdfView.getSettings().setJavaScriptEnabled(true);
pdfView.getSettings().setSupportZoom(true);
pdfView.loadUrl("http://docs.google.com/gview?embedded=true&url=" + imageString);
pdfView.setWebViewClient(new WebViewClient() {
boolean checkhasOnPageStarted = false;
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
}
@Override
public void onPageFinished(WebView view, String url) {
if(view.Title == ""){
view.Reload();
}
});}
我设法根据您之前所说的内容解决了我的问题,只是认为我会 post 我的解决方案,以防它对其他寻找它的人有用。
在我的自定义 webview 渲染器中 android 我创建了一个自定义 webviewclient,它使用 onPageCommitVisible 检查页面是否已正确加载。如果加载不成功,将再次加载页面以解决问题。
class CustomWebViewClient : WebViewClient
{
bool pageCommitted = false;
public override void OnPageFinished(Android.Webkit.WebView view, string url)
{
if (!pageCommitted)
{
view.LoadUrl(url);
}
base.OnPageFinished(view, url);
}
public override void OnPageCommitVisible(Android.Webkit.WebView view, string url)
{
pageCommitted = true;
}
}
将其附加到我的 OnElementChanged 事件
protected override void OnElementChanged(ElementChangedEventArgs<CustomWebView> e)
{
base.OnElementChanged(e);
//Control.LoadUrl("about:blank");
if (Control == null)
{
var webView = new Android.Webkit.WebView(_context);
webView.Settings.SetSupportZoom(true);
webView.Settings.BuiltInZoomControls = true;
webView.Settings.DisplayZoomControls = false;
webView.Settings.JavaScriptEnabled = true;
webView.Settings.SetEnableSmoothTransition(true);
webView.SetWebViewClient(new CustomWebViewClient());
SetNativeControl(webView);
Control.LoadUrl(Element.Uri);
}
}