Android FrameWork 知识点与面试题整合~

这篇具有很好参考价值的文章主要介绍了Android FrameWork 知识点与面试题整合~。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.如何对 Android 应用进行性能分析

android 性能主要之响应速度 和UI刷新速度。

首先从函数的耗时来说,有一个工具TraceView 这是androidsdk自带的工作,用于测量函数耗时的。

UI布局的分析,可以有2块,一块就是Hierarchy Viewer 可以看到View的布局层次,以及每个View刷新加载的时间。

这样可以很快定位到那块layout & View 耗时最长。

还有就是通过自定义View来减少view的层次。

2.什么情况下会导致内存泄露?

内存泄露是个折腾的问题。
什么时候会发生内存泄露?内存泄露的根本原因:长生命周期的对象持有短生命周期的对象。短周期对象就无法及时释放。

I. 静态集合类引起内存泄露
主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。

II.remove 方法无法删除set集 Objects.hash(firstName, lastName);
经过测试,hashcode修改后,就没有办法remove了。

III. observer 我们在使用监听器的时候,往往是addxxxlistener,但是当我们不需要的时候,忘记removexxxlistener,就容易内存leak。
广播没有unregisterrecevier

IV.各种数据链接没有关闭,数据库contentprovider,io,sokect等。cursor

V.内部类:
java中的内部类(匿名内部类),会持有宿主类的强引用this。
所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。
Context的引用,当TextView 等等都会持有上下文的引用。如果有static drawable,就会导致该内存无法释放。

VI.单例
单例 是一个全局的静态对象,当持有某个复制的类A是,A无法被释放,内存leak。

3.如何避免 OOM 异常?

首先OOM是什么?
当程序需要申请一段“大”内存,但是虚拟机没有办法及时的给到,即使做了GC操作以后
这就会抛出 OutOfMemoryException 也就是OOM

Android的OOM怎么样?
为了减少单个APP对整个系统的影响,android为每个app设置了一个内存上限。

    public void getMemoryLimited(Activity context)
    {
        ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        System.out.println(activityManager.getMemoryClass());
        System.out.println(activityManager.getLargeMemoryClass());
        System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024));
    }
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 512
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192

HTC M7实测,192M上限。512M 一般情况下,192M就是上限,但是由于某些特殊情况,android允许使用一个更大的RAM。

如何避免OOM

减少内存对象的占用
I.ArrayMap/SparseArray代替hashmap
II.避免在android里面使用Enum
III.减少bitmap的内存占用

  • inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。
  • decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。

IV.减少资源图片的大小,过大的图片可以考虑分段加载

内存对象的重复利用

大多数对象的复用,都是利用对象池的技术。

I.listview/gridview/recycleview contentview的复用
II.inBitmap 属性对于内存对象的复用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8
这个方法在某些条件下非常有用,比如要加载上千张图片的时候。
III.避免在ondraw方法里面 new对象
IV.StringBuilder 代替+

4.Android 中如何捕获未捕获的异常

UncaughtExceptionHandler

1、自 定 义 一 个 Application , 比 如 叫 MyApplication 继 承 Application 实 现UncaughtExceptionHandler。
2、覆写 UncaughtExceptionHandler 的 onCreate 和 uncaughtException 方法。

@Override
    public void onCreate() {
        super.onCreate();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    @Override
    public void uncaughtException(final Thread thread, final Throwable ex) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                System.out.println(Thread.currentThread());
                Toast.makeText(getApplicationContext(), "thread=" + thread.getId() + "
                        ex = "+ex.toString(), 1).show();
                        Looper.loop();
            }
        }).start();
        SystemClock.sleep(3000);
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

注意:上面的代码只是简单的将异常打印出来。
在 onCreate 方法中我们给 Thread 类设置默认异常处理 handler,如果这句代码不执行则一切都是白搭。
在 uncaughtException 方法中我们必须新开辟个线程进行我们异常的收集工作,然后将系统给杀死。
3、在 AndroidManifest 中配置该 Application

<application
android:name="com.example.uncatchexception.MyApplication"}

Bug 收集工具 Crashlytics

