第255篇 主线程治理:耗时任务的下沉与调度 先把结论放在前面:主线程治理的核心不是"把任务丢到后台",而是"先判断这个任务应不应该在主线程出现"。很多任务之所以在主线程,是因为它被写在了错误的层级——启动时同步初始化、页面创建时同步查库、点击时同步落盘。正确的顺序是:先问"能不能不做",再问"能不能延后做",最后才问"能不能放到后台做"。 这个顺序决定了优化的收益与风险。面试里这题属于"主线程纪律"专题。答得浅的是"耗时操作放子线程,用 HandlerThread";答得深的是能讲清"切线程不等于解耦"(跨线程仍需同步,且同步本身可能成为新瓶颈)、主线程消息队列的优先级机制(同步屏障)、以及"UI 更新必须回主线程"这条规则的底层原因与几种正确实现方式。第一步:能不能不做这是收益最高、风险最低的一档,但最常被跳过。/** 反面教材:三个"本可以不做"的同步任务 */ class BadInit { fun onCreate() { // 1) 同步读配置文件:几百字节到几十 KB,却是磁盘 IO val config = ConfigFile.readSync(filesDir, "config.json") // 2) 同步初始化图片库:内部要建线程池与缓存目录 ImagePipeline.get().init(this) // 3) 同步查数据库拿用户信息:主线程 Binder + IO 双重等待 val user = UserDao.queryCurrentSync()