在程序的开发过程中,为了使程序变的流畅起来,我们一般会把耗时的任务放在线程中,避免造成主ui卡顿。
项目开发中遇到一个oom异常,定位到是数据上报的地方,经查看代码发现,我们的数据上报是在service中进行的,service里面对每次的数据上报都new了一个thread来进行处理,因为一个点击跳转操作可能会有多个数据上报,所以当你每次的数据上报都new一个thread的时候会造成内存浪费(new一个空的线程会有大约15k---40k的开销)、页面卡顿等影响应用性能的问题。所以,要优化地方就是把线程合并起来,只用一个线程来跑数据上报就可以了,这时候HandlerThread就是最佳的选择,它是未某些任务创建一个专属的线程,当你不使用的时候线程也是一直存在的,结合项目,数据上报基本全app都会有,所以使用HandlerThread来对数据上报处理,再合适不过了。
在使用HandlerThread的时候注意一个问题,它默认的线程优先级是THREAD_PRIORITY_DEFAULT也就是0,一般如果后台线程THREAD_PRIORITY_BACKGROUND的优先级是10,所以,要根据自身的业务情况设置相应的线程优先级Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
private void initBackThread(){
mHandlerThread = new HandlerThread("StatisticsService");
mHandlerThread.start();
mServiceHandler = new ServiceHandler(mHandlerThread.getLooper());
}
private final class ServiceHandler extends Handler {
public ServiceHandler (Looper looper) {
super(looper);
}
@Override
public void handleMessage (Message msg) {
//设置优先级,处理你需要的耗时操作
android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
}
}