结尾
最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
1.Looper总结
- Looper通过prepare方法进行实例化,先从他的成员变量sThreadLocal中拿取,没有的话就new 一个Looper,然后放到sThreadLocal中缓存。每个线程只能创建一个Looper实例
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));
}
-
Looper通过loop方法开启循环队列,里面开启了死循环,没有msg时候会阻塞
-
在ActivityThread的main方法中也就是Activity启动的时候,已经调用了Looper.prepareMainLopper()方法
2.ThreadLocal在Looper中的使用
为了解决多个线程访问同一个数据问题,同步锁的思路是线程不能同时访问一片内存区域.而ThreadLocal的思路是,干脆给每个线程Copy一份一摸一样的对象,线程之间各自玩自己的,互相不影响对方
常见ThreadLocal应用场景:确保在每一个线程中只有一个Looper的实例对象
- ThreadLocal的set方法
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
- ThreadLocal的get方法
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的成员变量)
3.Service 和 IntentService
Activity对事件响应不超过5秒,BroadcastReceiver执行不超过10秒,Service耗时操作为20秒。否则系统会报ANR
-
使用startService()方法启用服务后,调用者与服务之间没有关连。调用者直接退出而没有调用stopService的话,Service会一直在后台运行
-
使用bindService()方法启用服务,调用者与服务绑定在一起了,调用者一旦退出,服务也就自动终止
-
IntentService是Service的子类,会创建子线程来处理所有的Intent请求,其onHandleIntent()方法实现的代码,无需处理多线程问题
4.FragmentPageAdapter和FragmentPageStateAdapter的区别
-
FragmentPageAdapter在每次切换页面的的时候,没有完全销毁Fragment,适用于固定的,少量的Fragment情况。默认notifyDataSetChanged()刷新是无效的
-
FragmentPageStateAdapter在每次切换页面的时候,是将Fragment进行回收,适合页面较多的Fragment使用,这样就不会消耗更多的内存
5.Sqlite数据库,什么是事务
事务是由一个或多个sql语句组成的一个整体,如果所有语句执行成功那么修改将会全部生效,如果一条sql语句将销量+1,下一条再+1,倘若第二条失败,那么销量将撤销第一条sql语句的+1操作,只有在该事务中所有的语句都执行成功才会将修改加入数据库中
6.怎么做Sqlite数据库升级
-
直接删除老数据库,但会造成数据丢失,一般不采用
-
对数据库进行升级,参考SQLite数据库版本升级
7.invalidate与requestLayout区别
-
view调用invalidate将导致当前view的重绘,viewGroup调用invalidate会使viewGroup的子view调用draw
-
requestLayout方法只会导致当前view的measure和layout,而draw不一定被执行。只有当view的位置发生改变才会执行draw方法
8.View和ViewGroup区别
-
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框架知识
1.buttnife实现原理
通过注解处理器动态生成java文件,在java文件中进行findViewById和setOnClickListener操作
2. EventBus实现原理
通过观察者设计模式,先通过注册的方式将指定的类加到一个表里面,等发送消息时轮训那个表,依据注解和注解的value找到匹配的方法,然后执行该方法
3.LiveData原理
LiveData通知其他组件原理主要是观察者设计模式。其优点有
-
遵从应用程序的生命周期,如在Activity中如果数据更新了但Activity已经是destroy状态,LivaeData就不会通知Activity(observer)
-
不会造成内存泄漏
4.Lifecycle
简单来说,就是可以让你自己的类拥有像 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 的生命周期了
5.Flowable
和Observable
RxJava1中使用Observable
和Observer
建立起订阅关系,但会产生背压问题。Rxjava2使用Flowable
和Subscriber
替换RaJava1的Observable
和Observer
。Flowable
是在Observable
的基础上优化后的产物,Observable
能解决的问题Flowable
也都能解决。但是并不代表Flowable
可以完全取代Observable
,Flowable
运行效率要比Observable
慢得多。
只有在需要处理背压问题时,才需要使用Flowable
-
当上下游在不同的线程中,通过Observable发射,处理,响应数据流时,如果上游发射数据的速度快于下游接收处理数据的速度,这样对于那些没来得及处理的数据就会造成积压,这些数据既不会丢失,也不会被垃圾回收机制回收,而是存放在一个异步缓存池中,如果缓存池中的数据一直得不到处理,越积越多,最后就会造成内存溢出,这便是响应式编程中的背压(backpressure)问题
-
如果能够确定:
1.上下游运行在同一个线程中
2.上下游工作在不同的线程中,但是下游处理数据的速度不慢于上游发射数据的速度
3.上下游工作在不同的线程中,但是数据流中只有一条数,
则不会产生背压问题,就没有必要使用Flowable,以免影响性能。
6.app优化
-
内存优化:使用leakcanary抓取内存泄露,或者使用android studio抓取内存信息,通过Profiler分析内存泄露情况
-
体积优化
-
不复杂图片使用svg代替png。换肤时使用着色器,可减少图片资源
-
build文件配置
-
保留指定语言
-
保留指定so库架构
-
开启混淆压缩
7.Rxjava中关于Disposable
Rxjava容易遭层内存泄漏。在订阅了事件后没有及时取阅,导致在activity或者fragment销毁后仍然占用着内存,无法释放。而disposable,可以用来取消订阅
最后
–
你是不是为了收集资料疲于奔命,是不是收藏好的资料至今还在收藏夹里吃灰,不知道从何看起?
Android面试题到处攒,一到面试就不知深浅忘个干净?快来看看这份超详细整理!
底层原理+项目实战+面试专题
1、底层原理(Android进阶、架构设计、NDK、跨平台、底层源码…)
最后
总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。
这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
毕竟不管遇到什么样的面试官,去面试首先最主要的就是自己的实力,只要实力够硬,技术够强,就不怕面试拿不到offer!
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
g-y4lsNfP2-1715900600486)]
[外链图片转存中…(img-lD0U8HbA-1715900600486)]
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!
[外链图片转存中…(img-jfIzk6g8-1715900600487)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!