准备

MyBatis 和 Hibernate 的相同和不同处,以及实用场景;
Redis 存储和数据库存储的区别;
MVP 架构模式的优点和缺点,与 MVC 的比较;
Android 多进程 通信;
目前在职公司的产品介绍和自己负责的模块;
Android 内存泄露,举例几个容易发生内存泄露的场景;
–内存泄露
指 程序申请内存之后,无法释放已经申请的内存空间,一次内存泄露可以忽略,但是
内存泄露堆积的后果很严重,无论多少内存迟早被占光
1 静态变量导致的内存泄露
静态变量持有Activity,静态变量不会被回收,所以导致activity 无法释放

2 单例模式导致的内存泄露

3 属性动画导致的内存泄露
如果在Activity中播放此类动画,并且没有在onDestroy中去停止动画,那么动画会一直播放下去,
尽管已经无法在界面看到动画效果了。并且这个时候Activity 的View会被动画持有,而View又持有了Activity,
最终Activity无法释放。
解决 方法是在Activity的onDestory中调用animator.cancel()

Android 插件化的原理;
OKHttp 的源码和原理
Retrofit 的源码和原理;
RecyclerView 中的 LayoutManager ;


自我介绍,公司产品介绍,负责哪一块;
写博客的意义,为什么开始写博客,还问了“简书程序员优秀作者”这个 title 怎么搞到的,哈哈哈;
Kotlin 和 Java 相比,有哪些优点,有没有在实际项目中使用;

MVC 、MVP 和 MVVM 三种架构的区别和优点;
MVC的特点
1 用户可以向View发送指令,再由View要求Model改变状态
2 用户也可以直接向Controller发送指令,再由Controller发送给View
3 Controller起到事件路由的作用,业务逻辑都部署在Controller里

MVC 优点

1 耦合性低,视图层和业务层分离,这样允许更改视图层代码而不用重写模型和控制器代码
2 开发和维护成本低,易于维护和修改

MVC 缺点

1.不适合小规模项目,不得不花费相当可观的时间去考虑如何将MVC模式运用到程序中
2.视图和控制器过于紧密连接
3.视图对模型访问效率低

MVP 特点

1 M V P 之间双向通信
2 View和Model之间不通信,他们之间通过Presenter传递。Presenter完全把View和Model进行了分离
主要逻辑在Presenter里实现。
3 View 不部署任何业务逻辑,Presenter 部署所有业务逻辑
4 Presenter 与具体的View 没有直接关联,而是通过定义好的接口进行交互,从而是变更View的时候
可以保护Presenter不变,这样可以复用。

MVP 的优点

1 Model 和View 完全分离,我们可以改View而不影响Model
2 可以更高效的使用Model,因为所有交互都发生在 Presenter内部
3 我们可以将一个Presenter用于多个View,而不需要改变Presenter 的逻辑
4 如果我们把逻辑放在presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)
MVP 的缺点
- 由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁。还有一点需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了
MVVM特点
-View和Model进行了双向绑定,两者之间有一方发生变化则会反应在另一方

MVVM 的优点-

MVP和MVC的主要区别是,MVP的View不能直接访问Model,需要通过Presenter发送请求,View和Model
不能直接通信。
MVP和MVVM的主要区别是,MVP 的View更新需要通过Presenter,而MVVM不需要,因为View 和
Model进行了双向绑定,数据的修改会直接反应在View上,而View的修改也会导致数据变更
,此时ViewModel需要做的是业务逻辑处理,以及修改View和Model的状态

Vue.js 数据和视图双向绑定的原理,emmmmmm,这个真的不知道,只知道有个 v-bind 这东东;
Retrofit 框架的源码以及原理;
Android 插件化框架的原理;
热更新框架的原理;
HTTPS 的原理;
目前在职公司 Java 开发的架构;
Android 内存泄露,举例几个容易发生内存泄露的场景;
Android Native 和 JS 通信有几种方式,有没有用到什么框架之类的;
Android 布局优化相关的问题,就回答了 include 、 merge 标签和 ViewStub 以及降低 View 层级之类的;
有没有了解过 React Native 或者 Weex ;


