- 博客(20)
- 收藏
- 关注
原创 第三方支付原理
这里重点就是fsockopen函数,在发送电子邮件时我们已经接触过,通过此函数打开套接字连接,类似于以前学过的fopen函数返回的是一个文件句柄,之后可以使用文件函数( fgets()、fgetss()、fputs()、fclose() feof()等)对其进行操作,代码中使用了fputs()(同fwrite())函数,写入数据来模拟表单以POST方式提交数据,最后通过fgets()函数获取返回的数据保存到数组中,最后进行验证,具体参照源码。把参数提交给支付网关后,页面跳转到到支付页面。
2023-12-04 09:09:40
1223
原创 Tinker原理——入门
前者的特点是修复粒度小,但有稳定性问题(Sophix 已解决),局限性在于不适用于类结构发生变化的修改和修复了的非静态方法被反射调用,它的优点是能即时生效。原理是通过对底层的 ArtMethod 结构体进行完整替换来实现。后者的特性是修复粒度大,稳定性和兼容性较好,但改动需要冷启动才能生效。原理是在 APP 重新启动后让类加载器 Classloader 去加载新替换的类来实现改动。本文的热修复就是这种思路来实现。目前实现代码修复主要有两种方式:native 底层替换和类加载替换。
2023-12-01 09:03:04
396
1
原创 android优化篇
RecyclerView最多可以缓存 N(屏幕最多可显示的item数【Scrap缓存】) + 2 (屏幕外的缓存【CacheView缓存】) + 5*M (M代表M个ViewType,缓存池的缓存【RecycledViewPool】)。RecyclerView实际只有两层缓存可供使用和优化。
2023-12-01 08:49:51
913
1
原创 Socket和Http通信原理
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议,主要利用三元组【ip地址,协议,端口】。Http协议即超文本传输协议,是Web联网的基础,也是手机联网常用的协议之一,http协议是建立在TCP协议之上的一种应用。socket连接:socket连接即是所谓的长连接,理论上客户端和服务端一旦建立连接,则不会主动断掉;
2023-11-30 09:38:38
1726
原创 锤爆Handler!!!
另外,如果一组对象中只包含互相的引用,而没有来自它们外部的引用(例如有两个对象A和B互相持有引用,但没有任何外部对象持有指向A或B的引用),这仍然属于不可到达,同样会被GC回收。点击按钮的时候会发送消息到Handler,但是为了保证优先执行,会加一个标记异步,同时会发送一个target为null的消息,这样在使用消息队列的next获取消息的时候,如果发现消息的target为null,那么会遍历消息队列将有异步标记的消息获取出来优先执行,执行完之后会将target为null的消息移除。
2023-11-30 09:15:06
452
原创 Java多线程和android四大组件
四大组件:Java中的多线程是指在一个程序中有多个执行线程同时运行,共同完成不同的任务。多线程可以提高程序的执行效率,同时也可以提高程序的响应速度和交互性。1.继承Thread类:Java中的Thread类是实现多线程的基类,通过继承Thread类并重写其run()方法,可以创建新的线程并执行。
2023-11-30 09:09:36
970
原创 Android 手机屏幕适配方式和原理
就是我们平常讲的手机屏幕大小,是屏幕的对角线长度,一般讲的大小单位都是英寸。其适配原理主要是根据dp/sp与px的转换,而dp/sp与px的转换又与DisplayMetrics的density相关,所以可以通过改变DisplayMetrics的density,scaledDensity和densityDpi的值来适配不同分辨率机型。是dot per inch的缩写,就是每英寸的像素数,也叫做屏幕密度。是Density independent pixel的缩写,指的是抽象意义上的像素。
2023-11-30 08:52:49
1057
1
原创 冷,热,温启动
当用户点击你的app那一刻到系统调用Activity.onCreate()之间的这个时间段内,WindowManager会先加载app主题样式中的windowBackground做为app的预览元素,然后再真正去加载activity的layout布局。很显然,如果你的application或activity启动的过程太慢,导致系统的BackgroundWindow没有及时被替换,就会出现启动时白屏或黑屏的情况(取决于你的主题是Dark还是Light)。因此本文重点谈论的是对冷启动相关的优化。
2023-11-28 14:47:48
976
原创 OkHttp+Retrofit实现原理
HttpEngine 在发起请求之前,会先调用nextConnection()来获取一个Connection对象,如果可以从ConnectionPool中获取一个Connection对象,就不会新建,如果无法获取,就会调用createnextConnection()来新建一个Connection对象,这就是 Okhttp 多路复用的核心,不像之前的网络框架,无论有没有,都会新建Connection对象。最后,从使用场景看,应用拦截器因为只会调用一次,通常用于统计客户端的网络请求发起情况;
2023-11-28 10:02:08
1318
原创 LiveData的实现原理?
LiveData 保证数据的更新和通知操作是在主线程进行的,以确保数据更新的安全性和一致性当数据发生变化时,LiveData 会在主线程中通知观察者,从而避免了多线程操作数据的问题。LiveData 支持数据粘性,即当观察者订阅LiveData 时,会立即收到近的数据,而不仅仅是后续的数据变化。LiveData提供了背压支持,可以处理观察者无法及时处理所有数据变化的情况,当观察者无法及时处理数据变化时,LiveData会根据背压策略进行处理,如丢弃新数据,缓存数据等。
2023-11-27 18:35:38
862
1
原创 Lifecycle的实现原理
4、创建ObserverWithState 该对象的时候会创建新的装饰的观察者FullLifecycleObserverAdapter、implements LifecycleEvenObserver。其实就是通过 LifecycleOwner 和 LifecycleRegistry 之间的关联,来实现对组件生命周期的管理。当 LifecycleOwner 的生命周期事件发生时,LifecycleRegistry 会通知所有注册的 LifecycleObserver 对象,让它们执行相应的操作。
2023-11-25 10:05:00
423
原创 Glide的三级缓存和四级缓存
进行的网络请求可以和当前页面(Activity或者Fragment)生命周期绑定在一起,当在某一个页面中开始请求网络图片时,假设此时突然按了退出键,那么Glide能监听到这个页面(Activity或者Fragment)的onStop方法,它会将当前所有正在进行但是尚未完成的Request请求暂停掉;内存缓存:当活动缓存中找不到可用资源,从内存缓存中查找,同时将内存缓存中的资源放入活动缓存,并从内存缓存中移除资源。网络缓存:当磁盘缓存中也找不到时,就从网络加载,并将请求返回的资源存入磁盘缓存中。
2023-11-25 09:53:53
1272
2
原创 Retrofit的实现原理?
Retrofit 是一个建立在 OkHttp 基础之上的网络请求库,能够将我们定义的 Java 接口转化为相应的 HTTP 请求。通过 Retrofit,我们轻松发起网络请求,还能将服务器返回的数据转换为所需的格式,如 JSON 或 XML。
2023-11-25 09:38:51
792
原创 Arouter的实现原理?
组件化的各个业务模块module之间,相互独立,没有依赖关系,所以,在一个module中,不能获取另外一个module中的Activity.class。这段Java代码的功能,就是把activity.class存入HashMap中,需要跳转到其他Module的Activity时,直接从HashMap里面取出activity.class。3.通过APT技术,根据保存的类名和包名,生成对应的Java代码,这段Java代码的功能就是把activity.class存入路由表,也就是HashMap。
2023-11-25 09:32:52
444
原创 LeakCanary的实现原理?
官方的原理简单来解释就是这样的:在一个Activity执行完onDestroy()之后,将它放入WeakReference中,然后将这个WeakReference类型的Activity对象与ReferenceQueque关联。这时再从ReferenceQueque中查看是否有没有该对象,如果没有,执行gc,再次查看,还是没有的话则判断发生内存泄露了。最后用HAHA这个开源库去分析dump之后的heap内存。分为七个步骤:(了解即可)
2023-11-24 18:47:53
380
1
原创 热修复的原理是什么?
下面的两个实现都是对程序中的一个方法进行了修改,然后分别打了 dex包和apk包,程序运行起来执行的方法就是插件里面的方法而不是程序本身的方法;就是将补丁 dex 文件放到 dexElements 数组靠前位置,这样在加载 class 时,优先找到补丁包中的 dex 文件,加载到 class 之后就不再寻找,从而原来的 apk 文件中同名的类就不会再使用,从而达到修复的目的。Android 使用了PathClassLoader 进行类的加载,实践的加载类是它的父类 BaseDexclassLoader的。
2023-11-24 18:40:48
371
原创 Binder原理是什么?
假设我们使用 binder,那么因为APP端的 binder 是拷贝自 Zygote进程的,所以如果要释放掉APP的Server端binder引用对象,就必须释放掉AMS中的Client端binder对象,那这样就会导致AMS失去binder从而无法正常向Zygote发送消息。进程的 fork,是拷贝一个和原进程一摸一样的进程,其中的各种内存对象自然也会被拷贝。所谓的代理对象实际上就是在客户端建立一个服务端的“引用,该代理对象具有服务端的功能,使其在客户端访问服务端的方法就像访问本地方法一样。
2023-11-24 18:27:07
1018
原创 View绘制原理
Activity通过Window与View关联,在Android中Window的实现是PhoneWindow,在PhoneWindow中存在DecorView,DecorView在Activity的onCreate生命周期的setContentView中初始化,其实DecorView就是一个ViewGroup,继承关系:DecorView->FrameLayout->ViewGroup。4.重写ViewGroup的onDraw函数时,要注意onDraw函数在整个draw流程的地位,以及它并不是都会被调用。
2023-11-24 09:30:02
376
1
原创 自定义轮播图
else if (state == ViewPager.SCROLL_STATE_DRAGGING) { //用户正在滑动。if (state == ViewPager.SCROLL_STATE_IDLE) { //处于停止状态。图片标记边框1:banner_indicator_focus.xml。图片标记边框2:banner_indicator_focus.xml。* 图片轮播(手动控制自动轮播与否,便于资源控件)// 设置图片滚动指示器背景。// 设置图片点击监听。// 滚动图片右下指示器。
2023-11-02 13:39:21
41
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人