![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android面试
文章平均质量分 75
进击的代码家
这个作者很懒,什么都没留下…
展开
-
Android面试每日一题(6):BroadcastReceiver 与 LocalBroadcastReceiver 有什么区别?
LocalBroadcastReceiver 是应用内广播,利用Handler实现,利用了IntentFilter的match功能,提供消息的发布与接收功能,实现应用内通信,效率和安全性比较高,仅支持动态注册。BroadcastReceiver 是跨应用广播,利用Binder机制实现,支持动态和静态两种方式注册方式。其他程序无法将广播发送到我们程序内部,不会有安全漏洞。发送的广播不会离开我们的应用,不会泄露关键数据。优先级相同的广播,动态注册的广播优先处理。广播接收者还能对广播进行截断和修改。...原创 2022-08-16 23:39:49 · 966 阅读 · 0 评论 -
Android面试每日一题(5):抽象类与接口的区别?
如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。如果你往接口中添加方法,那么你必须改变实现该接口的类。抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的;接口中不能含有构造器、静态代码块以及静态方法,而抽象类可以有构造器、静态代码块和静态方法;抽象类可以提供成员方法的实现细节,而接口中只能存在 public 抽象方法;抽象类访问速度比接口速度要快,因为接口需要时间去寻找在类中具体实现的方法;...原创 2022-08-16 23:33:07 · 876 阅读 · 0 评论 -
Android面试每日一题(4): 哪些情况下会导致oom问题?
低内存状态回调,根据不同的内存等级做一些事情,比如在最严重的等级清空所有的bitmap,关掉所有界面,直接强制把app跳转到主界面,相当于app重新启动了一次一样,这样就避免了系统Kill应用进程,与其让系统kill进程还不如浪费一些用户体验,自己主动回收内存。②编码阶段Memery Profile看app的内存使用情况,是否存在内存抖动,内存泄漏,结合Mat分析内存泄漏。1、根据java的内存模型会出现内存溢出的内存有堆内存、方法区内存、虚拟机栈内存、native方法区内存;...原创 2022-08-11 16:49:10 · 1091 阅读 · 0 评论 -
Android面试每日一题(3): LaunchMode 的应用场景?
Standard 模式是系统默认的启动模式,一般我们 app 中大部分页面都是由该模式的页面构成的,比较常见的场景是:社交应用中,点击查看用户A信息->查看用户A粉丝->在粉丝中挑选查看用户B信息->查看用户B粉丝…SingleInstance 模式常应用于独立栈操作的应用,如闹钟的提醒页面,当你在A应用中看视频时,闹钟响了,你点击闹钟提醒通知后进入提醒详情页面,然后点击返回就再次回到A的视频页面,这样就不会过多干扰到用户先前的操作了。所以在我们的应用中一般不会用到。...原创 2022-08-11 16:05:50 · 224 阅读 · 0 评论 -
Android面试每日一题(1): Handler 如何有效地避免内存泄漏问题
问题在于该Handler的实例采用了内部类的写法,它是ShanActivity这个实例的内部类,在Java中,关于内部类有一个特点:在java中,非静态的内部类和匿名内部类都会隐式的持有一个外部类的引用。在Android系统中,Handler是一个消息发送和处理机制的核心组件之一,与之配套的其他主要组件还有Looper和Message,MessageQueue。如果Handler中是一个2秒的操作,在Activity退出的2s后,释放了Activity的指针,这种情况属于短时间的内存泄漏?......原创 2022-08-09 18:47:04 · 347 阅读 · 0 评论 -
android签名原理
为什么要签名?确保Apk来源的真实性。确保Apk没有被第三方篡改。什么是签名?在Apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。apk组成dex:最终生成的Dalvik字节码。res:存放资源文件的目录。asserts:额外建立的资源文件夹。lib:如果存在的话,存放的是ndk编出来的so库。META-INF:存放签名信息MANIFEST.MF(清单文件):其中每一个资源文件都有原创 2021-03-24 19:54:30 · 1014 阅读 · 0 评论 -
JNI原理
JNI方法注册方式Android系统在启动启动过程中,先启动Kernel创建init进程,紧接着由init进程fork第一个横穿Java和C/C++的进程,即Zygote进程。Zygote启动过程中会AndroidRuntime.cpp中的startVm创建虚拟机,VM创建完成后,紧接着调用startReg完成虚拟机中的JNI方法注册。1.android系统启动时候已经预注册好这种多出现在android自己系统代码里提供的注册方法startRegAndroidRuntime.cppint And原创 2021-03-15 20:24:53 · 1220 阅读 · 0 评论 -
java中error和exception的区别
Error类和Exception类的父类都是throwable类,他们的区别是:Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checke原创 2021-03-14 18:26:41 · 608 阅读 · 0 评论 -
Class 对象在执行引擎中的初始化过程
一个 class 文件被加载到内存中需要经过 3 大步:装载、链接、初始化。装载装载是指 Java 虚拟机查找 .class 文件并生成字节流,然后根据字节流创建 java.lang.Class 对象的过程。链接链接过程分为 3 步:验证、准备、解析。验证:初始化这是 class 加载的最后一步,这一阶段是执行类构造器方法的过程,并真正初始化类变量。1.文件格式检验:检验字节流是否符合 class 文件格式的规范,并且能被当前版本的虚拟机处理。2.元数据检验:对字节码描述的信息进行语义分原创 2021-03-14 16:46:21 · 203 阅读 · 0 评论 -
Android匿名共享内存
ashmem的使用流程如下:1.ashmem_create_region创建匿名共享内存区域,本质是调用open系统调用2.ioctl设置共享内存的名字和大小,设置的名字为/dev/ashmem/,名字的存在就为了能够让其他人找到目标3.mmap映射文件中的虚拟内存以及物理内存4.直接对着这一块地址区域读写。其中ioctl必须设置名字和大小,不然没办法进行映射,因为在映射之前进行了校验。那么ashmem和Binder有什么区别呢?Binder的mmap时候已经通过伙伴系统绑定了物理页和虚拟内存原创 2021-03-01 18:18:28 · 963 阅读 · 0 评论 -
写给Android开发的Binder指南
为什么选用binder?Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC 机制。那为什么 Android 还要提供 Binder 来实现 IPC 呢?主要是基于性能、稳定性和安全性几方面的原因。性能Socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂原创 2021-03-01 17:42:41 · 332 阅读 · 3 评论 -
https原理
HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。HTTPS的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:① 证书验证阶段:1)浏览器发起 HTTPS 请求;2)服务端返回 HTTPS 证书;3)客户端验证证书是否合法,如果不合法则提示告警。② 数据传输阶段:1)当证书验证合法后,在本地生成随机数;2)通过公钥加密随机数,并把加密后的随机数传输到服务端;3)服务端通过私钥对随机数进行解密;4)服务端通过客户端传入的随机数构造对称加密算法,对返回原创 2021-03-01 15:21:51 · 148 阅读 · 1 评论 -
Parcelable与Serializable
由于 Java 的 Serializable 的性能较低,Parcelable 正式在这个背景下产生的,它核心作用就是为了解决 Android 中大量跨进程通信的性能问题。Serializable使用大量反射和临时变量,而Parcelable少许反射通过启动 Activity 过程分析 Parcelable 序列化过程:熟悉这一过程的朋友过程肯定知道,startActivity 方法最终会通过 AMS(ActivityManagerService)完成跨进程通信调用,但是在通信之前先要将数据序列化后进原创 2021-02-12 22:44:25 · 355 阅读 · 0 评论 -
你真的懂ContentProvider么
启动性能ContentProvider 的生命周期默认在 Application onCreate() 之前,而且都是在主线程创建的。我们自定义的 ContentProvider 类的构造函数、静态代码块、onCreate 函数都尽量不要做耗时的操作,会拖慢启动速度。稳定性ContentProvider 在进行跨进程数据传递时,利用了 Android 的 Binder 和匿名共享内存机制。Binder 传递 CursorWindow 对象内部的匿名共享内存的文件描述符。这样在跨进程传输中,**结原创 2021-02-12 20:17:39 · 671 阅读 · 0 评论 -
flutter跨平台原理
React Native最终渲染工作交还给了系统,虽然同样使用类HTML+JS的UI构建逻辑,但是最终会生成对应的自定义原生控件,以充分利用原生控件相对于WebView的较高的绘制效率。不仅框架本身需要处理大量平台相关的逻辑,随着系统版本变化和API的变化,开发者可能也需要处理不同平台的差异,甚至有些特性只能在部分平台上实现,这样框架的跨平台特性就会大打折扣。Flutter从头到尾重写一套跨平台的UI框架,包括UI控件、渲染逻辑甚至开发语言。渲染引擎依靠跨平台的Skia图形库来实现,依赖系统的只有图原创 2021-02-12 18:17:19 · 2428 阅读 · 0 评论 -
Android工程师应该懂得的网络知识
下面就以比较经常看到的的5层结构为例:1)应用层:如http协议,它实际上是定义了如何包装和解析数据,应用层是http协议的话,则会按照协议规定包装数据,如按照请求行、请求头、请求体包装,包装好数据后将数据传至运输层。2)运输层:TCP和UDP两种协议,使用Socket进行连接建立的时候,一般都要指定端口号,所以这一层指定了把数据送到对应的端口号。3)网络层:这一层IP协议,以及一些路由选择协议等等,所以这一层的指定了数据要传输到哪个IP地址。中间涉及到一些最优线路,路由选择算法等等。4)数据链路原创 2021-02-11 21:42:58 · 250 阅读 · 0 评论 -
Activity16问
横竖屏切换时Activity生命周期注意:还有一点,非常重要,一个 Android 的变更细节!当 API >12 时,需要加入 screenSize 属性,否则屏幕切换时即使你设置了 orientation 系统也会重建 Activity !2.不同场景下 Activity 生命周期的变化过程3.如何处理异常退出您可通过使用 ViewModel 对象来减轻重新初始化 Activity 的负担。系统会在配置变更时保留 ViewModel,使其成为保存界面数据的理想场所,让您无需再次查.原创 2021-02-11 17:45:41 · 295 阅读 · 0 评论 -
JAVA虚拟机与Android虚拟机的区别
1.JAVA虚拟机运行的是JAVA字节码,Dalvik虚拟机运行的是Dalvik字节码java虚拟机:JAVA->class文件dalvik虚拟机:JAVA->class文件->Dalvik字节码->打包到dex中->DVM通过解释DEX文件来执行这些字节码。class文件的缺点如果A类文件引用B类文件中的方法,方法签名也会被复制到A类文件中,多个不同的类会同时包含相同的方法签名大量的字符串常量在多个类文件中也被重复使用因为大量的冗余信息,会严重影响jvm虚拟机解原创 2021-02-11 16:06:06 · 1436 阅读 · 0 评论 -
你真懂的ViewStub,include,merge么
1.includeinclude就是为了解决重复定义相同布局的问题<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:id="@+id/my_title_parent_id" andro原创 2021-02-10 12:36:30 · 813 阅读 · 0 评论 -
Socket(套接字)
TCP/IP只是一个协议栈,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接(心跳包),一般需要自己做在线维持。 短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。比如Http的,只是原创 2021-03-01 14:42:30 · 557 阅读 · 0 评论 -
Tinker原理
加载补丁dexTinker采用的是下发差分包,然后在手机端合成全量的dex文件进行加载。而在build.gradle配置中的tinkerPatchdex.loader = ["com.tencent.tinker.loader.*","tinker.sample.android.app.SampleApplication","tinker.sample.android.app.BaseBuildInfo"]这个配置中的类不会出现在任何全量补丁dex里,也就是说在合成后,这些类还在老的dex文件原创 2021-02-14 12:28:25 · 1032 阅读 · 0 评论 -
Instant run动态加载机制
关于动态加载,实际上Instant run提供了两种动态加载的机制:1.修改java代码需要重启应用加载补丁dex,而在Application初始化时替换了Application,新建了一个自定义的ClassLoader去加载所有的dex文件。我们称为重启更新机制2.修改代码不需要重启,新建一个ClassLoader去加载修改部分。我们称为热更新机制Application入口在编译时Instant run用到了Transform API修改字节码文件。其中AndroidManifest.xml文件也原创 2021-02-14 17:36:49 · 639 阅读 · 0 评论 -
Java单例模式的写法及优缺点
总结下Java单例模式的几种写法:1.饿汉式public class Singleton{ private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; }}优点:实现简单,不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的原创 2021-02-14 18:08:52 · 414 阅读 · 1 评论 -
如何理解volatile
java内存模型与原子性,可见性和有序性Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存。线程对变量的所有操作都必须在自己的工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。在java中,执行下面这个语句:int i=3;执行线程必须先在自己的工作线程中对变量i所在的缓存行进行赋值操作,然后再写入主存当中。而不是直接将数值3写入主存当中。原子性对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执原创 2021-02-14 19:44:02 · 161 阅读 · 0 评论 -
synchronized实现原理
synchronized的三种应用方式synchronized关键字最主要有以下3种应用方式,下面分别介绍修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。synchronized作用于实例方法无问题写法;public class AccountingSync implements Runnable{ //共享资源(临界资源原创 2021-02-14 22:45:24 · 1452 阅读 · 0 评论 -
Java中的各种锁
参考:https://tech.meituan.com/2018/11/15/java-lock.html乐观锁 VS 悲观锁悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,原创 2021-02-28 18:00:06 · 186 阅读 · 0 评论 -
android字节码框架——AspectJ
最常用的字节码处理框架有 AspectJ、ASM 等等,它们的相同之处在于输入输出都是 Class 文件。并且,它们都是 在 Java 文件编译成 .class 文件之后,生成 Dalvik 字节码之前执行。而 AspectJ 作为 Java 中流行的 AOP(aspect-oriented programming) 编程扩展框架,其内部使用的是 BCEL框架 来完成其功能。AspectJ 的优势它的优势有两点:成熟稳定、使用非常简单。使用非常简单AspectJ 可以在如下五个位置插入自定义的代码原创 2021-02-15 18:08:29 · 466 阅读 · 0 评论 -
重新复习Android View的绘制流程
PhoneWindow是Android系统中最基本的窗口系统,每个Activity会创建一个。同时,PhoneWindow也是Activity和View系统交互的接口。DecorView本质上是一个FrameLayout,是Activity中所有View的祖先。开始:DecorView被加载到Window中1.Activity里的PhoneWindow创建是在Activity的attach方法中,这个方法是Activity在ActivityThread被创建之后调用Activity.javaAct原创 2021-02-16 21:47:21 · 216 阅读 · 0 评论 -
重新复习Android View事件分发
一个Activity包含了一个Window对象,这个对象是由PhoneWindow来实现的。PhoneWindow将DecorView作为整个应用窗口的根View,而这个DecorView又将屏幕划分为两个区域:一个是TitleView,另一个是ContentView,而我们平时所写的就是展示在ContentView中触摸事件的类型触摸事件对应的是MotionEvent类,事件的类型主要有如下三种:ACTION_DOWNACTION_MOVE(移动的距离超过一定的阈值会被判定为ACTION_MOVE原创 2021-02-17 11:12:43 · 236 阅读 · 0 评论 -
select、poll、epoll之间的区别
(1)select==>时间复杂度O(n)仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),**我们只能无差别轮询所有流,**找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。(2)poll==>时间复杂度O(n)poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, **但是它没有最大连接数的限制,**原因是它是基于链原创 2021-02-23 21:08:28 · 254 阅读 · 0 评论 -
AspectJ与ASM与Javaassist
AspectJ的缺点是,由于其基于规则,所以其切入点相对固定,对于字节码文件的操作自由度以及开发的掌控度就大打折扣。还有就是我们要实现的是对所有方法进行插桩,所以代码注入后的性能也是我们需要关注的一个重要的点,我们希望只插入我们想插入的代码,而AspectJ会额外生成一些包装代码,对性能以及包大小有一定影响。...原创 2021-02-24 21:32:52 · 2238 阅读 · 0 评论 -
mmap分析
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享进程的虚拟地址空间,由多个虚拟内存区域构成。虚拟内存区域是进程的虚拟地址空间中的一个同质区间,即具有同样特原创 2021-02-28 17:52:28 · 384 阅读 · 0 评论 -
TCP/IP多路复用
所有网络通信的本质目标就是进程间通信。除了寻址(Addressing),IP 协议还有一个非常重要的能力就是路由。寻址告诉我们去往下一个目的地该朝哪个方向走,路由则是根据下一个目的地选择路径。寻址更像在导航,路由更像在操作方向盘。多路复用一台机器上的应用可以有很多。但是实际的出口设备,比如说网卡、网线通常只有一份。因此这里需要用到一个叫作多路复用(Multiplex)的技术。多路复用,就是多个信号,复用一个信道。传输层多路复用多个请求复用一个 TCP 连接。多个请求相当于并行的发送请求。即使其原创 2021-02-28 17:16:40 · 5842 阅读 · 1 评论 -
udp协议:udp和tcp相比快在哪里?
TCP 协议,是一个支持可靠性的协议。UDP 协议,是一个不支持可靠性的协议。校验和(Checksum)最简单的校验和算法:纵向冗余检查UDP 不支持可靠性,但是像校验和(Checksum)这一类最基本的数据校验,它还是支持的。不支持可靠性,并不意味着完全放弃可靠性。TCP 和 UDP 都支持最基本的校验和算法。对于 TCP 和 UDP,都实现了校验和算法,但二者的区别是,TCP 如果发现校验核对不上,也就是数据损坏,会主动丢失这个封包并且重发。而 UDP 什么都不会处理,UDP 把处理的权利交给原创 2021-02-28 16:54:10 · 2018 阅读 · 0 评论 -
Android面试问题汇总
设计模式相关1.设计模式6大原则1.1单一职责原则:就一个类而言, 应该仅有一个引起它变化的原因。1.2开放封闭原则:类、模块、函数等应该是可以拓展的,但是不可修改。1.3里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。核心思想:在使用基类的的地方可以任意使用其子类,能保证子类完美替换基类。1.4依赖倒置原则:高层模块不应该依赖于低层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。问题描述:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码原创 2021-02-24 20:21:49 · 465 阅读 · 2 评论 -
GC垃圾回收
强引用:代码中普遍存在的,只要强引用还存在,垃圾收集器就不会回收掉被引用的对象。软引用:SoftReference,用来描述还有用但是非必须的对象,当内存不足的时候会回收这类对象。弱引用:WeakReference,用来描述非必须对象,弱引用的对象只能生存到下一次GC发生时,当GC发生时,无论内存是否足够,都会回收该对象。虚引用:PhantomReference,一个对象是否有虚引用的存在,完全不会对其生存时间产生影响,也无法通过虚引用取得一个对象的引用,它存在的唯一目的是在这个对象被回收时可以收到一原创 2021-02-24 20:09:41 · 175 阅读 · 0 评论 -
ASM初探
对于 ASM 而言,它提供了 两种模型:对象模型和事件模型。ASM 的对象模型(ASM Tree API)对象模型的 本质 是一个 被封装过后的事件模型,它 使用了树状图的形式来描述一个类,其中包含多个节点,例如方法节点、字段节点等等,而每个节点又有子节点,例如方法节中有操作码子节点 等等。在对象模型下的 ASM 有 两类操作纬度,分别如下所示:1)、获取节点:获取指定类、字段、方法节点。2)、操控操作码(针对方法节点):获取操作码位置、替换、删除、插入操作码、输出字节码。1.获取节点获取一个原创 2021-02-15 21:49:37 · 874 阅读 · 0 评论 -
SparseArray和ArrayMap
首先我们来介绍一下HashMap,了解它的优缺点,然后再对比一下其他的数据结构以及为什么要替代它。HashMapHashMap是由数组+单向链表的方式组成的,初始大小是16(2的4次方),首次put的时候,才会真正初始化。链表长度大于8时转化成红黑树,小于6时又转化成链表。1.为什么要引入红黑树?JDK 1.8以前是数组+链表,还未引入红黑树,这就导致了链表过长时查找的时间复杂度是O(n)红黑树是一种自平衡的二叉查找树,不是一种绝对平衡的二叉树,它放弃了追求绝对平衡,追求大致平衡,在与平衡二叉原创 2021-02-13 17:30:01 · 816 阅读 · 0 评论 -
如何设计一个图片加载框架
需要考虑哪些问题?首先,梳理一下必要的图片加载框架的需求:异步加载:线程池切换线程:Handler,没有争议吧缓存:LruCache、DiskLruCache防止OOM:软引用、LruCache、图片压缩、Bitmap像素存储位置内存泄露:注意ImageView的正确引用,生命周期管理列表滑动加载的问题:加载错乱、队满任务过多问题当然,还有一些不是必要的需求,例如加载动画等。异步加载:线程池,多少个?缓存一般有三级,内存缓存、硬盘、网络。2个,读内存和硬盘可以放在一个线程池,网络需要原创 2021-02-13 12:09:18 · 782 阅读 · 0 评论 -
android如何加载长图
思路:那就是对于一张巨型图片我们可否每次指定一块区域加载显示,然后通过改变这个区域完成整张巨图的加载呢?这样内存中只有完整图片的一块区域。区域加载1、BitmapRegionDecoder指定Bitmap区域进行解码,主要用于显示图片的某一块矩形区域显示图片的某一块区域,那么至少需要两个方法:1、设置图片,2、设置显示区域。接下来通过自定义一个可以加载巨图的View展开说明:2、设置图片前面说到至少需要两个方法:1、设置图片 2、指定显示区域我们先来看如何设置图片:mOptions实际就是原创 2021-02-12 23:01:50 · 1146 阅读 · 1 评论