java - 处理程序内存泄漏?

标签 java android memory-leaks

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

  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/

相关文章:

java - 如何通过在android中前后添加双引号来传递文本

c++ - 优先考虑内存泄漏,以免减慢关机速度

java - 将当前显示的 JPanel 替换为 JFrame 中的另一个 JPanel

android - Android 源代码中的@hide 是什么意思?

android - 如何在 Android 中循环时刷新 TextView?

ruby-on-rails-3 - 在 Ruby on Rails 3/Postgres/Apache Passenger 应用程序中跟踪内存泄漏

c++ - 使用 std::list 中的类型 char 指针检测到内存泄漏

java - 你如何制作阿克曼函数 "learn"?

java - 授权 header 的 Grails Base64 解码在解码时格式错误

java - 列表转数组的区别