一些性能优化的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编辑  收藏  举报

导航