Android高级技术Android技术知识Android进阶之路

腾讯十年开发者发自腾讯一线的真实Android资料

2019-08-01  本文已影响7人  df556ada620a

前言

已经到8月份了,职场的金九银十跳槽季马上要来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息,就是好多公司在优化裁员,代表的就是滴滴、京东这种大型互联网公司,已经官宣了。

即使这种情况下,我相信,9.10月份仍然会有一波离职、求职潮。作为求职这来说,面试是一道坎,很多人会恐惧面试,即使是工作很多年的老鸟,可能仍存在面试的焦虑。

所以今天小编就在这面分享一波福利(文末有领取方式!),里面包含了一些高阶Android方面的技术资料,里面包括有高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术讲解,不多说直接上干货。

以下是本文的知识清单:

在这里由于文字较多,小编总结了一份高阶Android技术大纲和学习资料免费分享给大家,文末有领取!

1. SparseArray

当新建一个key为整型的HashMap时,会出现如下的提示信息,推荐使用SparseArray来替代HashMap:

接下来就来介绍下SparseArray:

a.数据结构:又称稀疏数组,内部通过两个数组分别存储key和value,并用压缩的方式来存储数据

b.优点:可替代key为int、value为Object的HashMap,相比于HashMap

c.适用场景:数据量不大(千以内)、空间比时间重要、需要使用Map且key为整型;不适合存储大容量数据,此时性能将退化至少50%

d.使用

添加:public void put(int key, E value)

删除:

查找:

