gpt4 book ai didi

java - 引用匿名类构造函数中的最终对象泄漏?

转载 作者:行者123 更新时间:2023-11-29 05:15:35 25 4
gpt4 key购买 nike

我正在将可运行对象传递给服务。可运行持续时间可能比通过它的 fragment/Activity 更长寿。我想知道以下代码 fragment 是否会通过在 runnable 中维护引用来泄漏 frag 对象?我意识到我可以将包含 frag 的整行移动到 runnable 之外(就像我对“String key = frag ...”所做的那样),但我只是想了解匿名类如何/何时泄漏对象。

我真的不确定。 runnable 只需要 frag 在初始化实例时确定一个变量,并且它在这里被内联初始化。所以理论上,在创建内联实例后,它不需要对 frag 有任何引用。

如果我在 run() 函数中有对 frag 的引用,我认为泄漏会得到保证,因为它需要保持 frag 存活以便在将来的某个时候引用它(并且 frag 很可能是 gc' d 在这一点上,但供引用)。

private static void fg_downloadFile(final FragMyDrive frag, final File file, final Drive drive){

final String key = frag.getCastedActivity().getKey();

Runnable rx_downloadFile = new Runnable() {

Context ServiceContext = frag.getCastedActivity().mService;

@Override
public void run() {

bg_downloadFile(ServiceContext, key, file, drive);
}
};

//.... Submit runnable to service...
}

最佳答案

您可能知道,在外部声明变量但在匿名类中使用它们时,必须将变量设置为 final。这里的 Java 技巧是将所有这些变量复制到该匿名类的隐式生成的实例字段中。

话虽如此,这意味着确实有实例字段(在您的可运行对象中)保存着外部范围的所有访问变量的副本。在您的示例中,它还会引用 FragMyDrive,因为您只是在访问它。

在您的可运行对象符合垃圾回收条件的同时,所有这些对象都符合垃圾回收条件。这意味着在 runnable 中对 FragMyDrive 的引用使该对象在运行时保持 Activity 状态。

将这些引用范围缩小到您真正需要的范围总是一个好主意:

private static void fg_downloadFile(final FragMyDrive frag, final File file, final Drive drive){
final String key = frag.getCastedActivity().getKey();
final Context context = frag.getCastedActivity().mService;

Runnable rx_downloadFile = new Runnable() {
@Override
public void run() {
bg_downloadFile(context, key, file, drive);
}
};
//.... Submit runnable to service...
}

这里唯一的(隐式生成的)实例字段是:

String key
Context context
File file
Drive drive

关于java - 引用匿名类构造函数中的最终对象泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26669437/

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