Android回调 - 这是一个潜在的内存泄漏吗?

5
在我的Android应用程序中,我的某个活动包括实例化我的其他类。其中一些类需要写入屏幕。我想将所有布局交互保留在顶层。因此,我创建了一个接口,其中包含可以调用以向屏幕输出的方法列表。然后,在主活动中实现此接口。最后,当实例化类时,我将“this”传递给构造函数,并将其保存并用于回调。我的问题是:由于我将Activity对象本身传递到其中一个对象中,是否存在内存泄漏的危险?
2个回答

2
如果我正确理解您的问题,您已将一些 UI 交互功能抽象为一个类,并用其装饰了您的活动。
简单的答案是不。虽然您将 "this" 的实例传递给对象,但对象本身的范围受 Activity 控制。实际上,Android 框架传递上下文,与您的做法并不相似。我相信我们都可以认同,Activity 的生命周期非常有限。
我想要强调的第二个点是关于整个方法论本身。Android 提供了一种机制来回调主线程以执行 UI 交互(post 或 asynctask 等)。您应该使用其中一种机制在主线程中进行一些更改。所以我的问题是,如果这个功能仅适用于此 Activity,您是否可以编写一个匿名内部类来使用 asynctask 执行此操作。

2
我建议您查看标准的Android Handler机制(也支持自定义回调来进行UI更改)。
以下是一个处理程序定义自定义回调以处理UI更改的示例:

http://developer.android.com/resources/samples/TicTacToeLib/src/com/example/android/tictactoe/library/GameActivity.html

只要您能确保“this”被正确地作用域化,那么您就应该相当安全。然而,一旦您开始将活动传递给其他类,就会打开潜在内存泄漏的大门,因为代码片段现在可以获取该实例并防止它在应该回收对象的时间内被垃圾回收。

我注意到在这个例子中所有的逻辑都包含在Activity类中。但是在我的情况下,我想从Activity类外部(从一个实例化的对象)发送回调。我能以同样的方式做到吗? - theblitz
在这种情况下,由于回调需要访问与活动相关联的视图,因此您需要传递活动。请注意,如果这些回调不被其他活动重用,则最好将它们设计为内部类。然而,由于回调的生命周期很短,它对活动的引用不会导致内存泄漏。 - ddewaele
我不太确定你的意思。我“回调”的函数在主活动类中。然后,我使用接口从我的其他类中调用它们。什么应该定义为内部类? - theblitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接