学习福利
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
核心:分析在16ms中我们的应用做了什么工作,那些工作阻止我们在16ms时更新界面。
通常情况下,在16ms中我们有那些工作需要处理。
单以XML布局被绘制出来为例进行说明。
处理过程:
-
CPU负责把UI组件计算成多边形和纹理
-
OpenGL负责绘制图像(Display List)
-
GPU栅格化需要显示内容并渲染到屏幕上
而实际开发中我们还加入交互、业务处理等工作,这些工作都需要在16ms中处理完成。对于开发人员来说,需要有一个工具,很直观的帮助我们判断出那些工作占用了多少时间。
导致UI卡顿的原因:
-
1、认为在UI线程中做轻微耗时操作,导致UI线程卡顿;
-
2、布局layout过于复杂,无法再16ms内完成渲染;
-
3、同一时间动画执行次数过多,导致CPU或GPU负载过重;
-
4、View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而是CPU或GPU负载过重;
-
5、View的频繁绘制触发measure、layout,导致measure、layout累计耗时过多及整个View频繁地重新渲染;
-
6、内存频繁触发GC过多,导致暂时阻塞渲染操作;
-
7、冗余资源及逻辑等导致加载和执行缓慢;
-
8、ANR
3、UI卡顿总结
1、布局优化;
2、列表及Adapter优化;
3、背景和图片等内存分配优化;
4、避免ANR;
二、内存泄漏
======
1、java内存泄漏基础知识;
1)、java内存分配策略
a、静态存储区
b、栈区
c、堆区
2)、java是如何管理内存的
3)、java中的内存泄漏
内存泄漏是指无用对象(不再使用的对象)持续占有内存或者无用对象的内存得不到及时释放,从而造成的内存空间的浪费成为内存泄漏。
2、Android内存泄漏;
1)、单例
public class AppManager {
//有内存泄漏的问题:
// private static AppManager instance;
// private Context context;
// private AppManager(Context context) {
// this.context = context;
// }
// public static AppManager getInstance(Context context) {
// if (instance == null) {
// instance = new AppManager(context);
// }
// return instance;
// }
// 修复内存泄漏的写法:
private static AppManager instance;
private Context context;
private AppManager(Context context) {
this.context = context.getApplicationContext();// 使用Application 的context
}
public static AppManager getInstance(Context context) {
if (instance == null) {
instance = new AppManager(context);
}
return instance;
}
}
2)、匿名内部类
一般,把内部类设置为静态内部类,使其不会持有外部类的引用,从而就不会有内存泄漏的问题。
static class TestResource {
private static final String TAG = “”;
//…
}
3)、handler
handler造成内存泄漏的原因:handler是非静态内部类,持有外部类的引用,而handler内部会有未完成的message,message关联到handler,handler又关联到外部的activity,导致activity需要被回收的时候无法被回收,从而造成内存泄漏。
public class MainActivity extends AppCompatActivity {
//容易造成内存泄漏的写法:
// private Handler mHandler = new Handler() {
// @Override
// public void handleMessage(Message msg) {
// //…
// }
// };
//
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
// loadData();
// }
//
// private void loadData() {
// //…request
// Message message = Message.obtain();
// mHandler.sendMessage(message);
// }
//
// static class TestResource {
// private static final String TAG = “”;
// //…
// }
// 修复内存泄漏的方法:
private MyHandler mHandler = new MyHandler(this);
private TextView mTextView ;
private static class MyHandler extends Handler {
private WeakReference reference;
public MyHandler(Context context) {
reference = new WeakReference<>(context);
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = (MainActivity) reference.get();
总结
其实要轻松掌握很简单,要点就两个:
- 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
- 多练。 (视频优势是互动感强,容易集中注意力)
你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。**
[外链图片转存中…(img-7jzYpABk-1715904110920)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!