自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 资源 (2)
  • 收藏
  • 关注

原创 deleagateAdapter的实践

整理设计和实践思想逻辑

2022-09-30 00:18:53 475 1

原创 数据结构补充一篇

数据结构补充篇

2022-02-13 23:35:01 383

原创 AIDL底层原理需要搞明白的三个点

AIDL底层实现原理

2022-02-06 23:57:35 1915

原创 整理几个小点

androd 基础知识散点

2022-02-05 00:44:45 1539

原创 关于JVM的一些整理和思考

前言java作为Android的通用语言必须要好好搞懂,搞懂java首先要搞懂JVM,这也是走向架构的第一步;首先上一张JVM的内存结构图:运行时数据区域:1、程序计数器的作用:为了保证程序能够连续的执行下去,通过程序计数器来指向需要执行的指令的地址2、本地方法栈:调用方法的时候,进行的压栈处理3、虚拟机栈:转本用来存贮当前线程运行时所需要的数据、指令‘、返回地址等;每个方法执行的时候都会创建一个栈帧,栈帧可以划分为:局部变量栈、操作数栈、动态链接、返回地址;例如:int a = 0 ; a

2022-01-03 00:52:42 861

原创 Android四大组件的启动分析与整理(一):Activity的启动过程

Activity的启动过程

2021-06-14 22:59:39 641 6

原创 android 属性动画原理分析(一)

前言首先同样,我们来看一段例子:这里我之前刚做完databinding的分析,就直接接着用了,这里的dbBinding.recyclerView其实就是 recyclerView实例对象LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.VERTICAL);dbBinding.recyclerView.setLayoutM

2020-10-08 00:18:01 528

原创 Fragment源码分析(二):commitXXX和popXXX

前言接着上一篇继续将fragment的提交过程,为啥单独将提交过程呢,因为它复杂嘛。。。首先引入一段代码,因为使用了addToBackStack,因此不能用带now的commitFragmentTransaction transaction = manager.beginTransaction();transaction.add(R.id.fragment_one, new FirstFragment(R.layout.fragment_first), "firstFragment");trans

2020-09-20 00:55:18 322

原创 Fragment源码分析(一):使用刨坑