Crashlytics 是专门为移动应用开发者提供的保存和分析应用崩溃的工具。国内主要使用的是友盟做数据统计。
Crashlytics 的好处:
1.Crashlytics 不会漏掉任何应用崩溃信息。
2.Crashlytics 可以象 Bug 管理工具那样,管理这些崩溃日志。
3. Crashlytics 可以每天和每周将崩溃信息汇总发到你的邮箱,所有信息一目了然
使用步骤:
1.注册需要审核通过才能使用,国内同类产品顶多发个邮箱激活链接;
2.支持 Eclipse、Intellij IDEA 和 Android Studio 等三大 IDE;
3.Eclipse 插件是 iOS 主题风格 UI,跟其他 plugin 在一起简直是鹤立鸡群;
4.只要登录帐号并选择项目,会自动导入 jar 包并生成一个序列号,然后在 AndroidManifest.xml和启动 Activity 的入口添加初始化代码, 可以说是一键式操作, 当然要使用除错误统计外的其他功能还是得自己添加代码;
5.不像友盟等国内同类产品,将固定的序列号直接写入 xml 文件,而是动态自动生成的;当然这个存放序列号的 xml 文件也是不能修改和提交到版本控制系统的;
6.后台可以设置邮件提醒,当然这个最好不要开启,Android 开发那数量惊人、千奇百怪的错误信息你懂的。
7.不仅能统计到 UncaughtException 这种未捕获的 Crash 异常信息,只要在 try/catch 代码块的catch 中添加一行代码就能统计到任何异常;

try{ 
    myMethodThatThrows(); 

}catch(Exception  e){ 
    Crashlytics.logException(e); 
}

8.相当详细的错误信息,不仅仅是简单的打印 StackTrace 信息;并且能看到最近一次 crash 的机器可用内存等信息,而不仅仅是简单统计机型和版本号。

5.ANR 是什么?怎样避免和解决 ANR(重要)

ANR->Application Not Responding

也就是在规定的时间内,没有响应。

三种类型:
1). KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在特定时间内无响应
2). BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成
3). ServiceTimeout(20 seconds) --小概率类型 Service在特定的时间内无法处理完成

为什么会超时:事件没有机会处理 & 事件处理超时

怎么避免ANR

ANR的关键
是处理超时,所以应该避免在UI线程,BroadcastReceiver 还有service主线程中,处理复杂的逻辑和计算
而交给work thread操作。
1)避免在activity里面做耗时操作,oncreate & onresume
2)避免在onReceiver里面做过多操作
3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。
4)尽量使用handler来处理UI thread & workthread的交互。

如何解决ANR
首先定位ANR发生的log:

04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}.  5009.8ms since event, 5009.5ms since waitstarted
CPUusage from 4361ms to 699ms ago ----CPU在ANR发生前的使用情况
04-0113:12:15.872 E/ActivityManager(  220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait
04-0113:12:15.872 E/ActivityManager(  220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量

从log可以看出,cpu在做大量的io操作。

所以可以查看io操作的地方。

当然,也有可能cpu占用不高,那就是 主线程被block住了。

6.Android 线程间通信有哪几种方式

1)共享变量(内存)
2)管道
3)handle机制
runOnUiThread(Runnable)
view.post(Runnable)

7.Devik 进程,linux 进程,线程的区别

Dalvik进程。
每一个android app都会独立占用一个dvm虚拟机,运行在linux系统中。
所以dalvik进程和linux进程是可以理解为一个概念。

8.描述一下 android 的系统架构

从小到上就是:
linux kernel,lib dalvik vm ,application framework, app

9.android 应用对内存是如何限制的?我们应该如何合理使用内存?

activitymanager.getMemoryClass() 获取内存限制。

关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。

10. 简述 android 应用程序结构是哪些

1)main code
2)unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术.
google建议只把启动图片放入。
5)lib
6)color

11.请解释下 Android 程序运行时权限与文件系统权限的区别
12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么
13.多线程间通信和多进程之间通信有什么不同,分别怎么实现
14.Android 屏幕适配
15.什么是 AIDL 以及如何使用
16.Handler 机制
17.事件分发机制
18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么
19.子线程中能不能 new handler?为什么
20.Android 中的动画有哪几类,它们的特点和区别是什么
21.如何修改 Activity 进入和退出动画
22.SurfaceView & View 的区别

Android FrameWork 知识点与面试题整合~

由于文章篇幅长度原因,答案就不一一展示了,如想参与学习该Android FrameWork 相关学习文档或更多Android相关学习文档都可以访问: https://qr18.cn/CgxrRy查阅

