gpt4 book ai didi

c# - PDFViewCtrl 未处理

转载 作者:太空宇宙 更新时间:2023-11-03 21:08:13 27 4
gpt4 key购买 nike

我们正在开发一款使用 PDFTron 的应用程序。我们注意到,当打开显示分配内存的 Activity 时,它会增加很多。离开 Activity 后,只有一部分内存再次被释放。一些 PDFtron 零件被留下了。

enter image description here

问题是,即使我们已将事件设置为 NoHistory 和 singleTask,事件似乎仍未完成。我看过一些关于内存管理的类(class),但无法弄清楚是什么导致 Activity 保持打开状态。

在我们对事件调用 Finish(); 之前,我们处理了 PdfViewCtrl。然后在 OnDestroy 中:

protected override void OnDestroy()
{
base.OnDestroy();
if (_mPdfViewCtrl == null) return;
_mPdfViewCtrl.Destroy();
_mPdfViewCtrl = null;
}

如果长时间使用应用程序,这会导致内存不足错误。

--- End of managed Java.Lang.Error stack trace ---
java.lang.OutOfMemoryError
dalvik.system.NativeStart.run(Native Method):0

    --- End of managed Java.Lang.Error stack trace ---
java.lang.OutOfMemoryError
android.graphics.Bitmap.nativeCreate(Native Method):0
android.graphics.Bitmap.createBitmap(Bitmap.java:726):0
android.graphics.Bitmap.createBitmap(Bitmap.java:703):0
android.graphics.Bitmap.createBitmap(Bitmap.java:670):0
pdftron.PDF.Utils.SignaturePickerDialog$SignatureView.onSizeChanged(SignaturePickerDialog.java:244):0
android.view.View.sizeChange(View.java:15326):0
android.view.View.setFrame(View.java:15290):0
android.view.View.layout(View.java:15201):0
android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076):0
android.view.View.layout(View.java:15204):0
android.view.ViewGroup.layout(ViewGroup.java:4793):0
android.widget.FrameLayout.onLayout(FrameLayout.java:448):0
android.view.View.layout(View.java:15204):0
android.view.ViewGroup.layout(ViewGroup.java:4793):0
android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076):0
android.view.View.layout(View.java:15204):0
android.view.ViewGroup.layout(ViewGroup.java:4793):0
android.widget.FrameLayout.onLayout(FrameLayout.java:448):0
android.view.View.layout(View.java:15204):0
android.view.ViewGroup.layout(ViewGroup.java:4793):0
android.widget.FrameLayout.onLayout(FrameLayout.java:448):0
android.view.View.layout(View.java:15204):0
android.view.ViewGroup.layout(ViewGroup.java:4793):0
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677):0
android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531):0
android.widget.LinearLayout.onLayout(LinearLayout.java:1440):0
android.view.View.layout(View.java:15204):0
android.view.ViewGroup.layout(ViewGroup.java:4793):0
android.widget.FrameLayout.onLayout(FrameLayout.java:448):0
android.view.View.layout(View.java:15204):0
android.view.ViewGroup.layout(ViewGroup.java:4793):0
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677):0
android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531):0
android.widget.LinearLayout.onLayout(LinearLayout.java:1440):0
android.view.View.layout(View.java:15204):0
android.view.ViewGroup.layout(ViewGroup.java:4793):0
android.widget.FrameLayout.onLayout(FrameLayout.java:448):0
android.view.View.layout(View.java:15204):0
android.view.ViewGroup.layout(ViewGroup.java:4793):0
android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2263):0
android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2009):0
android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1251):0
android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6379):0
android.view.Choreographer$CallbackRecord.run(Choreographer.java:791):0
android.view.Choreographer.doCallbacks(Choreographer.java:591):0
android.view.Choreographer.doFrame(Choreographer.java:561):0
android.view.Choreographer$FrameHandler.handleMessage(Choreographer.java:693):0
android.os.Handler.dispatchMessage(Handler.java:99):0
android.os.Looper.loop(Looper.java:137):0
android.app.ActivityThread.main(ActivityThread.java:5493):0
java.lang.reflect.Method.invokeNative(Native Method):0
java.lang.reflect.Method.invoke(Method.java:525):0
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209):0
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025):0
dalvik.system.NativeStart.main(Native Method):0

