`

9102年底将至,BAT高级开发21道汇总:Bitmap+Handler+性能优化篇

阅读更多

前言

面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责

今天给大家分享下我整理的BAT架构面试专题及答案,其中大部分都是大企业面试常问的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖全部方式,不过也希望能对即将找工作的朋友起到一些帮助!在这由于文字很多,我总结了Android面试所涉及到的常问范围及架构面试专题和答案解析和架构视频资料分享给大家


更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以点击关于我联系我获取完整PDF或者互相交流
(VX:mm14525201314)

 

今天先来分析一下Bitmap+Handler+性能优化

一.Bitmap

1、Bitmap 使用需要注意哪些问题 ?

参考回答:

1)要选择合适的图片规格(bitmap 类型): 通常我们优化Bitmap 时,当需要做性能优化或者防止 OOM,我们通常会使用 RGB_565,因为 ALPHA_8 只有透明度,显示一般图片没有意义,Bitmap.Config.ARGB_4444 显示图片不清楚,Bitmap.Config.ARGB_8888 占用内存最多。:

  • ALPHA_8 每个像素占用 1byte 内存
  • ARGB_4444 每个像素占用 2byte 内存
  • ARGB_8888 每个像素占用 4byte 内存(默认)
  • RGB_565 每个像素占用 2byte 内存

2)降低采样率: BitmapFactory.Options 参数 inSampleSize 的使用,先把 options.inJustDecodeBounds 设为 true,只是去读取图片的大小,在拿到图片的大小之后和要显示的大小做比较通过 calculateInSampleSize()函数计算 inSampleSize 的具体值,得到值之后。options.inJustDecodeBounds 设为 false读图片资源。

3)复用内存: 即通过软引用(内存不够的时候才会回收掉),复用内存块,不需要再重新给这个 bitmap 申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。

4)使用 recycle()方法及时回收内存。

5)压缩图片

2、Bitmap.recycle()会立即回收么?什么时候会回收?如果没有地方使用这个 Bitmap,为什么垃圾回收不会直接回收?

参考回答:

通过源码可以了解到,加载 Bitmap 到内存里以后,是包含两部分内存区域的。简单的说,一部分是 Java 部分的,一部分是 C部分的。这个 Bitmap 对象是由 Java 部分分配的,不用的时候系统就会自动回收了

但是那个对应的 C 可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。所以需要调用 recycle()方法来释放 C 部分的内存

bitmap.recycle()方法用于回收该 Bitmap 所占用的内存,接着将 bitmap 置空,最后使用 System.gc()调用一下系统的垃圾回收器进行回收,调用 System.gc()并不能保证立即开始进行回收过程,而只是为了加快回收的到来

3、一张 Bitmap 所占内存以及内存占用的计算

参考回答:

Bitamp 所占内存大小 = 宽度像素 x (inTargetDensity /inDensity) x 高度像素 x (inTargetDensity / inDensity)x 一个像素所占的内存字节大小

注: 这里 inDensity 表示目标图片的 dpi(放在哪个资源文件夹下),inTargetDensity 表示目标屏幕的 dpi,所以你可以发现 inDensity 和 inTargetDensity 会对Bitmap 的宽高进行拉伸,进而改变 Bitmap 占用内存的大小。

在 Bitmap 里有两个获取内存占用大小的方法。

  • getByteCount()API12 加入,代表存储 Bitmap 的像素需要的最少内存。
  • getAllocationByteCount()API19 加入,代表在内存中为 Bitmap 分配的内存大小,代替了getByteCount() 方法。
  • 在不复用 Bitmap 时,getByteCount() 和getAllocationByteCount 返回的结果是一样的。在通过复用 Bitmap 来解码图片时,那么 getByteCount()表示新解码图片占用内存的大 小,getAllocationByteCount() 表示被复用 Bitmap 真实占用的内存大小

4、Android 中缓存更新策略 ?

参考回答:

Android 的缓存更新策略没有统一的标准,一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作,但不管是内存缓存还是存储设备缓存,它们的缓存容量是有限制的,因此删除一些旧缓存并添加新缓存,如何定义缓存的新旧这就是一种策略,不同的策略就对应着不同的缓存算法

比如可以简单地根据文件的最后修改时间来定义缓存的新旧,当缓存满时就将最后修改时间较早的缓存移除,这就是一种缓存算法,但不算很完美

5、LRU 的原理 ?

参考回答:

为减少流量消耗,可采用缓存策略。常用的缓存算法是LRU(Least Recently Used):当缓存满时, 会优先淘汰那些近期最少使用的缓存对象。主要是两种方式:

  • LruCache(内存缓存):LruCache 类是一个线程安全的泛型类:内部采用一个 LinkedHashMap 以强引用的方式存储外界的缓存对象,并提供 get 和 put 方法来完成缓存的获取和添加操作,当缓存满时会移除较早使用的缓存对象,再添加新的缓存对象。
  • DiskLruCache(磁盘缓存): 通过将缓存对象写入文件系统从而实现缓存效果

二.Handler

6.谈谈消息机制 Handler 作用 ?有哪些要素 ?流程是怎样的 ?

7.一个线程能否创建多个 Handler,Handler 跟 Looper 之间的对应关系 ?

8.软引用跟弱引用的区别

9.Handler 引起的内存泄露原因以及最佳解决方案

10.为什么系统不建议在子线程访问 UI?

11.Looper 死循环为什么不会导致应用卡死?

12.使用 Handler 的 postDealy 后消息队列会有什么变化?

13.可以在子线程直接 new 一个 Handler 吗?怎么做?

14.Message 可以如何创建?哪种效果更好,为什么?

三.性能优化

15.图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理?

16.内存中如果加载一张 500*500 的 png 高清图片.应该是占用多少的内存?

17.WebView 的性能优化 ?

18.Bitmap 如何处理大图,如一张 30M 的大图,如何预防 OOM?

19.内存回收机制与 GC 算法(各种算法的优缺点以及应用场景);GC 原理时机以及 GC 对象

20.内存泄露和内存溢出的区别 ?AS 有什么工具可以检测内存泄露

21.性能优化,怎么保证应用启动不卡顿? 黑白屏怎么处理?

最后

为了不影响阅读,针对于上面的面试题我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案解析及知识点参考做成了文档(983页PDF)和架构视频资料免费分享给大家!(含有从基础到进阶。含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有。还有辅之相关的视频+学习笔记

整理不易,希望大家在明年有个好的成功,分享是一种美德,觉得不错的朋友可以点赞后分享给更多的朋友!

请查看完整的PDF版
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以点击关于我联系我获取完整PDF
(VX:mm14525201314)

分享到:
评论

相关推荐

    Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    ### Android异步处理详解:使用Thread+Handler实现非UI线程更新UI界面 #### 概述 Android系统中,每一个应用程序都运行在一个独立的Dalvik虚拟机进程中。当应用程序启动时,系统会创建一个主线程(MainThread),也...

    Integrating+BitMap+Structure+deeply+inside+ClickHouse.pdf

    然而,BitMap在某些场景下也存在不足,如在数据稀疏时性能可能会退化,且在处理大量IO时难以优化。此外,ClickHouse原生并不支持专门的Bitmap数据类型,这限制了其在某些复杂查询中的表现。为了克服这些问题,...

    WIN32界面开发之二:GDI+中的局部刷新技术 源码

    本篇我们将深入探讨GDI+中的局部刷新技术,并结合源码分析其工作原理。 局部刷新技术是提高应用程序性能的一个关键方法,它允许开发者只更新窗口中发生改变的部分,而不是整个窗口。这在处理大型图形或者动态内容时...

    JGE:JGE ++(Jas Game Engine ++)是用于PSP的硬件加速2D游戏SDK

    7. **内存管理与优化**: 由于PSP的硬件资源有限,JGE:JGE ++ 在内存管理上进行了优化,确保游戏在运行时占用较少的内存,以提高设备性能。 8. **调试工具**: SDK 通常会包含一些调试工具,如日志输出、性能分析器等...

    Bitmap的相关优化及使用

    本篇文章将深入探讨Bitmap的优化策略及其在实际开发中的应用。 一、Bitmap的内存占用分析 Bitmap对象在内存中的大小主要由三个因素决定:宽度、高度和颜色深度。宽度和高度决定了图像的像素数量,而颜色深度(通常...

    BITMAP3工程文件

    BITMAP3工程文件是与图形处理相关的项目,主要涉及到GDI+技术,这是一种在Windows操作系统中用于图形设备接口(Graphics Device Interface)的扩展库。GDI+提供了丰富的绘图功能,使得开发者能够创建出复杂的2D图形...

    RoaringBitmap-0.7.45-API文档-中英对照版.zip

    赠送jar包:RoaringBitmap-0.7.45.jar; 赠送原API文档:RoaringBitmap-0.7.45-javadoc.jar; 赠送源代码:RoaringBitmap-0.7.45-sources.jar; 赠送Maven依赖信息文件:RoaringBitmap-0.7.45.pom; 包含翻译后的API...

    初中级Android开发社招面试之Bitmap

    Bitmap是Android平台中用于处理图像的核心类,它在Android应用开发中扮演着至关重要的角色,尤其是在显示图片、处理图片效果等方面。本知识点主要探讨Bitmap在Android开发中的使用及其面试常见问题。 1. Bitmap基本...

    Android应用性能优化

    本篇文章将围绕“Android应用性能优化”这一主题,详细探讨Android应用架构的设计原则、常见性能瓶颈及其查找方法,并提供一系列有效的解决方案。 #### 一、Android应用架构设计原则 1. **模块化与解耦**:通过...

    bitmap上传图片demo

    在Android开发中,Bitmap是处理图像数据的基本类,它用于表示位图图像。"bitmap上传图片demo"是一个示例项目,展示了如何利用Bitmap处理本地图片并进行上传,同时提供了将图片裁剪为圆形以适合作为头像的功能。在这...

    bitmap理解学习例子

    Bitmap是Android系统中用于处理图像的核心类,它在Android应用开发中扮演着至关重要的角色。Bitmap对象代表了图像数据,可以是位图(如PNG、JPEG或BMP格式)或者是可绘制对象(如通过Canvas绘制的图形)。在这个...

    游戏开发BITMAP图片

    BITMAP图片在游戏开发中的应用是至关重要的,尤其对于初学者来说,理解并掌握BITMAP的基本概念和使用方法是入门游戏编程的关键步骤。BITMAP,也称为位图,是一种常见的图像文件格式,它以像素阵列的形式存储图像信息...

    Android 多线程:使用Thread和Handler

    在Android开发中,多线程的应用至关重要,尤其是在处理耗时操作如网络请求、大数据处理等时,为了保证用户界面的流畅性,需要将这些任务放到后台线程执行。本篇文章将详细探讨如何在Android中使用Thread和Handler...

    Handler+ImageView

    在Android开发中,`Handler`和`ImageView`是两个非常重要的组件。`Handler`主要用于解决线程间的通信问题,特别是主线程与工作线程之间的数据交互;而`ImageView`则是显示图片的基础控件,用于在用户界面上展示图像...

    解析Android开发优化之:对Bitmap的内存优化详解

    1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收。这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间。那为什么...

    Handler+Thread

    在Android应用开发中,`Handler` 和 `Thread` 是两个非常关键的概念,它们主要用于处理线程间的通信和异步操作。下面将详细解释这两个概念,以及如何在实际应用中使用它们来实现简单的网络图片获取和显示。 首先,`...

    Android应用性能优化.pdf

    根据提供的文件信息,“Android应用性能优化.pdf”这一文档主要聚焦于Android应用的性能优化方法与实践。虽然部分内容涉及社群推广信息,并未直接提供具体的性能优化技术细节,但我们可以通过标题及描述推断出文档的...

    Bitmap(3)-android中操作Bitmap

    Bitmap是Android系统中用于处理图像数据的核心类,它在Android应用开发中扮演着至关重要的角色。Bitmap对象可以存储和显示像素信息,适用于各种图像处理需求,如图片加载、裁剪、缩放等。本篇文章将深入探讨在...

    bitmap工具类

    Bitmap工具类是Android开发中非常关键的一个部分,主要用于处理图像数据,尤其是在内存管理上起着至关重要的作用。在Android系统中,Bitmap对象是用于存储像素数据的,它消耗大量的内存,如果处理不当,很容易引发...

    Android性能优化(七)Bitmap内存压缩示例源码BitMapCache.zip

    在Android开发中,Bitmap对象是图像处理的核心,但由于其消耗大量内存,不当使用往往会导致应用性能下降甚至引发内存溢出(Out Of Memory)问题。因此,Bitmap的内存管理与优化至关重要,尤其是对于图像密集型应用而...

Global site tag (gtag.js) - Google Analytics