项目框架的使用

23.开发中都使用过哪些框架、平台

EventBus 事件分发机制,由handler实现,线程间通信
II.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils
III.百度地图
IV.volley
V.fastjson
VI.picciso
VII.友盟
VIII.zxing
IX.Gson

24.使用过那些自定义View
25.自定义控件:绘制圆环的实现过程
26.自定义控件:摩天轮的实现过程
27.GridLayout的使用
28.流式布局的实现过程

由于文章篇幅长度原因,答案就不一一展示了,如想参与学习该Android FrameWork 相关学习文档或更多Android相关学习文档都可以访问: https://qr18.cn/CgxrRy查阅

Android FrameWork 知识点与面试题整合~文章来源地址https://www.toymoban.com/news/detail-412894.html

到了这里,关于Android FrameWork 知识点与面试题整合~的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯单片机知识点整合——临时抱佛脚

    目录 复习使用,代码根据网上资料修改,仅供参考 ds1302 原理图  手册 ds1302.c main.c onewire 原理图 手册 onewire.c main.c IIC PCF8591 原理图 手册 iic.c main.c AT2402 原理图 手册 main.c 串口UART uart.c main.c 发送数据 中断接收数据 超声波 ult.c main.c N555频率输出 main.c PWM控制LED ———————

    2023年04月24日
    浏览(56)
  • 2023面试知识点一

    默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 t

    2024年02月07日
    浏览(40)
  • Java 面试知识点

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的 语法,集合的语法,io 的语法,虚拟机方面的语法。 和都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否

    2024年02月16日
    浏览(43)
  • vue面试知识点

    Unsplash class 和 style 使用动态属性,使用驼峰式写法 v-if 和 v-show v-if 不渲染不满足判断条件的模块, v-show 渲染但不显示,使用场景:是否多次切换或频繁更新条件状态 keep-alive 缓存组件,使用场景:频繁切换,不需要重复渲染 v-for 中添加唯一的 key 为了高效的更新虚拟 DOM,

    2024年02月11日
    浏览(44)
  • 多线程面试相关知识点

    程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一

    2024年02月08日
    浏览(45)
  • FPGA面试-常用知识点

    本贴记录一下自己找工作过程中顺下来的知识点,如有错误的,请不吝指出,共同进步!   a) FPGA FPGA 基于 LUT ,LUT本质上就是一个RAM,每一个LUT可以看成一个有4位地址线的16x1的RAM。这也是为什么FPGA需要外接一个rom来上电配置。 包括 CLBs , I/O 块, RAM 块和可编程连线 。 在

    2024年04月26日
    浏览(45)
  • java面试常见知识点

    JDK(Java Development Kit)是Java开发工具包,是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 JRE是运行基于Java语言编写的程序所不可缺少的运行环境。JRE中包含了JVM,runtime class libraries和Jav

    2024年02月11日
    浏览(56)
  • 定制自己的 AI 角色CustomChar;AI知识点和面试题;提高llama 3 的微调速度Unsloth

    ✨ 1: CustomChar 允许你创建和定制自己的 AI 角色 CustomChar 是一个开源项目,它允许你创建和定制自己的 AI 角色。无论是游戏中的角色,还是个人的虚拟助手(比如电脑上的 JARVIS),甚至是在线教育体验中的虚拟朋友或老师,CustomChar 都能让这些角色变得生动而有趣。 地址:

    2024年04月24日
    浏览(45)
  • 面试常见知识点--树的遍历

    算法流程 : 1. 先申请一个栈,记为 stk 。 2 .然后将根节点压入 stk 中。 3 .每次从 stk 中弹出栈顶节点,记为 cur ,然后打印 cur 的值。如果 cur 的右子树不为空,将 cur 的右子树压入 stk 中。如果 cur 的左子树不为空,将 cur 的左子树压入 stk 中。不断重复次步骤直到 stk 为空循

    2024年02月01日
    浏览(45)
  • 最全前端 HTML 面试知识点

    1.1.1 定义 超文本标记语言(英语:HyperTextMarkupLanguage,简称:HTML)是一种用于创建网页的标准标记语言 HTML元素是构建网站的基石 标记语言 (markup language ) 由无数个标记(标签、tag)组成 是对某些内容进行特殊的标记,以供其他解释器识别处理 使用标记的文本会被识别为“

    2024年02月20日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包