Android相关知识点

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()判断在一个线程里重复调用,则会抛出异常。

Handler与Looper的关联:在Handler中有两个全局变量mLooper和mQueue代表当前Handler关联的Looper和消息队列,并在构造函数中进行了初始化,重要的就是调用了:Looper.myLooper()。
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的区别

posted @ 2021-04-15 17:28  acehm  阅读(81)  评论(0)    收藏  举报