起因:
当我们的UI越来越复杂的时候,或者说某个业务需要大量的计算的时候,我们的主线程会消耗大量的资源去计算,这个时候,我们的Activity或者说fragmemt等UI页面就会出现卡顿,乃至ANR。总结一下,就是我们直接在主线程(UI线程)中,做耗时操作,就会造成卡顿,甚至ANR
解决方案:
1.优化耗时的计算,提高算法,利用缓存等数据;这种方式,一般带来的提升在App这种场景中微乎其微,只有在大规模的并发场景中才会体现出效果(服务器后台服务中),打个比方,你存一年1W块钱的定期,一年利息才200多块,当你存1000W的时候,一年利息就有20多W,这种效果才明显(手动滑稽)
2.利用异步的方式,简单来说,开启另外一个线程去做耗时操作,利用CPU的多线程模式,这样我们的主线程就不会卡顿在耗时操作中
异步的方式:
1.直接使用继承Thread类或者实现Runable接口(和主线程通信还得使用handler)
2.AsyscTask(它的原理主要是利用线程池,各个历史版本系统版本可能会有不同的缺陷)
3.利用Handler,Message,Looper(主线程默认开启了Looper)
4.RxJava 线程模式.subscribeOn(Schedulers.io()),这样可以开启一个新线程来执行里面的耗时代码
严格的地来说,Android里面,主线程和子线程之间,不能使用sleep(),wait(),notify()等Java原生的线程通信的方式,因为,主线程一旦sleep那么整个App都不能正常运行(所有的Activity,Service等都在主线程运行中呢)