Java基础
public synchronized void run() {
System.out.println(1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println(2);
}
Demo demo = new Demo();
new Thread(() -> demo.run()).start();
Demo demo2 = new Demo();
new Thread(() -> demo2.run()).start();
结果为:
1 1 2 2
不同步。但如果使用同一对象访问,结果才是同步的
Demo demo = new Demo();
new Thread(() -> demo.run()).start();
new Thread(() -> demo.run()).start();
输出结果:1 2 1 2
if(JVM内存不足) {
// 将软引用中的对象引用置为null
str = null;
// 通知垃圾回收器进行回收
System.gc();
}
还在用Synchronized?Atomic你了解不?
多线程并发问题
Android基础知识
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
为了解决多个线程访问同一个数据问题,同步锁的思路是线程不能同时访问一片内存区域.而ThreadLocal的思路是,干脆给每个线程Copy一份一摸一样的对象,线程之间各自玩自己的,互相不影响对方
常见ThreadLocal应用场景:确保在每一个线程中只有一个Looper的实例对象
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
简而言之:先拿到当前线程,再从当前线程中拿到ThreadLocalMap,通过ThreadLocalMap来存储数据。(ThreadLocalMap是Thread的成员变量)
Activity对事件响应不超过5秒,BroadcastReceiver执行不超过10秒,Service耗时操作为20秒。否则系统会报ANR
4.FragmentPageAdapter和FragmentPageStateAdapter的区别
事务是由一个或多个sql语句组成的一个整体,如果所有语句执行成功那么修改将会全部生效,如果一条sql语句将销量+1,下一条再+1,倘若第二条失败,那么销量将撤销第一条sql语句的+1操作,只有在该事务中所有的语句都执行成功才会将修改加入数据库中
sqlite数据库相关操作,主要包括创建和增删改查,事务
ViewGroup
的onInterceptTouchEvent
默认返回false,即不拦截事件,View
没有拦截事件方法,View
默认时消耗事件的ViewGroup
默认不会调用onDraw方法,View
默认会调用onDraw方法。可以通过setWillNotDraw(boolean willNotDraw)
来指定是否调用onDraw方法 /**
* If this view doesn't do any drawing on its own, set this flag to
* allow further optimizations. By default, this flag is not set on
* View, but could be set on some View subclasses such as ViewGroup.
*
* Typically, if you override {@link #onDraw(android.graphics.Canvas)}
* you should clear this flag.
*
* @param willNotDraw whether or not this View draw on its own
*/
public void setWillNotDraw(boolean willNotDraw) {
setFlags(willNotDraw ? WILL_NOT_DRAW : 0, DRAW_MASK);
}
Android框架知识
通过注解处理器动态生成java文件,在java文件中进行findViewById和setOnClickListener操作
通过观察者设计模式,先通过注册的方式将指定的类加到一个表里面,等发送消息时轮训那个表,依据注解和注解的value找到匹配的方法,然后执行该方法
LiveData通知其他组件原理主要是观察者设计模式。其优点有
简单来说,就是可以让你自己的类拥有像 activity 或 fragment 一样生命周期的功能。继承Lifecycle 的组件将生命周期脱离出 activity 而转到自己身上
使用步骤:
(1) 继承DefaultLifecycleObserver
class TestObserver implements DefaultLifecycleObserver {
@Override
public void onCreate(LifecycleOwner owner) {
// your code
}
}
(2) LifecycleOwner是只有一个方法getLifecycle()的接口,是让拥有生命周期的东西实现比如(activity)用来获取Lifecycle。在Android Support Library 26.1.0 及其之后已经activity 和 fragment 已经默认实现了LifecycleOwner
所以在 activity 里我们可以直接:
getLifecycle().addObserver(new MyObserver());
这样我们的MyObserver就会感知 activity 的生命周期了
Flowable
和Observable
RxJava1中使用Observable
和Observer
建立起订阅关系,但会产生背压问题。Rxjava2使用Flowable
和Subscriber
替换RaJava1的Observable
和Observer
。Flowable
是在Observable
的基础上优化后的产物,Observable
能解决的问题Flowable
也都能解决。但是并不代表Flowable
可以完全取代Observable
,Flowable
运行效率要比Observable
慢得多。
只有在需要处理背压问题时,才需要使用Flowable
Rxjava容易遭层内存泄漏。在订阅了事件后没有及时取阅,导致在activity或者fragment销毁后仍然占用着内存,无法释放。而disposable,可以用来取消订阅
参考Rxjava关于Disposable你应该知道的事
你是不是为了收集资料疲于奔命,是不是收藏好的资料至今还在收藏夹里吃灰,不知道从何看起?
Android面试题到处攒,一到面试就不知深浅忘个干净?快来看看这份超详细整理!
底层原理+项目实战+面试专题
1、底层原理(Android进阶、架构设计、NDK、跨平台、底层源码....)
2、项目实战(一线互联网大厂真实项目实战训练)
3、面试专题(大厂内推+简历优化+面试技巧+Android筑基+分布式+开源框架+微服务架构+性能优化+JVM 等一线互联网企业面试题)
资料对标对标阿里 P7,覆盖 99% 互联网公司技术要求
项目地址:Github
Android学习肯定不是光看书就能学会的,具体还是要自己上手写代码,如果有一份视频能让你看到全过程就好了。
所以关于视频我也整理了一部分:
视频包含:
1、IPC机制相关面试题视频解析
2、项目相关视频解析
3、性能优化相关面试题视频解析
4、JVM从入门到着迷
5、源码相关试题视频解析
6、BAT面试总结分析
Android学习三要素可以大大加快你的学习之旅
现在还缺一个脑图,关于Android 的学习必然是一个体系化的过程,下面我分享一下对标腾讯T7架构师的Android学习路线图:
以上内容全部免费分享给大家,有需要的同学可以点击:Github自行查看,也可以点击链接Android开发交流,群内获取。