妥妥的去面试之Android基础(五)

笔者因为在近期须要找工做,因此近期最主要的任务就是准备面试,不打无准备之仗。只有你准备充分了,那么你想获得的机会才可能有机会入你怀中。android

笔者会将准备面试的学习过程记录下来,方便本身复盘的同时也但愿能给一道找工做的小伙伴们一些帮助。笔者准备的内容大纲以下面试

Android面试大纲.png

妥妥的去面试之Android基础(一)缓存

妥妥的去面试之Android基础(二)bash

妥妥的去面试之Android基础(三)post

妥妥的去面试之Android基础(四)性能

接下来开始本篇博客的正菜:学习

什么是OOM?

当前占用的内存加上申请的内存资源超过了Dalvk虚拟机的最大内存限制就会抛出Out Of Memory异常。优化

有什么方法能够避免OOM?动画

OOM在不少状况下都是由于图片加载问题,因此针对bitmap的优化能够在某种程度上避免OOM的发生ui

  • 对图片进行压缩(经过采样率)
  • 及时释放Bitmap内存
  • 选择合适的解码方式

还有没有其余的方法?

  • 适当使用软引用和弱引用
  • 采用内存缓存和磁盘缓存
  • 避免建立过多的对象,内存对象的重复利用(好比ListView中的convertview的复用)。
  • 避免在Android中使用Enum,枚举占用的内存比整型大多了。 -避免在onDraw方法里面执行对象的建立

说说你知道的内存泄露的场景?

1.静态变量持有外部类的引用

静态变量和应用的生命周期同样,由于静态变量持有外部类的引用,当外部类被销毁时,就会致使外部类没法被GC,引发内存泄漏。因此尽可能不要使用静态变量

2.单例模式引发的内存泄露

单例模式的对象的生命周期和应用程序同样长,因此它持有的引用也不能被GC,因此会引发内存泄露。

因此在单例模式中,能够把单例对象的引用指向整个应用,就能够避免内存泄露。好比正确的单例模式写法以下:

public class AppManager {
    private static AppManager instance;
    private Context context;
    private AppManager(Context context) {
        //this.context = context;  //会引发内存泄漏
        this.context = context.getApplicationContext();  //指向应用
    }
    public static AppManager getInstance(Context context) {
        if (instance != null) {
            instance = new AppManager(context);
        }
        return instance;
    }
复制代码

3.AsyncTask引发的内存泄露

AsyncTask是持有外部类的引用的,当它后台任务没有完成时,它会致使外部类的引用没法被回收,引发内存泄漏。

因此能够经过让AsyncTask变成静态内部类,这样就不会持有外部类的引用了。 或者让它持有外部类的弱引用。

4.使用完的资源未关闭

好比说在Bitmap在使用完后必定要关闭资源(调用它的recycle方法)

5.注册没取消形成的内存泄漏

好比调用registerReceiver后未调用unregisterReceiver。

广播注册通常有几种,各有什么优缺点?

  • 第一种是常驻型(静态注册):当应用程序关闭后若是有信息广播来,程序也会被系统调用,本身运行。
  • 第二种不常驻(动态注册):广播会跟随程序的生命周期。

动态注册

优势: 在android的广播机制中,动态注册优先级高于静态注册优先级,所以在必要状况下,是须要动态注册广播接收者的。

缺点: 当用来注册的 Activity 关掉后,广播也就失效了。

静态注册

优势: 无需担心广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。

Recyclerview和Listview的区别

  • 在ListView中,ViewHolder须要本身来定义。经过ViewHolder能够缓存item里的view控件实例,避免了在getview中重复建立带来的性能损耗,但这只是一种推荐的使用方式,不是必须使用的。而在RecyclerView中使用RecyclerView.ViewHolder则变成了必须,尽管实现起来稍显复杂,可是在性能提高上有很大的好处。
  • ListView只能在垂直方向上滚动,Android API没有提供直接让ListView在水平方向上面滚动的支持。但RecyclerView提供了多种类型的展现方式,很容易就能修改展现方式。 。
  • ListView对item的点击事件实现较为简单,Recyclerview的点击事件实现就相对复杂,但灵活性高。
  • ListView没有提供局部刷新,RecyclerView提供了局部刷新的方法,并且在局部刷新的时候有一个渐变的动画效果。

说说安卓为啥要加签名机制?

  • 用于发送者的身份验证。因为开发商可能经过使用相同的 Package Name 来混淆替换已经安装的程序,以此保证签名不一样的包不被替换。
  • 保证信息传输的完整性。签名对于包中的每一个文件进行处理,以此确保包中内容不被替换。
  • 防止交易中的抵赖发生, Market 对软件的要求。
相关文章
相关标签/搜索