前言为什么要分析fragment呢,以为我们平时用的很多,但是总是遇到各种莫名其妙的问题,比如pop没作用啊,添加后不能隐藏啊,以及莫名其妙的崩溃啊等等。关于fragment 的分析,网上有很多,但看他们分析的代码都是很早以前的源码,话不多说,开始分析,首先来一段代码:FragmentManager manager = getSupportFragmentManager();(1)FirstFragment firstFragment = new FirstFragment(R.layout.fra

2020-09-17 23:56:41 900

原创 jetpack系列文章:ViewModel源码+最终组合使用

前言ViewModel一般都是和livedata一起使用,主要目的其实就是为了解耦,livedata中通过lifecycle根据生命周期做一些事情,ViewModel控制着数据,结合databinding,相互配合使用,ViewModel控制着数据,通过反射创建并在store中统一进行管理这里需要说一下,ViewModel在2.1.0之后废弃了ViewModelProviders这个类,统一使用ViewModelProvider,其实吧,说白了就是把ViewModelProviders中的of方法拆开了

2020-09-09 23:56:06 745

原创 jetpack系列文章:livedata源码分析

前言官方给我们提供了两个livadata实现类,一个是MutableLiveData,另一个是MediatorLiveData,两者相比起来都比较简单:MutableLiveData里面只有两个方法,一个是setValue当前线程,另一个是postValue主线程。MediatorLiveData里面主要是实现observeForever方法。我们通过MutableLiveData举例,看一段实例代码:MutableLiveData<String> mElapsedTime = new M

2020-09-09 23:15:37 207

原创 jetpack系列文章:Lifecycle源码讲解

前言:Lifecycle源码解析相对比较简单,主要是用来监听生命周期的。使用起来很简单,我们现在的项目一般都是support26以上,新项目一般也都使用AndroidX了,所以不用在乎兼容问题。Lifecycle是一个观察者模式,所以,从注册观察者开始。一般在onCreate中添加这么一句话就注册完了。getLifecycle().addObserver(new TestObserver());前提是你的Activity继承了(AppCompatActivity extends FragmentA

2020-09-06 23:46:39 179

原创 jetpack系列文章:Databinding源码分析(二):动态数据更新

Databinding源码分析这里分两部分讲单双向数据绑定[数据监听]

2020-08-30 23:43:32 260

原创 jetpack系列文章:Databinding源码分析(一):单双向数据绑定

前言: 由于公司新项目使用MVVM模式,基于databinding的,因此专门分析了一下源码,有助于开发。之前项目用到的是MVP框架,其实MVP也能实现V和M的解耦,只是MVVM在解耦的基础上实现了V和M的双向绑定,达到自动更新同步数据,使开发更加便。话不多说,开始分析,使用网上很多了,这里不说了:APT技术:databinding我们用起来很简单,越简单表示框架帮我们完成了越多的东西,毫无疑问自动生成的代码是通过apt技术完成的,这个我已经在Arouter源码分析中讲过了,这里附上链接,不再赘述:A

2020-08-30 23:39:54 606

原创 Netty源码分析(二):Reactor模型在Netty中的应用

Netty源码分析主要分两部分:基础知识源码分析服务端测试代码:总体分为三步:初始化+注册+绑定其中bossGroup和workerGroup就是基于主从Reactor模型的两个路由,bossGroup主要负责管理链接,workerGroup主要负责成功链接后链路上的数据读写。EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); Ser

2020-08-24 17:29:53 190

原创 Netty源码分析(一):基础知识

首先需要了解一下基本概念一、同步、异步、阻塞、非阻塞(网上很多说比较乱,还是自己总结一下吧):首先同步也异步是对与用户空间来说的,java上通常作用与线程;阻塞和非阻塞是对于kernel内核来说的,通常作用与socket。阻塞和非阻塞都属于同步。同步(Synchronous communication): 需要阻塞等待消息执行返回结果,则为同步,例如线程池的submit()提交方式异步(Asynchronous communication): 无需等待等待,通过callback回调接受消息则为异步。

2020-08-22 13:05:06 228

原创 关于锁的总结,不是很深入,以后再细化吧

Synchronized原理:作用:是一个独占锁,用来实现线程同步。作用对象:主要修饰静态方法、非静态方法、代码块;如何实现:即实现java的monitor机制,当Synchronized修饰代码块时,会在代码块的开始和结束位置插入monitorentry和monitorexit指令。如果修饰方法,会在flag标志中插入ACC_SYNCHRONIZED指令。同步的本质其实就是看线程获取的锁对象是不是同一个锁监听器:例如,静态方法的锁对象监听器是xx.class字节码,那么当一个线程访问该类中sy

2020-08-14 16:55:56 308

原创 binder机制原理分析(五):Java层service的获取过程

在AIDL中Java层获取service都是通过XXX.Stub.asInterFace()方法获取的;IXXXManager service = IXXXManager.Stub.asInterface(ServiceManager.getService(“name”));步骤一、获取ServiceManager的引用首先从缓存中获取,如果缓存中没有,那么就通过getService()方法获取。public static IBinder getService(String name) {

2020-08-14 14:29:31 801

原创 binder机制原理分析(四):java层service的注册过程

步骤一、初始化注册jni对象Binder通信最终还是依赖与native层,java层的binder是native层binder的一个封装,实现还是在native层,这个映射关系在系统初始化的时候(在AndroidRuntime.cpp中)就将javaBinder和nativeBinder进行建立。并分别有结构体与之对应,如gBinderOffset与Binder、gBinderInternalOffset与BinderInternal、gBinderProxyOffset与BinderProxy的映射关系

2020-08-14 14:08:10 452

原创 binder机制原理分析(三):从ServiceManager中获取服务

服务的获取和注册过程相似。获取一般经过:sp sm = defaultServiceManager();binder = sm->getService(String16(“media.player”));binder->linkToDeath(sDeathNotifier);sMediaPlayerService = interface_cast(binder);步骤一:defaultServiceManager()跟注册一样,defaultServiceManager最终返回的

2020-08-14 12:57:23 587

原创 binder机制原理分析(二):普通Service注册到ServiceManager

一般service注册到ServiceManager都经过五个步骤:sp proc = (ProcessState::self());获取ProcessState实例;sp sm = defaultServiceManager();获取IServiceManager实例;XXXService::Instantiate();调试用addService方法,将XXX服务注册到sm中去;ProcessState::self()—>startThreadPool();开启binder线程池;IPC

2020-08-14 12:26:31 772

原创 binder机制原理分析(一):ServiceManager 进程启动

前言:要讲解分析binder,最好是从SM的启动开始分析讲解,不然就会感觉总有黑洞没有探索,会总惦记着,感觉缺少点啥;ServiceMangerd的启动主要分为3步骤:通过binder_open方法打开binder设备驱动文件,然后通过mmap机制实现地址双映射。将通过binder_become_context_manager指令将自己设置成为系统服务的大管家。通过binder_looper方法,通过ioctl不断与binder驱动进行读写交互,并通过binder_parse处理数据。int

2020-08-14 10:54:24 505

原创 触摸事件分发流程详解(三):触摸事件分发

Activity中的dispatchTouchEvent:一、如果在自定义的Activity中复写dispatchTouchEvent方法,除非返回super.dispatchTouchEvent(),否则都将直接拦截view的事件分发。因为事件分发是在Activity的dispatchTouchEvent()方法中进行的,如下:dispatchTouchEventpublic boolean dispatchTouchEvent(MotionEvent ev) {1、接受到触摸事件的时候,调用这个

2020-08-13 18:01:16 717

原创 触摸事件分发流程详解(二):事件发送和接受

InputDispatch中的发送部分(待补充)继续接着上篇文章分析NativeInputEventReceiver中的NativeInputEventReceiver中的handleEvent()建立好channel之后,就是通信了。从InputDispatcher从InBoundQueue队列头中取出事件,然后通过将中将消息发出来了,ViewRootImpl通过就是NativeInputEventReceiver中的handleEvent()方法。int NativeInputEventRece

2020-08-13 15:49:58 463

原创 触摸事件分发流程详解(一):建立InputChannel

这里分析从ViewRootImpl开始:ViewRootImpl的setView:触摸事件java端的入口可以从ViewRootImpl的setView讲起,什么时候调用的setView可以查看window的界面显示机制。对于输入事件分发机制来说,这个setView主要做了四件事:在这里创建了客户端的InputChannel对象。通过binder机制,调用WindowSession的addToDisplay方法,并将InputChannel传入进去。创建WindowInputEventReve

2020-08-13 14:55:33 514

原创 Android view绘制流程详解(二)View的绘制

View的绘制流程一、ActivityThread的RESUME_ACTIVITY消息当Activity的H接收到RESUME_ACTIVITY消息的时候,调用了handleResumeActivity方法。case RESUME_ACTIVITY: SomeArgs args = (SomeArgs) msg.obj; handleResumeActivity((IBinder) args.arg1, true, args.argi1 != 0, true,

2020-08-13 14:17:21 334 1

原创 Android view绘制流程详解(一)ViewTree的生成

ViewTree的生成类的介绍:ActivityThread:它是Activity的一个主线程,是main入口。其中有个内部类ApplicationThread extends ApplicationNative extends Binder,当ApplicationNative通过binder通信在onTransact方法获取到Activity的各种生命周期,通过schedule_xxx_xxx_transaction的处理各个生命周期的分支,在分支中通过handler机制将消息发送到Activit

2020-08-13 11:18:33 557

原创 Handler机制以及looper不卡顿问题分析

Looper:Android环境下通过Looper.prepareMainLooper():里面还是调用的prepare(false)方法,这个false表示不可退出标志为。public static void prepareMainLooper() { prepare(false); synchronized (Looper.class) { if (sMainLooper != null) { throw new IllegalStateE

2020-08-12 17:34:53 760

原创 SharedPreference源码分析及注意要点

SharedPreference源码分析:Sp注意事项:SDK 24 (android 7.0)以上版本,不支持MODE_WORLD_WRITABLE和MODE_WORLD_READABLE。SDK 11以上版本用MODE_MULTI_PROCESS来支持多进程,但没啥用,官方建议使用fileProvider或contentProvider代替。Sdk26开始对文件级加密做判断处理,线程处理由Executors.newSingleThreadExecutor()改成handlerThread每次

2020-08-12 16:48:38 215

原创 retrofit简单使用以及源码分析

retrofit简单使用以及源码分析:概述retrofit说白了就是动态代理的原理,这篇文章源码分析不对,要是了解动态的代理的话,那么retrofit就没什么难度的了注解的基本知识@Retention – 定义该注解的生命周期● RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。● RetentionPolicy.CLASS : 在类加

2020-08-12 15:37:06 147

原创 OKHTTP使用以及源码分析

okhttp使用以及源码分析设计模式:主要使用了建造者模式、责任链模式简单使用OkHttpClient okHttpClient = new OkHttpClient(); //创建client对象Request request = RequestBody.create(new MediaType(),jsonString);//post消息体Request request = new Request.Builder().url(url).get().build

2020-08-12 15:05:05 216

原创 ARouter路由简单使用以及源码解析

ARouter路由原理:基本使用:Application中的注册:@Overridepublic void onCreate() { super.onCreate(); //官方建议推荐在Application中初始化 ARouter.init(this);}@Overridepublic void onTerminate() { super.onTerminate(); ARouter.getInstance().destroy();}Activ

2020-08-12 14:30:47 1029 1

原创 EventBus简单使用以及源码分析

吐槽一下,这个简书的编辑功能太不友好了,不能像word一样快捷键点击,还需要自己一点一点按格式抠。。。。吐槽完毕,之前源码分析都在自己的本地,没有传到网上,因为很多网上都有,这次尝试搬到网上,但是这个编辑功能太费劲,全搬上来估计格式问题就得调很久,还是不搬了。基本使用:添加依赖:implementation 'org.greenrobot:eventbus:3.1.1'EventBus的注册:EventBus.getDefault().register(this);事件的发送:普通事件的

2020-08-08 13:06:58 313

haxm-windows-V7.6.5版本

haxm-windows-V7.6.5版本

2023-02-22

android_parcelable_code_general

Android parcelable接口自动生成插件,当一个实体bean类去实现一个parcelable接口的时候,可以自动帮你生成writeToParcel和Fruit构造方法,非常方便

2020-12-08

MUI快速开发笔记文档

自己看视频学习综合的学习笔记,有模块案例,对于入门的朋友很有用

2017-07-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除