1.怎么终止一个正在运行的线程,如果线程是wait
https://blog.csdn.net/youanyyou/article/details/104509220/
(1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止
(2)使用interrupt方法中断线程。(调用interrupt方法是在当前线程中打了一个停止标志,并不是真的停止线程)
(3)使用stop方法强行终止,但是不推荐。(stop()方法作废,因为如果强制让线程停止有可能使一些清理性的工作得不到完成。
另外一个情况就是对锁定的对象进行了解锁,导致数据得不到同步的处理,出现数据不一致的问题)
(4)sleep()状态下停止线程,那么会抛异常java.lang.InterruptedException: sleep interrupted
2.单例模式
两次判空:(1)避免不必要的同步;(2)避免创建相同的对象
volatile作用:禁止指令重排序,避免产生未初始化的对象
3.事件分发中,MotionEvent.ACTION_CANCEL事件什么情况下被触发
https://juejin.cn/post/6874589638925746190#heading-9
(1)当用户保持按下操作,并从你的控件转移到外层控件时,会触发ACTION_CANCEL,触发cancel事件就不会接收到up事件
(2)View收到ACTION_DOWN事件以后,上一个事件还没有结束(可能因为APP的切换、ANR等导致系统扔掉了后续的事件),这个时候会先执行一次ACTION_CANCEL
(3)子View之前拦截了事件,但是后面父View重新拦截了事件,这个时候会给子View发送ACTION_CANCEL事件
如何解决滑动冲突,两个方法:
(1)通过重写父类的 onInterceptTouchEvent 来拦截滑动事件
(2)通过在子类中调用 parent.requestDisallowInterceptTouchEvent 来通知父类是否要拦截事件,
4.handler产生内存泄漏的原因
问题1:Message的target其实是handler,持有activity的引用
问题2:handler的postDelay(1)和postDelay(3)是如何实现的
(17条消息) 你真的懂Handler.postDelayed()的原理吗?_qingtiantianqing的博客-CSDN博客_handler postdelayed
具体:
postDelay()一个10秒钟的Runnable A、消息进队,MessageQueue调用nativePollOnce()阻塞,Looper阻塞;
紧接着post()一个Runnable B、消息进队,判断现在A时间还没到、正在阻塞,把B插入消息队列的头部(A的前面),然后调用nativeWake()方法唤醒线程;
MessageQueue.next()方法被唤醒后,重新开始读取消息链表,第一个消息B无延时,直接返回给Looper;
Looper处理完这个消息再次调用next()方法,MessageQueue继续读取消息链表,第二个消息A还没到时间,计算一下剩余时间(假如还剩9秒)继续调用nativePollOnce()阻塞;
直到阻塞时间到或者下一次有Message进队;
这样,基本上就能保证Handler.postDelayed()发布的消息能在相对精确的时间被传递给Looper进行处理而又不会阻塞队列了。
5.git rebase和git merge区别
https://www.jianshu.com/p/4079284dd970
rebase方式不会产生新的commit,但是merge方式必须产生新的commit。
rebase会把你当前分支的 commit 放到公共分支的最后面,所以叫变基,相当于是更改了基点。就好像你从公共分支又重新拉出来这个分支一样。
举例:如果你从 master 拉了个feature分支出来,然后你提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,
这个时候 master 就比你拉分支的时候多了几个 commit,如果这个时候你 rebase master 的话,就会把你当前的几个 commit,放到那个人 commit 的后面。
6.ViewModel是如何在Activity发生旋转时保留数据的
https://blog.csdn.net/jackzhouyu/article/details/109031202 (完整答案,非常好仔细看,涉及AMS)
因为ViewModel会使用一个空的fragment会保存数据,是系统帮我们保存的,可以设置isChangingConfigurations返回true(setSavedeainsace?)
model = new ViewModelProvider(this).get(NotifyDeModel.class);
先去ComponentActivity的ViewModelStore内的HashMap去查找,如果找到就直接复用,反之则会利用反射创建一个ViewModel并保存到HashMap中去,以后需要时复用即可
在onDestroy之前,会保存Activity的retainNonConfigurationInstances()方法返回值,而这个retainNonConfigurationInstances()
就来源于Activity的onRetainNonConfigurationInstance()方法,保存了NonConfigurationInstances实例,这个实例里面就保存了ViewModelStore
7.retrofit
问题1:动态代理
问题2:一般会有哪些设置addgSonFactory、Adapter作用
mRetrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(GSON))
.addCallAdapterFactory(LiveDataCallAdapterFactory.create())
8.hook的应用
换肤