gpt4 book ai didi

android - 即使在调用 onDestroy() 之后 Activity 实例仍然存在

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:43:53 24 4
gpt4 key购买 nike

我从 Activity 传递在 mainUI 线程上创建的处理程序,并传递给执行某些网络操作的线程,当我获得结果时,我使用处理程序将结果发送回 Activity 。

当我浏览这些链接时,这种方法在内存泄漏方面存在问题:
Inner ClassHandler Memory Leak
Android Developers

所以我实现了 WeakReference,并使用 WeakReference 保留 Activity 实例。但即使在 Activity 被销毁后,我仍然看到 Activity 实例仍然存在。

我在 Activity 中创建了一个 Handler 并将 Activity 实例作为弱引用传递给处理程序。
当我的 Handler 响应 10 秒后传递给它的消息时,Activity 被销毁。但是弱引用仍然有 Activity 实例,在 Activity 被销毁后,我看到了 Toast

我的理解有什么地方不对吗?
有人可以解释如何处理传递给处理程序的消息,但 UI 不在身边吗?

import java.lang.ref.WeakReference;

import android.os.Handler;
import android.os.Message;

public abstract class SingleParamHandler <T> extends Handler
{
private WeakReference<T> mActivityReference;

public SingleParamHandler(T activity) {
mActivityReference = new WeakReference<T>(activity);
}

@Override
public void handleMessage(Message msg) {
if (mActivityReference.get() == null) {
return;
}
handleMessage(mActivityReference.get(), msg);
}

protected abstract void handleMessage(T activity, Message msg);

}

import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.widget.Toast;

public class MainActivity extends Activity {

MyHandler<MainActivity> handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
handler = new MyHandler<MainActivity>(this);
new Thread(new MyRunnable(handler)).start();
}

public void onDestroy() {
super.onDestroy();
System.out.println("######## Activity onDestroy() ###### ");
}

private class MyRunnable implements Runnable {
private Handler mHandler;
public MyRunnable(Handler handler) {
mHandler = handler;
}

public void run() {
try {
Thread.sleep(10000);
mHandler.sendMessage(Message.obtain(handler, 1));
} catch ( Exception e) {
e.printStackTrace();
}
}
}


private static class MyHandler<T> extends SingleParamHandler<T> {

public MyHandler(T activity) {
super(activity);
}

@Override
public void handleMessage(T act, Message msg) {
if(msg.what == 1) {
Toast.makeText((MainActivity)act, "Called after activity destroyed", Toast.LENGTH_LONG).show();;
}
}
}

}

根据获得的回复,我在这里更新答案。你可以按照你喜欢的方式去做。但这是一种方式。

在 SingleParamHandler 中添加了以下功能

public void clear() {
mActivityReference.clear();
}

并且在 Activity onDestroy() 中

public void onDestroy() {
super.onDestroy();
System.out.println("######## Activity onDestroy() ###### ");
handler.clear();
}

最佳答案

这里不需要WeakReferenceHandler 可以只包含对 Activity 的引用。在 Activity 的 onDestroy() 中,只需在 MyHandler 上调用一个方法,将对 Activity 的引用设置为 null。在 handleMessage() 中检查 null

另一种选择是:在 Activity 的 onDestroy() 中调用一个方法来中断休眠线程,以便它在发送消息之前关闭。

关于android - 即使在调用 onDestroy() 之后 Activity 实例仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16185069/

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