在模拟 session (Android 工作室监控)的打印屏幕下方: enter image description here

编辑 OnDestroy:

        var old_tool = _mPdfViewCtrl.ToolManager;
var old_doc = _mPdfViewCtrl.Doc;
_mPdfViewCtrl?.CloseDoc();
_mPdfViewCtrl?.CloseTool();
_mPdfViewCtrl?.Destroy();
_mPdfViewCtrl = null;
_mPdfViewCtrl?.Dispose();
if (old_doc != null)
{
old_doc.Dispose();
}

if (old_tool != null)
{
old_tool.Dispose();
}

enter image description here

最佳答案

从这里link :

"问:我有一个用户选择文件的页面,另一个用户查看所选 PDF 的页面。当用户从 PDF 查看页面导航回文件页面时,我想清理 PDFNet 使用的资源. 清理工具、PDFViewCtrl 和 PDFDoc 的正确顺序是什么。

A:需要先调用PDFViewCtrl.CloseDoc(),再调用PDFDoc.Dispose()。这对于使用 PDFViewCtrl 的任何页面都可以放入 OnNavigatedFrom。

此外,PDFViewCtrl 不能手动处理,相反,我们添加了一个 PDFViewCtrl.FreeResources 来删除所有底层结构,这意味着在垃圾收集器启动之前使用的内存更少。

我想添加以下内容:

        PDFDoc doc = this.PDFViewCtrl.GetDoc();

this.PDFViewCtrl.CloseDoc();


if (doc != null)
{
await CloseDocAsync(doc);
}

this.PDFViewCtrl.FreeResources();

CloseDocAsync 只是在后台线程中调用 doc.Dispose(如果它是一个大而复杂的文档)。这可能没有必要,因为我所知道的所有文件都会很快处理掉。但它不疼。即使 UI 线程延迟 200 毫秒也可能造成破坏。

要记住的一件事是,为了让垃圾收集器回收 PDFViewCtrl,所有注册到它的事件都需要注销。这就是为什么当您离开页面时也应该调用 ToolManager.Dispose() 的原因。在这种情况下,只需在我上面添加的任何代码之前调用 ToolManager.Dispose。”

如果以上都没有帮助,您可以尝试在 PDFTron forum 中重新发布您的问题.公司还有tech support option提供优先技术支持。根据您使用的版本,技术支持可能是免费的。

编辑

我为文档提供的链接适用于 Windows 版本,不适用于 Android。以下是 PDFViewCtrl 的 Android 版本链接和 PDFDoc .

因此,我上面提供的链接中的代码对您不起作用。您可能会尝试做的只是关闭文档。有一个 CloseDoc 方法可以从 PDFViewCtrl 类中调用。如果这不起作用,请尝试从 PDFDoc 方法调用 Close 方法。 PDFViewCtrl 类有一个名为 getDoc 的方法,它返回当前文档,即 PDFDoc。文档说 PDFDoc.close 方法是一个析构函数。所以,试试这两个想法。

我注意到的另一件事是 PDFViewCtrl 类中有锁定和解锁方法。如果上述 2 个想法不起作用,您可以尝试在调用 close 方法之前调用 docUnlock 方法。这个想法是,如果文档被锁定,关闭调用可能会挂起或超时。

现在,如果这些都不起作用,那么您正在做的其他事情是否会占用内存?您或您团队中的其他人是否有可能忘记为您可能正在做的其他事情清理内存?是否有人在使用 C++,或者可能使用的 API 在底层使用 C++ 而忽略了删除内存,或者调用适当的关闭方法来正确清理?

使用分析器可能有助于回答这些问题。有 3rd 方分析器可用,或者您可以尝试 Microsoft .NET Memory Analyzer .我不知道它是否适用于Android。它还需要 .NET Framework 4.5 或更高版本。

还有一个Xamarin profiler ,这可能是一个更好的选择。

关于c# - PDFViewCtrl 未处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39774605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com