e.get/put过程:元素会按照key从小到大进行存储,先使用二分法查询key对应在数组中的下标index,然后通过该index进行增删查。源码分析见SparseArray解析(https://www.jianshu.com/p/30a2bfb202b4

2. atomic包

a.原子操作类:

与采取悲观锁策略的synchronized不同,atomic包采用乐观锁策略去原子更新数据,并使用CAS技术具体实现

//保证自增线程安全的两种方式public class Sample { private static Integer count = 0; synchronized public static void increment() {  count++; }}public class Sample { private static AtomicInteger count = new AtomicInteger(0); public static void increment() {  count.getAndIncrement(); }}

基础知识:Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS(https://www.cnblogs.com/qjjazry/p/6581568.html)

b.类型

原子更新基本类型:

以AtomicInteger为例,常用方法:

原子更新数组:

以AtomicIntegerArray为例,常用方法:

原子更新引用类型:

//这几个类提供的方法基本一致,以AtomicReference为例public class AtomicDemo {private static AtomicReference<User> reference = new AtomicReference<>();public static void main(String[] args) { User user1 = new User("a", 1); reference.set(user1); User user2 = new User("b",2); User user = reference.getAndSet(user2); System.out.println(user);//输出User{userName='a', age=1} System.out.println(reference.get());//输出User{userName='b', age=2}}static class User { private String userName; private int age; public User(String userName, int age) {  this.userName = userName;  this.age = age; } @Override public String toString() {  return "User{" +"userName='" + userName + '\'' +", age=" + age + '}'; }}}

原子更新字段:

使用方法:由于原子更新字段类是抽象类,因此需要先通过其静态方法newUpdater创建一个更新器,并设置想更新的类和属性
注意:被更新的属性必须用public volatile修饰

//这几个类提供的方法基本一致,以AtomicIntegeFieldUpdater为例public class AtomicDemo {private static AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(User.class,"age");public static void main(String[] args) { User user = new User("a", 1); int oldValue = updater.getAndAdd(user, 5); System.out.println(oldValue);//输出1 System.out.println(updater.get(user));//输出6}static class User { private String userName; public volatile int age; public User(String userName, int age) {  this.userName = userName;  this.age = age; } @Override public String toString() {  return "User{" +"userName='" + userName + '\'' +", age=" + age +'}'; }}}

c.优点:

可以避免多线程的优先级倒置和死锁情况的发生,提升在高并发处理下的性能,相比于synchronized ,在非激烈竞争的情况下,开销更小,速度更快

3. Android埋点

a.含义:预先在目标应用采集数据,对特定用户行为或事件进行捕获、处理,并以一定方式上报至服务器,便于后续进行数据分析

b.方式

代码埋点:在某个事件发生时通过预先写好的代码来发送数据

无埋点/全埋点:在端上自动采集并上报尽可能多的数据,在计算时筛选出可用的数据

可视化埋点:通过可视化工具选择需要收集的埋点数据,下发配置给客户端,终端点击时获取当前点击的控件根据配置文件进行选择上报

几个实践:51信用卡(https://mp.weixin.qq.com/s/svzwQkAy0favp0Ty3NtoLA)、网易(https://mp.weixin.qq.com/s/0dHKu5QIBL_4S7Tum-qW2Q)、58同城(https://mp.weixin.qq.com/s/rP7PiN7lsnUxcY1BAhB_5Q)

4.Java基础之注解(Annotation)

a.含义:是附加在代码中的一些元数据,在JDK1.5 版本开始引入,与类、接口、枚举在同一个层次

b.作用:

声明在包、类、字段、方法、局部变量、方法参数等前面,用来对这些元素进行说明和注释

注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用,比如编译时进行格式检查、简化操作进而降低代码量

c.使用

以下代码展示了注解的定义、属性和使用的方法:

//1.注解的定义:通过@interface关键字//以下表示创建了一个名为TestAnnotation的注解public @interface TestAnnotation { //2.注解的属性://声明:采用“无形参的方法”形式,方法名表示属性名,返回值表示属性类型//类型:必须是8种基本数据类型,或者类、接口、注解及对应数组//默认值:用default关键值,在赋值时可以省略//以下表示注解TestAnnotation中有id和msg两个属性,且msg默认值为hiint id();String msg() default "hi";}//3.注解的使用://对属性赋值:在注解使用打个括号,以value=""形式,多个属性之前用逗号隔开;若注解只有一个属性,则赋值时value=可以省略;如果没有属性,括号都可以省略//以下表示对Test类进行标识,并对注解的适两个属性进行赋值@TestAnnotation(id=1,msg="hello")public class Test {}

d.类型:

元注解:是一种基本注解,用于解释注解,注意其描述对象是注解而非代码,包含类型如下表:

来段代码感受下这些注释的使用效果:

//表示TestAnnotation注释是对类描述的、保留到运行时、被添加到Javadoc、有继承性值的@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface TestAnnotation {}//由于B类是A类的子类,且B类没被任何注解应用,则B类继承了A类的TestAnnotation注解@TestAnnotationpublic class A {}public class B extends A {}

接下来用单独一个例子来解释可重复注解

//1.定义一个注解容器(此处指@Persons)://作用:存放其他注解(此处指@Person),其本身也是个注解//注意:需要有个value属性,类型就是被@Repeatable解释的注解数组(此处指Person[])@interface Persons { Person[] value();//注解属性}//2.使用@Repeatable解释(此处指@Person),括号中是注解容器类(此处指Persons)@Repeatable(Persons.class)@interface Person { String role default "";//注解属性}//3.使用@Repeatable解释的注释时,可以取多个注解值来解释代码@Person(role="coder")@Person(role="PM")public class SuperMan {//SuperMan既是程序员又是产品经理}

Java内置注解:下表展示了几个常用的内部已实现注解

自定义注解:在之前已经介绍了注解的定义、属性和使用的具体方法,还差一步,注解的提取,需要通过Java的反射技术获取类方法和字段的注解信息,常用方法:

在之前的Test类里就可以添加以下代码,来获取在类上给@TestAnnotation设置的属性值了:

boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);if (hasAnnotation) { TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class); System.out.println("id:"+testAnnotation.id());//输出1 System.out.println("msg:"+testAnnotation.msg());//输出hello}

如何进入腾讯阿里这种大型互联网公司?

大厂加班可能会比小厂要多,996为常态。但是相应的薪资待遇也是相当不错的,高级的工程师不管是移动端还是后端,年薪都是40W以上,所以很多程序员朋友一直以进大厂为目标。那么进大厂需要哪些条件呢?

这里我们来看一下这些大厂对于Android开发岗的技术要求;

如何学习这些大厂的主流技术?

可以看视频教程来搭建知识框架,体系化的深入学习。

这是个通用的方式,可能更加适合那些技术处于初级到中级阶段的朋友,当然,这里我说一点,我发现在很多看视频学习的朋友经常会犯这样的一个错误,就是对视频教程的欲望很强导致的松鼠病,什么意思呢?就是很多朋友到处找视频教程,然后各种囤积,顶多是这个看看,那个看看,感觉这个也好那个也好,于是这个也想看,那个也想看,导致的最终结果就是,视频教程倒是收集了不少,可是没有一个真正的看完过,你说,你是不是就是这样的?(此段话太过属实!)

记住,只留一套用来搭建知识框架,只留一套,一套,就一套!(如果你没有的话,我可以给你免费分享一套腾讯T3级别的视频教程),只提供参考,不是说每个人都能通过学习这份教程就能达到腾讯T3高级工程师级别。你如果有合适的学习方式记住一定不要中途而废!

然后你就靠这套视频教程来搭建知识框架,技术的深度和广度你都要涉及到。

最后,找个靠谱的大厂朋友内推会让你进大厂省去很多麻烦

上一篇下一篇

猜你喜欢

热点阅读