共享元素转换后,活动中的内存泄漏进入转换协调器

时间:2018-12-22 21:13:40

标签: android kotlin memory-leaks shared-element-transition sharedelementcallback

在使用共享元素转换时,$ g++ gen.cpp -std=c++2a In file included from gen.cpp:2: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/experimental/coroutine:66:5: warning: <experimental/coroutine> cannot be used with this compiler [-W#warnings] # warning <experimental/coroutine> cannot be used with this compiler ^ 中的内存泄漏有问题。您可以在下面看到应用的结构:

App structure

它有2个屏幕,第一个是EnterTransitionCoordinator,里面有Activity,里面只有几个DrawerLayout。其中一个包含一张照片列表,单击特定的照片触发器会触发共享元素从位于另一个Fragment中的FragmentViewPager的过渡。我在退出并重新输入这两个Activity时使用自定义SharedElementCallback来为共享元素转换映射正确的Activity。我的代码基于以下出色的博客文章:https://android.jlelse.eu/dynamic-shared-element-transition-23428f62a2af

问题是,在View的项目之间滑动后,ViewPager被销毁,但是用于共享元素转换的Fragment被保留在{{1} }的View,尤其是在Activity中。使用ActivityTransitionState重新进入EnterTransitionCoordinator然后打开另一个Activity时,情况相同。即使DrawerLayout被销毁了,但用于共享元素转换的Fragment的引用仍保持为整型View,这会导致内存泄漏。

我的问题:是否有避免这种内存泄漏的好方法?

1 个答案:

答案 0 :(得分:2)

我发现Activity中有一个方法Fragment,应在clearState()中调用。但是由于EnterTransitionCoordinator尚未停止,因此Activity.onStop()中的Activity s已泄漏。作为暂时的解决方法,我将通过反射调用此方法来手动清除View上的状态。在下面您可以看到代码:

Fragment