单元测试有没有做过,说说熟悉的单元测试框架;
Retrofit 框架的原,里面使用到的注解是编译时注解还是运行时注解;
RxJava 操作符,map 和 flatMap 的区别;
Fragment 在 ViewPager 里面的生命周期,滑动 ViewPager 的页面时 Fragment 的生命周期的变化;
内存泄漏。举例有哪些情况会发生内存泄漏;
Gradle 打包;
AOP IOC 的好处以及在 Android 开发中的应用;
View 触摸事件分发机制;
Java基础: static 和 final 关键字的用法;
ArrayList 和 LinkedList 的区别和使用场景;
MVC 、MVP 和 MVVM 三种架构的区别和优点;
Dagger2 框架中 @module 和 @component 的区别;
Kotlin 特性,和 Java 相比有什么不同的地方;
MVP 架构中 Presenter 定义为接口有什么好处;

–1 Presenter主要作为沟通View和Model的桥梁,它从Model层检索数据,返回给View层
2 试的View和Model之间没有耦合,也将业务逻辑从View上抽离出来

Jenkins持续集成;
Android 插件化的原理;
Handler 、MessageQueue 、Looper三者的关系和原理;
1、首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。

2、Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。

3、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。

4、Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。

5、在构造Handler实例时,我们会重写handleMessage方法,也就是msg.target.dispatchMessage(msg)最终调用的方法。

好了,总结完成,大家可能还会问,那么在Activity中,我们并没有显示的调用Looper.prepare()和Looper.loop()方法,
为啥Handler可以成功创建呢,这是因为在Activity的启动代码中,已经在当前UI线程调用了Looper.prepare()和Looper.loop()方法。

对于 Android 开发,自己擅长哪方面;
Java动态代理的使用,InvocationHandler 有什么用;
为什么 Google 会推出Fragment ,有什么好处和用途? 直接用 View 代替不行么?

–1 目的是为了解决不同屏幕分辩率的动态和灵活UI设计

2 Fragment优点

Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。

Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。

Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。

Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。

Fragment 解决Activity间的切换不流畅,轻量切换。

Fragment 替代TabActivity做导航,性能更好。

Fragment 在4.2.版本中新增嵌套fragment使用方法,能够生成更好的界面效果。

Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能。

可以从startActivityForResult中接收到返回结果,但是View不能

对页面逻辑解耦带来了极大的方便。其拥有自己的生命周期,便于我们来控制和管理页面的状态变化

3.


第一轮电话面试

项目介绍,自己负责哪些内容;
安卓安全方面了解过吗,反编译、加壳之类的;
MVC 、MVP 和 MVVM 三种架构的区别和优点;
Retrofit框架的原理,感觉这个每次都会被问到。。。;
HTTPS 握手的步骤和过程;
Jenkins 自动构建;
Android Studio 3.0 中 Gradle 的 api 和 implementation 有什么区别;
HandlerThread 的原理和使用场景;
AsnycTask 的原理和使用场景;
Handler 、MessageQueue 、Looper三者的关系和原理;
Android 插件化的原理;
热修复的原理;
应用程序崩溃统计以及数据分析;

第二轮现场面试

Android 插件化的原理;
热修复的原理;
Java GC 回收,如何判断对象存活;
Java GC 算法;
AsyncTask 、HanlderThread 、IntentService 的原理和使用场景;
会哪些 RxJava 操作符,map 和 flatMap 的区别;
Retrofit框架的原理,emmmmmm ,又是这个;
Bitmap 优化;
RecyclerView 和 ListView 的相同和不同点,在 item 回收上有什么不同;
View 事件分发机制;
说说 apk 打包流程;
有没有做过 apk 多渠道打包;
Android 组件化的原理,还有一些组件化平时使用的问题;
Binder 有没有了解过;
HashMap 的存储原理;
Kotlin 特性,和 Java 相比有什么不同的地方;
Android Framework层有没有了解过,说说 Window 窗口添加的过程;
Window Activity View 三者的关系;
消息推送有没有做过,推送到达率的问题;
Android 分享 SDK 有没有做过;

第三轮现场面试

过了一天,有人加我微信,说再约一次技术面,是团队里面的 Leader 来面试我。没办法,继续干,又约在了工作日晚上面试。

项目介绍,负责内容等;
HTTPS 的原理;
HTTP 2.0 有没有了解过;
讨论技术和业务哪个重要;
Android 热修复原理;

