一些性能优化的tips
工作中积累的一些性能优化的tips,记录一下:
1. Message的创建
Message message = Message.obtain(); // 推荐
Message message = new Message(); // 不推荐
原因:message在使用完之后对调用recycle,这个操作会将message放入pool中,而obtain()方法通过从全局pool中获取已有对象创建Message,从而避免创建大量的对象
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(); }
2. 单例模式
例:子线程中避免重复创建handler,可以采用单例模式,保证handler只有一个实例
private Handler mHandler;
private static class MHandler extends Handler {
public MHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
public Handler getHandler() {
if (mHandler == null) {
synchonized(MyHandler.class) {
mHandler = new MyHandler();
}
}
return mHandler;
}
3. 线程池
受限于硬件、内存和性能,我们不可能无限制的创建任意数量的线程,因为每一台机器允许的最大线程是一个有界值。
也就是说ThreadPoolExecutor管理的线程数量是有界的。线程池就是用这些有限个数的线程,去执行提交的任务。
使用newFixedThreadPool()可以创建固定大小的线程池,可控制线程最大并发数,超出的线程会在队列中等待。
private static ExecutorService executorService = Executors.newFixedThreadPool(4);
private doWork() { executorService.execute(new Runnable() { @Override public void run() { Message message = Message.obtain(); message.obj = onDoInBackground(); getHandler().sendMessage(message); } });
}
4.
posted on 2018-01-06 21:44 nicoleTeng 阅读(214) 评论(0) 编辑 收藏 举报