gpt4 book ai didi

java - 处理程序内存泄漏?

转载 作者:太空宇宙 更新时间:2023-11-04 14:15:09 26 4
gpt4 key购买 nike

我有一个在主线程上声明的处理程序:

  mainHandler = new Handler() {

@Override
public void handleMessage(Message msg) {

switch (msg.what) {

case 1:

Bundle bundle = msg.getData();
mTextView.setText(bundle.getString("message"));
break;

. . .

default:
super.handleMessage(msg);
break;
}
}
};

其中 mTextView 是 onCreate() 定义的 TextView。

我有一个在单独线程中使用的任务。可运行对象存储来自主线程的 mainHandler 并告诉它发送消息:

public class SomeRunnable implements Runnable {

private Handler mHandler;

public SomeRunnable(Handler handler) throws IOException {
. . .
mHandler = handler;
}

@Override
public void run() {

while (!Thread.currentThread().isInterrupted()) {
try {
. . .

Message msg = mHandler.obtainMessage();
. . .
mHandler.sendMessage(msg);
}

} catch (IOException e) {
Log.e("Error", e.hashCode() + ": " + e.getLocalizedMessage());
}
}
}

我发现,如果 Handler 类不是静态的,则使用 Handler#postDelayed() 等方法可能会造成内存泄漏。但是,我使用的是 Handler#sendMessage() ,它会立即将消息放入消息队列中。

我是否仍然面临内存泄漏的危险?即使有:

  @Override
protected void onDestroy() {
super.onDestroy();

mThread.interrupt();
mainHandler.removeCallbacksAndMessages(null);
}

谢谢!

最佳答案

为了解决所有可能发生的情况,您可以将 mHandler 设为 WeakReference,如下所示:

public class SomeRunnable implements Runnable {

private WeakReference<Handler> mHandlerRef;

public SomeRunnable(Handler handler) throws IOException {
. . .
mHandlerRef = new WeakReference<Handler>( handler );
}

@Override
public void run() {

while (!Thread.currentThread().isInterrupted()) {
try {
. . .
Handler mHandler = mHandlerRef.get();
if( mHandler != null ) {
Message msg = mHandler.obtainMessage();
. . .
mHandler.sendMessage(msg);
}
}

} catch (IOException e) {
Log.e("Error", e.hashCode() + ": " + e.getLocalizedMessage());
}
}
}
}

关于java - 处理程序内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27848204/

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