关于message的内存优化

在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,因此当咱们须要在非主线程中更新UI控件,使用Handler和Message来实现java

而常见的实现是主线程在处理消息android

 

子线程须要更新ui,只须要发送消息安全

//Message message = new Message();
Message message = mHandler.obtainMessage();
message.what = out.what;
message.obj = out.clone();
mHandler.sendMessage(message);

这里获得message的方式就有几种app

一、直接newui

二、经过Message.obtainthis

三、经过Handler.obtainMessagespa

几这种方式均可以用,通常状况也没什么问题,可是最好仍是使用2或者3的方式,由于这两种方式获取Message对象就能避免建立对象,从而减小内存的开销了。线程

 

方式一、直接new对象,没什么特别code

在频繁执行的时候,可能就会形成内存的消耗增大,在某些机器上,可能内存恰好达到临界值,这个时候再new message以后,可能会出现崩溃对象

本人遇到过这样的问题,底层每两秒给一个消息到应用层更新ui,在大部分机器都没有问题。可是在一个android4.4的设备上,会常常出现崩溃,特别是在handle.sendMessage

频繁的时候基本必现,经过把message的获取方式从new改为obtian,问题解决。

 

方式2的源码实现:

public static Message obtain() {

        synchronized (sPoolSync) {

             if (sPool != null) {

                  Message m = sPool;

     sPool = m.next;

     m.next = null;

     m.flags = 0; // clear in-use flag sPoolSize--; return m;

    }

  }

  return new Message();

}

 

方式3的源码实现:

Message msg1 = handler1.obtainMessage();

 



public final Message obtainMessage() { return Message.obtain(this); }
public static Message obtain(Handler h) { Message m = obtain(); m.target = h; return m; }

public static Message obtain() {

        synchronized (sPoolSync) {

             if (sPool != null) {

                  Message m = sPool;

     sPool = m.next;

     m.next = null;

     m.flags = 0; // clear in-use flag sPoolSize--; return m;

    }

  }

  return new Message();

}

能够看到,第二种跟第三种实际上是同样的,均可以免重复建立Message对象,因此建议用第二种或者第三种任何一个建立Message对象。

经过调用obtainMessage方法获取Message对象就能避免建立对象,从而减小内存的开销了。

相关文章
相关标签/搜索