****************************5.23**************************

Bitmap 优化
如何高效的加载bitmap?
–BitmapFactory.Options来加载所需尺寸的图片,假设通过ImageView来显示图片,ImageView并没有图片
的原始尺寸那么大,这时候需要把整个图片加载进来后在设给ImageView,因为ImageView没有办法显示原始
图片。通过BitmapFactory.Options就可以按照一定的采样率来加载缩小后的图片,将缩小后的图片在ImageView
显示,这样可以降低内存,从而避免一定程度上OOM,提高加载Bitmap加载时的性能。

****************线性表 和 链表的区别*******************

线性表 (List):零个或多个数据元素的有限序列
1 序列
2 有限的
3 插入操作 时间复杂度 O(1)

线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素。
eg 数组存储顺序表
优点:无须为表示表中元素之间的逻辑关系而增加额外的存储空间
可以快速存取任意位置的元素
缺点:插入删除操作,需要移动大量元素
当线性表长度变化大时难以确定存储空间

链式存储结构:n个结点链结成一个链表
数据域 指针域,两部分信息组成的数据元素的存储映像,称为结点(Node)。
//线性表的单链表存储结构
typedef int ElemType;
typedef struct Node
{
ElemType date;
struct Node *next;
}Node;
typedef struct Node LinkList;/定义LinkList*/

***************匿名内部类**********

匿名内部类适合那种只需要一次使用的类,写法很简洁
创建匿名内部类的时候会立即创建一个该类的实例,这个类的定义立即消失,匿名内部类不能重复使用
匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建内部类的对象
匿名内部类不能定义构造器,由于匿名内部类没有类名,所以无法定义构造器。

创建匿名内部类的方式
一 常用 创建某个接口类型的对象
二 通过继承父类创建匿名内部类


interface Product {
public String getName();
}

public class AnonymousTest {
public void test(Product p) {
System.out.println(p.getName());
}
public static void main(Sting[] args) {
AnonymousTest ta = new AnonymousTest();
//调用test()方法,需要传入一个Product参数,此处传入其匿名类实现类的实例
ta.test(new Product() {
public getName() {
return “显卡”;
}
});
}
}


abstract class Device {
private String name;
public abstarct double getPrice();
public Device() {};
public Device() {
this.name = name;
}
//省略
}
public class AnonymousInner {
public void test(Device d) {
System.out.get
}
}


为什么使用支持库版本fragment?
–因为升级支持库版的fragment,我们只需要下载升级包,重新编译
发布一个新的版本应用就行了。
唯一的缺点:导入支持库会占用空间


Android 性能优化

问题: 内存溢出(内存),卡顿或ANR(CPU)

  1. 布局优化
    首先 删除布局中无用的控件和层级,有选择的使用性能低的ViewGroup,如RelativeLayout. 性能 :布局层级少,CPU 花费时间:Framelayout = LinearLayout < RelativeLayout
    其次 ,通过采用 < include> 标签,< merge >标签和 ViewStub
    < include > 用于布局重用
    < merge > 一般和< include > 搭配使用,减少布局的层级
    ViewStub 提供按需加载的功能

  2. 绘制优化
    指- View 的 onDraw 方法避免大量操作
    a. onDraw 不要创建新的局部对象,因为 onDraw 会被频繁调用,产生大量临时对象,占用内存,导致频繁gc降低效率
    b. onDraw 方法不要做耗时操作,也不能执行成千上万的循环操作。因为大量的循环抢占CPU的时间片,造成view绘制不流畅。

    添加log监控时间 :
    在函数开始 :long time = System.nanoTime();
    在函数结尾:log.info(“TasteTime:” + (System.nanoTime() - time));

  3. 内存泄漏优化
    内存泄漏-申请的内存不能及时释放,memory leak
    场景一:静态变量引用导致的内存泄露
    public class MainActivity extends Activity {
    public static Context sContext;
    protected void onCreate (Bundle saveInstanceState) {
    super.oncreate(saveInstanceState);
    sContext = this;
    }
    }
    问题:Activity由于被静态变量sContext引用,无法正常销毁。静态变量随着类的加载而存在,随着类的消失而消失,不会被GC回收。

    场景二:

  4. 内存分析工具
  5. 代码检测
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值