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