gpt4 book ai didi

java - 为什么我的处理程序引用空 Activity ?

转载 作者:行者123 更新时间:2023-12-01 15:08:24 26 4
gpt4 key购买 nike

在我第一次从干净状态进入应用程序后,处理程序内部处理 MSG_PULLED 操作,但是,对 main 的引用为空。弱引用不为空。这怎么可能发生?

受到这篇文章的启发:This Handler class should be static or leaks might occur: IncomingHandler

static class MainHandler extends Handler {
private final WeakReference<MainActivity> wMain;
static int angle=0;
public MainHandler(MainActivity main) {
super();
this.wMain = new WeakReference<MainActivity>(main);
}

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity main = wMain.get();
int what = msg.what;
if(what == MSG_PULLED) {
main.startAnim();
}
}
}

以及我如何启动处理程序:

static MainHandler mainHandler;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainHandler = new MainHandler(this);
mainHandler.sendEmptyMessageDelayed(MSG_PULLED,500);
}

最佳答案

应用中的 Activity 实例会定期销毁,并创建新实例,例如在旋转显示器时。

现在,在这种情况下应该发生的是旧实例被垃圾收集,并且只有新实例存在。如果你保留旧的,你就造成了泄漏。

由于 Handler 在没有更多消息之前是不可垃圾收集的(?),因此它们的生存时间比它们创建时的 Activity 更长,这通常会导致泄漏旧的 Activity(直到可以收集 Handler),因为 Handler 通常对其 Activity 具有强引用。

代码中的 WeakReference 方式通过仅保留与 Activity 的弱链接来消除该问题,而不会阻止垃圾回收。

问题在于您以错误的方式使用 get() 方法:get() 只会返回原始对象(当它存在时)。当它消失时,你会得到null。此处:Activity 在仍处于 Activity 状态时将存在(由系统确定)。

null 也不是一个大问题:当你得到 null 时,你的 Activity 实例不再存在(也许是一个新的实例)创建,也许它完全消失了)所以你不能再用它做任何有用的事情了。即使您仍有引用,动画也不会显示。

基本上像下面这样做,你的问题就解决了

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity main = wMain.get();

// message arrived after activity death
if (main == null) return;

int what = msg.what;
if(what == MSG_PULLED) {
main.startAnim();
}
}

WeakReference 本身 (wMain) 不为 null,因为它本身是作为成员变量强引用的。只是其中的内容在某些时候可能/将会为 null

关于java - 为什么我的处理程序引用空 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12655990/

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