如何避免处理程序中的内存泄漏?

Sur*_*non 0 android

我的库代码会将字节数组通知给UI,然后将其排队.另一个线程将使字节数组出列,并使用处理程序的实例捆绑字节数组并发送消息以更新UI.

使用处理程序更新UI的代码段

public void run(){

        while(running){
            try {
                byte[] msg=(byte[]) queue.getMsg();
                Message message=new Message();
                Bundle bundle=new Bundle();
                bundle.putByteArray("img",msg);
                message.obj=bundle;
                handler.sendMessage(message);
                message=null;


            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
Run Code Online (Sandbox Code Playgroud)

但问题是我在5到10分钟后出现了外存.使用Eclipse MAT堆转储显示,90%的堆被更多的android.os.Message实例占用.

Cas*_*eyB 5

Message每次都在创造一个新的东西.这可能是导致您的问题的原因.你应该做的是得到一个Message来自HandlerMessage使用池:

Message message = handler.obtainMessage();
Run Code Online (Sandbox Code Playgroud)

这将使您无法分配所有新内存.