我有一个SlidingDrawer,在我的所有活动中都被引用。抽屉非常详细,具有深层次的视图。目前,我的所有活动都在创建时调用应用程序上下文以接收抽屉的单例副本。当调用onPause活动时,它会从顶层ViewGroup中删除抽屉。这有效,但我不知道这是否是最佳方式。
我遇到的另一个问题是上下文使用情况。 SlidingDrawer有一些按钮可以激活一些对话框。知道我无法传递应用程序上下文,我刚刚创建了一个OnActivityChangeBroadcaster
和Listener
,它改变了抽屉的引用上下文。但即使这样,对话框也总是出现在启动器活动中。
有没有人对此事有任何想法或智慧?
答案 0 :(得分:4)
这有效,但我不知道这是否是最佳方式。
你正在泄露记忆。永远不要在活动之间传递小部件。切勿将小部件或其他任何引用活动的内容放在Application
对象或静态数据成员中,除非您在活动被销毁时null
指出该引用。
有没有人对此事有任何想法或智慧?
请在每项活动中重新创建抽屉。
答案 1 :(得分:1)
我的方法是将UI与数据分离。如果您的许多活动使用相同的SlidingDrawer,我会将SlidingDrawer显示的数据分离到它自己的[非UI]类中,以便它只存在于一个位置,并让每个SlidingDrawer实例从该数据填充自己。您可以在XML中定义一次SlidingDrawer,并在所需的所有布局中<include>
定义它。
然后我会有一个函数用SlidingDrawer填充来自单独类的数据(可以通过单例对象或通过生成数据static
来访问)。要实现这一点,您可以创建一个{SlipDrawer作为参数填充的static
方法(public static void loadSlidingDrawer(SlidingDrawer destinationView) {...}
),也可以扩展SlidingDrawer并使每个实例都可以访问该类方法。
CommonsWare是正确的,你将使用当前的策略在整个地方泄漏内存。 UI元素需要具有被销毁和不断重新创建的灵活性,因此将所有数据分离到UI只是访问显示的非UI类是一个非常好的习惯。这很好地解耦了所有内容,并允许框架有效地运行。