Android
匿名用户
3轮技术面中间混着一轮HR面,第一轮和最后一轮技术都还好,中间的问的挺细,从对Android的认识谈到一些细节。从跨线程通信方式谈到内存泄露等等。问:跨线城通信方式,答:主线程用handler,子线程可以用HandlerThread或者Looper.prepare()。然后再用handler。问:handler具体使用方式,答:static继承+弱引用,不会内存泄露。
问:为什么匿名内部类会内存泄露,答:如果消息队列有未处理的消息,会持有对activity的引用,导致activity不会被回收(其实还有一种忘记说,子线程如果持有handler,且子线程没被回收,也会导致泄露)。问:如果匿名内部类一定会泄露你知道原因吗?答:记得检测过,如果没有未执行消息等,还是可以成功被回收的。问:不对,一定会内存泄露,消息队列生命周期跟整个APP一样,而且持有handler引用,所以handler生命周期一定比activity长,而又持有activity,所以一定会泄露(也怪我没仔细看源代码,所以没法反驳。回来查看源代码,handler只有在发message的时候才会创建一个包含自己引用的message,然后发到MessageQueue,如果这个message已经处理完,或者压根没发message,是不会因为消息队列持有引用而泄露的)又问handler原理,答looper在一直转,有消息就会处理。
结果面试官说到了Looper.getLooper()然后再prepare再loop…当时没在意,后来想想哪不对,看了下Looper,根本没有getLooper这个方法,looper是在prepare方法才创建的。细思极恐,如果真的有Looper.getLooper方法,难道要获取本线程的looper去别的线程loop一下吗。又问到了mvp(前两轮面试官都提到了,看来他们在用这个模式)或者mvc,当我说到activity既有v又有c,结果面试官问你们逻辑都写在activity里?然后就没有然后了(之前只看过mvc和mvvm,后来查资料得知,mvc的activity分工确实没那么清楚,mvp才让他变成了彻底的view层)。