- 博客(125)
- 收藏
- 关注
原创 Android中ContentProvider细节
应用的全局初始化(Application.onCreate)可能包含与特定 ContentProvider 无关或非必需的复杂操作,不应该阻塞关键的数据服务启动。(其中可能包含大量耗时的全局初始化,如第三方库初始化、网络配置、复杂业务逻辑等),会让客户端等待更长时间,大大增加 ANR 风险。理解这个顺序对于编写健壮、高效的 ContentProvider 至关重要,尤其是在处理跨进程请求时,避免在。(如打开数据库、初始化文件句柄、建立必要的网络连接池等),确保它能以最小、最必要的状态快速响应数据请求。
2025-06-09 18:24:01
725
原创 从面试角度回答Android中ContentProvider启动原理
场景已启动未启动触发条件本地或远程已加载的Provider首次跨进程访问未加载的Provider流程核心直接获取Binder,跨进程调用触发进程创建→安装Provider→发布Binder生命周期onCreate()早于应用启动初始化延迟至首次访问多进程支持依赖和process配置需显式配置多进程属性。
2025-06-09 18:14:55
982
原创 onSaveInstanceState() 和 ViewModel 在数据保存能力差异
【代码】onSaveInstanceState() 和 ViewModel 在数据保存能力差异。
2025-06-06 18:50:15
524
原创 Lifecycle 核心原理面试回答
的生命周期回调逻辑从视图控制器中剥离,让业务组件(如 Presenter, Repository 封装)能独立感知生命周期。其设计完美解耦了生命周期管理与业务逻辑,通过自动状态同步和销毁时清理机制,确保了内存安全和数据一致性。中重写一堆生命周期方法,Lifecycle 让代码更模块化、可测试、可复用。保证了状态同步和事件分发的线程安全 (主线程) 和一致性 (状态机模型)。接口设计允许多种实现方式 (接口回调、注解 - 已废弃),适配不同场景。开发者自定义的业务逻辑类 (实现此接口)。
2025-06-04 17:06:14
835
原创 ViewModel原理面试回答
对其关联的 Activity/Fragment 或其 View 层(Context/View) 的引用。因此,ViewModel 完美解决了配置更改时的状态保持、作用域管理和内存安全问题,是 MVVM 架构的核心纽带。提供清晰的生命周期作用域(Activity 级、Fragment 级),确保数据在正确的作用域内共享和隔离。在配置更改(如屏幕旋转)导致的 Activity/Fragment 重建时,来确定作用域,保证作用域内的唯一性和作用域间的隔离。嵌套的子 Fragment 拥有自己的子作用域。
2025-06-04 16:49:12
798
原创 Lifecycle原理
调用 mLifecycleObserver.onStateChanged(owner, event)调用 observer.dispatchEvent(owner, event)如果没有重入(当前不在处理事件或添加观察者中),则调用 sync()),说明观察者整体超前于宿主状态(通常发生在配置更改恢复时)。实例的 handleLifecycleEvent(Event)注解, 则生成并返回一个基于反射或代码生成的适配器。),说明观察者整体落后于宿主状态。直接传递给实现了该接口的观察者。
2025-05-30 23:30:16
875
原创 Dalvik虚拟机、ART虚拟机与JVM的核心区别
:寄存器架构与栈架构的本质差异导致Dalvik在移动端更高效,但JVM的跨平台能力不可替代。:AOT预编译彻底解决JIT的运行时开销,但牺牲存储空间换取性能飞跃。适用场景:JVM适合服务器和桌面应用,Dalvik/ART专为Android移动生态优化。ART的混合编译模式(AOT+JIT)平衡了安装时间与运行效率,成为Android 5.0+的性能基石。
2025-05-27 16:23:01
760
原创 Android中Binder请求处理流程
线程池归属:每个Binder进程默认16线程,共享于所有对象。请求处理流程:客户端→驱动→服务端线程池→事务执行→结果返回,依赖内存映射和线程调度优化性能。扩展性设计:动态线程创建、优先级继承和异步机制保障高并发场景的稳定性。
2025-05-23 14:29:00
537
原创 Android中ServiceManager与Binder驱动的关系
ServiceManager与Binder驱动的关系可概括为:ServiceManager是Binder通信机制的“管理者”和入口,Binder驱动是实际执行通信的“引擎”。两者通过注册、查询、事务处理的三层协作,实现了Android系统服务的高效管理与安全通信。这一设计是Android多进程架构稳定运行的核心基础。
2025-05-23 14:27:28
695
原创 Android中Binder驱动作用?
Binder驱动是Android系统中实现进程间通信(IPC)的核心底层组件,它工作于Linux内核层,负责管理跨进程通信的建立、数据传输、资源同步等关键任务。Binder驱动作为Android IPC的枢纽,提供跨进程通信的底层通道。Binder驱动通过内存映射(
2025-05-23 14:15:39
537
原创 对Android中binder的理解
Binder将进程间的通信抽象为对本地对象的方法调用,开发者可以通过AIDL(Android Interface Definition Language)定义接口,自动生成代理类和存根代码,使得跨进程调用与本地调用体验一致。Android的四大组件(Activity、Service等)和系统服务运行在不同进程中,Binder负责协调这些组件间的交互。Binder是Android系统中实现进程间通信的核心框架,允许不同进程之间安全、高效地传递数据和调用方法。)与应用进程的交互均通过Binder完成。
2025-05-23 14:13:48
733
原创 Android中Framework用到了哪些跨进程通信方式
在Android Framework中,除了Binder之外,还存在等多种IPC机制。
2025-05-23 13:45:09
893
原创 代码随想录使用40天心得体会
40天八股背诵给我最大的体会就是能够按照进度规划进行学习,避免了自己去搜集资料的手足无措,参加了几次实习面试,基本上问到的问题都是里面总结好的.同时通过这种方式,还锻炼了自己的写博客能力,基本上学习或者复习到一个新知识点,就会发一个博客进行总结,一来是方便自己在轻轨上背诵,二来是作为一个资料,方便后面反复复习.每天都是尽量坚持打卡,如果有事的话,前一天会把后一天的也打完,通过这四十天的学习,相比刚开始确实是有了质的飞跃.
2025-05-16 09:54:31
86
原创 java类加载阶段与双亲委派机制
实现方式:继承类,重写方法,定义从特定路径(如加密文件、网络)加载字节码的逻辑。应用场景热部署:动态加载修改后的类;模块化隔离:如 Tomcat 为每个 Web 应用分配独立类加载器。阶段与任务:清晰描述加载(获取字节流)、链接(验证+准备+解析)、初始化(执行<clinit>)的核心任务。双亲委派模型:强调委派流程与安全性设计,举例说明其如何避免类冲突。类加载器层次。
2025-05-15 14:26:52
880
原创 背包问题思路分析与总结
(1)dp的含义一般就是你要求的东西,例如求价值时,就是价值,求方法个数时,就是方法数(2)要注意数组索引的问题,例如,朴速0-1背包中,dp[i][j] = dp[i-1][j-weight[i]]+value[i],那么j-weight[i]肯定要大于等于0,i-1也要大于等于0;(3)初始化的话一般都要看递推公式能求取到哪些值,求取不到的,需要初始化.
2025-05-15 13:23:09
744
原创 反射作用时机
反射的作用时机是在类加载之后、解释器执行字节码的过程中。当类被加载并初始化后,反射允许程序在运行时动态地获取类的信息和操作类的实例。
2025-05-14 09:54:54
361
原创 java中强引用、软应用、弱应用、虚引用
在Java中,引用类型决定了对象的生命周期和垃圾回收的时机。Java提供了四种不同的引用类型:强引用、软引用、弱引用和虚引用。每种引用类型的行为和用途不同,了解这些差异对优化内存管理和垃圾回收非常重要。
2025-05-12 13:17:15
811
原创 java内存区域
Java内存模型(JMM)定义了Java程序中各种变量(包括对象字段、数组元素和类静态字段)在多线程环境下的访问规则。:线程通过共享内存进行通信,但由于内存屏障的存在,线程之间并非总能立即看到对共享内存的修改。JMM通过内存屏障(如。:在多线程环境中,一个线程对共享变量的修改,另一个线程是否能够及时看到。:JMM规定了基本操作(如赋值操作)在单个线程中是原子的,但复合操作(如。规则)来控制线程间的执行顺序,确保数据的一致性。来控制共享变量的可见性。操作)通常不是原子的。
2025-05-12 10:17:09
262
原创 为什么要有线程池?
通过这些机制,线程池能够高效地管理大量并发任务,控制并发级别,提高系统性能,同时减少由于线程管理导致的资源浪费。线程池的引入解决了频繁创建和销毁线程所带来的性能开销和资源浪费。
2025-05-10 22:21:17
660
原创 volatile与sychronized区别
变量的修改会立即刷新到主内存,其他线程读取时直接从主内存获取最新值。:进入同步块前强制从主内存读取变量,退出时强制将变量写回主内存。:涉及锁竞争、线程阻塞与唤醒,高并发时可能导致上下文切换。:无锁 → 偏向锁 → 轻量级锁(自旋) → 重量级锁。:无锁机制,仅涉及内存屏障指令,性能接近普通变量。:确保写操作前的所有指令不会被重排序到写之后。:确保读操作后的所有指令不会被重排序到读之前。:高频读写的状态标志(如实时监控标志)。:需要多变量同步的复杂操作(如转账)。:同步代码块内的所有操作具有原子性。
2025-05-09 17:17:09
521
原创 volatile关键字作用
volatile确保变量的可见性,适用于状态标志和单例模式等场景。volatile无法保证操作的原子性,不能用于复杂的复合操作。volatile和各自有优缺点,volatile适用于简单的可见性问题,而用于保证原子性和互斥访问。在需要复合操作原子性时,应该使用或其他同步机制,而不是依赖volatile。
2025-05-09 17:00:20
568
原创 okhttp原理
enqueue实际上是new了一个RealCall的内部类AsyncCall扔进了dispatcher中,如果当前正在运行的异步请求数小于阈值maxRequests (默认Dispatcher中为64)并且同host下运行的请求小于阈值maxRequestsPerHost(默认Dispatcher中为5),就将AsyncCall添加到正在运行的异步队里,并通过线程池异步执行,否则就将其丢到等待队列排队。:线程池(核心线程数0,最大线程数Integer.MAX_VALUE)• 责任链模式(拦截器的链式调用)
2025-05-08 22:19:08
623
原创 HTTP断点续传
• 服务器需支持合并分片上传的数据(如通过临时文件或云存储接口)。• 客户端读取本地已下载的字节数(例如已下载500字节)。客户端需持久化存储已传输的字节位置(如数据库或临时文件)。• 服务器返回后续数据,客户端将新数据追加到本地文件。客户端可并发多个范围请求(如分块下载),最后合并文件。请求 或普通请求,检查响应头中是否包含。头验证文件未修改,避免续传后数据不一致。• 若支持,客户端记录文件总大小(通过。• 云存储服务(如分片上传至对象存储)。• 大文件下载(如视频、软件安装包)。• 发起新请求,通过。
2025-05-08 21:39:45
481
原创 Android中ApplicationThread和ActivityThread
两者协同实现了Android应用“单线程模型”与“多进程架构”的平衡,是理解组件启动、ANR机制及性能优化的关键基础。• 状态反馈:向AMS回传应用进程的状态信息(如Activity是否暂停),协助AMS完成全局调度。:跨进程通信的“神经中枢”,将AMS指令转化为主线程任务,保障系统与应用的协同运作。类间接操作组件,监控系统与应用的交互过程(如Activity启动耗时统计)。:应用主线程的“大脑”,管理消息循环与组件生命周期,直接控制UI线程行为。• 跨进程指令代理:AMS通过。
2025-05-08 21:28:32
614
原创 Android 中Instant Run介绍
Java 代码更新:Instant Run 会将 Java 代码(如修改文本、按钮点击事件等)直接推送到设备,并立即生效,避免重启应用。资源文件更新:对于布局文件、图片、样式等资源的修改,Instant Run 会自动推送更新,应用的界面会即时变化。
2025-05-08 21:21:00
787
原创 Android中动态广播注册和收发原理
动态广播的注册与分发机制体现了Android系统高效、解耦的设计理念:通过Binder实现跨进程通信,利用Intent匹配精准路由事件,结合系统端并行与应用端串行的分发策略平衡性能与稳定性。开发者需注意生命周期管理与主线程限制,以优化广播使用体验。
2025-05-08 16:01:47
1253
原创 synchronized和ReentrantLock区别
适合简化的同步需求,不需要显式的创建和释放锁,适用于锁持有时间较短、没有复杂逻辑的同步场景。
2025-05-08 15:09:47
946
原创 sychronized和Lock区别
和Lock是 Java 中用于实现线程同步的两种机制,它们有很多相似之处,但也存在重要的区别。下面是对这两者的详细对比以及它们各自的使用场景和优缺点。
2025-05-08 15:01:33
778
原创 对java中synchronized理解
一段很长的时间内都只被一个线程使用锁,可以使用了偏向锁,在第一次获得锁时,会有一个CAS操作,之后该线程再获取锁,只需要判断markword中是否是自己的线程id即可,而不是开销相对较大的CAS命令。轻量级修改了对象的锁标志,相对重量级锁性能提升很多。Java中的synchronized有偏向锁、轻量级锁、重量级锁三种形式,分别对应了锁只被一个线程持有、不同线程交替持有锁、多线程竞争锁三种情况。:底层使用的Monitor实现,里面涉及到了用户态和内核态的切换、进程的上下文切换,成本较高,性能比较低。
2025-05-07 20:06:34
393
原创 Java中有哪些锁?
是 Java 最基础的锁机制,用于实现方法或代码块的同步,保证多线程环境下的原子性、可见性和有序性。竞争激烈时,线程进入阻塞状态,依赖操作系统的互斥量(Mutex)管理。提供更灵活的读写锁控制,支持乐观读、悲观读、写锁三种模式,性能优于。允许多个线程同时读,但写线程独占资源,适用于读多写少的场景。读多写少且对性能要求极高的场景,但需谨慎处理锁转换逻辑。:默认抢占式获取锁,不保证等待时间长的线程优先获取。需要复杂同步控制的场景,如多条件等待、锁超时处理。:写线程获取锁时,禁止其他读/写操作。
2025-05-07 19:11:28
1005
原创 Service的绑定原理
连接成功: Service 的 onBind 返回 IBinder 后,客户端的 ServiceConnection 的 onServiceConnected 被调用。客户端绑定:调用 bindService 时,若 Service 未创建,会依次调用 onCreate 和 onBind;异常断开:若连接异常断开,客户端的 ServiceConnection 的 onServiceDisconnected 会被调用。:若 Service 运行在其他进程,AMS 通过 Binder 通知目标进程的。
2025-05-06 12:55:05
929
原创 线程start()和run()的区别?
9.start() 调用 run():当你调用 start() 时,它会启动一个新线程,而这个线程会执行 run() 方法中的代码。11.不能直接通过 run() 启动线程:由于直接调用 run() 方法并不创建新线程,因此不能仅通过 run() 来启动并行操作。1.启动新线程:当调用 start() 方法时,它会通知 JVM 启动一个新的线程,并且该线程将执行 run() 方法中的代码。5.执行线程任务:run() 方法定义了线程执行的任务,也就是说线程所需执行的代码通常都在 run() 方法内。
2025-05-03 22:31:06
286
原创 Java中创建线程方式
在Java中创建线程有几种常见的方式,每种方式在不同的场景下有各自的优缺点,下面详细介绍几种创建线程的方式,并讨论它们的适用场景、优缺点以及相关的线程管理概念。
2025-05-03 22:17:28
710
原创 HashMap和Hashtable区别?
的全锁方式,它使用了分段锁(Segment)来提高并发性。旧的代码或对线程安全性要求较高但没有性能要求的情况。提供了一种高效的并发控制机制,避免了。
2025-05-02 16:05:15
459
原创 HashSet和HashMap区别
特性HashSetHashMap存储内容存储唯一的元素存储键值对(key-value查询性能O(1)O(1)实现原理基于HashMap实现使用哈希表存储键值对遍历方式无序,使用Iterator无序,使用keySet()entrySet()使用场景存储唯一元素存储键值对,缓存、计数器等线程安全非线程安全,使用非线程安全,使用插入顺序不保证顺序不保证顺序,保持插入顺序Null 值处理允许一个null元素允许一个null作为key和多个null作为value底层数据结构基于HashMapkey。
2025-05-02 15:44:02
639
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人