1.热修复的原理及其优缺点
插件化和热修复的原理,都是动态加载 dex/apk 中的类/资源,两者的目的不同。目标不同,也就导致其实现方式上的差别。由于目标是动态加载组件,所以插件化重在解决组件的生命周期,以及资源的问题。而热修复重在解决替换已有的有问题的类/方法/资源等。
优点:1.使用 java 实现,开发方便2.兼容性好3.补丁实时生效
缺点:1.代码是侵入比较高,需要在原有代码中新增逻辑,而且需要对方法进行插桩,将这里逻辑自动化处理 2.增大包体积
2,描述一下Handler
3,一个线程可否有多个Handler,怎么保证只有一个Looper
答:一个线程只有一个Looper,保证:Handler 主要利用了 ThreadLocal 在每个线程单独存储副本的特性,保证了一个ThreadLocal<Looper>
在不同线程存取的Looper
对象相互独立;其次,ThreadLocal 是 Looper 的一个static final
变量,这样就保证了整个进程中 sThreadLocal
对象不可变;第三,Looper.prepare()
判断在一个线程里重复调用,则会抛出异常。
public static @Nullable Looper myLooper() { return sThreadLocal.get(); }
其实还是调用的线程局部变量sThreadLocal,获取当前线程的Looper,这里需要注意的是,如果当前线程没有关联的Looper,这个方法会返回null。
注意:Handler在哪个线程创建的,就跟哪个线程的Looper关联,也可以在Handler的构造方法中传入指定的Looper
同一个Looper是怎么区分不同的Handler的,换句话说,不同的Handler是怎么做到处理自己发出的消息的
这个问题就要来到Handler的sendMessage方法里面了,具体的流程这里不详说了,最后来到了这个方法
Handler.enqueueMessage
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis); }
可以看到这一句msg.target = this;,这里就是将当前的Handler赋值给Message对象,这样在处理消息的时候通过msg.target就可以区分开不同的Handler了。处理的方法在Looper.loop中:
Looper.loop()
...
msg.target.dispatchMessage(msg);
...
顺便提一句,在Message的obtain的各种重载方法里面也有对target的赋值
4,fragment生命周期,activity生命周期
我说出了fragment的onAttach onCreateView onActivityCreated 几个独有的,但跟activity直接的顺序好像说错了
5,activity启动模式
A app 的activity 启动 B app 的 activity 栈的变化
8,mvp
讲了对mvp的理解,补充说了对职责的理解
9.大文件传输的设计
10.调度算法?抢占式和非抢占式?
11.git rebase和merge的区别