- 博客(33)
- 资源 (2)
- 收藏
- 关注
原创 关于JVM的一些整理和思考
前言java作为Android的通用语言必须要好好搞懂,搞懂java首先要搞懂JVM,这也是走向架构的第一步;首先上一张JVM的内存结构图:运行时数据区域:1、程序计数器的作用:为了保证程序能够连续的执行下去,通过程序计数器来指向需要执行的指令的地址2、本地方法栈:调用方法的时候,进行的压栈处理3、虚拟机栈:转本用来存贮当前线程运行时所需要的数据、指令‘、返回地址等;每个方法执行的时候都会创建一个栈帧,栈帧可以划分为:局部变量栈、操作数栈、动态链接、返回地址;例如:int a = 0 ; a
2022-01-03 00:52:42
900
原创 android 属性动画原理分析(一)
前言首先同样,我们来看一段例子:这里我之前刚做完databinding的分析,就直接接着用了,这里的dbBinding.recyclerView其实就是 recyclerView实例对象LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.VERTICAL);dbBinding.recyclerView.setLayoutM
2020-10-08 00:18:01
578
原创 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
377
原创 Fragment源码分析(一):使用刨坑
前言为什么要分析fragment呢,以为我们平时用的很多,但是总是遇到各种莫名其妙的问题,比如pop没作用啊,添加后不能隐藏啊,以及莫名其妙的崩溃啊等等。关于fragment 的分析,网上有很多,但看他们分析的代码都是很早以前的源码,话不多说,开始分析,首先来一段代码:FragmentManager manager = getSupportFragmentManager();(1)FirstFragment firstFragment = new FirstFragment(R.layout.fra
2020-09-17 23:56:41
945
原创 jetpack系列文章:ViewModel源码+最终组合使用
前言ViewModel一般都是和livedata一起使用,主要目的其实就是为了解耦,livedata中通过lifecycle根据生命周期做一些事情,ViewModel控制着数据,结合databinding,相互配合使用,ViewModel控制着数据,通过反射创建并在store中统一进行管理这里需要说一下,ViewModel在2.1.0之后废弃了ViewModelProviders这个类,统一使用ViewModelProvider,其实吧,说白了就是把ViewModelProviders中的of方法拆开了
2020-09-09 23:56:06
787
原创 jetpack系列文章:livedata源码分析
前言官方给我们提供了两个livadata实现类,一个是MutableLiveData,另一个是MediatorLiveData,两者相比起来都比较简单:MutableLiveData里面只有两个方法,一个是setValue当前线程,另一个是postValue主线程。MediatorLiveData里面主要是实现observeForever方法。我们通过MutableLiveData举例,看一段实例代码:MutableLiveData<String> mElapsedTime = new M
2020-09-09 23:15:37
242
原创 jetpack系列文章:Lifecycle源码讲解
前言:Lifecycle源码解析相对比较简单,主要是用来监听生命周期的。使用起来很简单,我们现在的项目一般都是support26以上,新项目一般也都使用AndroidX了,所以不用在乎兼容问题。Lifecycle是一个观察者模式,所以,从注册观察者开始。一般在onCreate中添加这么一句话就注册完了。getLifecycle().addObserver(new TestObserver());前提是你的Activity继承了(AppCompatActivity extends FragmentA
2020-09-06 23:46:39
208
原创 jetpack系列文章:Databinding源码分析(二):动态数据更新
Databinding源码分析这里分两部分讲单双向数据绑定[数据监听]
2020-08-30 23:43:32
290
原创 jetpack系列文章:Databinding源码分析(一):单双向数据绑定
前言: 由于公司新项目使用MVVM模式,基于databinding的,因此专门分析了一下源码,有助于开发。之前项目用到的是MVP框架,其实MVP也能实现V和M的解耦,只是MVVM在解耦的基础上实现了V和M的双向绑定,达到自动更新同步数据,使开发更加便。话不多说,开始分析,使用网上很多了,这里不说了:APT技术:databinding我们用起来很简单,越简单表示框架帮我们完成了越多的东西,毫无疑问自动生成的代码是通过apt技术完成的,这个我已经在Arouter源码分析中讲过了,这里附上链接,不再赘述:A
2020-08-30 23:39:54
640
原创 Netty源码分析(二):Reactor模型在Netty中的应用
Netty源码分析主要分两部分:基础知识源码分析服务端测试代码:总体分为三步:初始化+注册+绑定其中bossGroup和workerGroup就是基于主从Reactor模型的两个路由,bossGroup主要负责管理链接,workerGroup主要负责成功链接后链路上的数据读写。EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); Ser
2020-08-24 17:29:53
217
原创 Netty源码分析(一):基础知识
首先需要了解一下基本概念一、同步、异步、阻塞、非阻塞(网上很多说比较乱,还是自己总结一下吧):首先同步也异步是对与用户空间来说的,java上通常作用与线程;阻塞和非阻塞是对于kernel内核来说的,通常作用与socket。阻塞和非阻塞都属于同步。同步(Synchronous communication): 需要阻塞等待消息执行返回结果,则为同步,例如线程池的submit()提交方式异步(Asynchronous communication): 无需等待等待,通过callback回调接受消息则为异步。
2020-08-22 13:05:06
253
原创 关于锁的总结,不是很深入,以后再细化吧
Synchronized原理:作用:是一个独占锁,用来实现线程同步。作用对象:主要修饰静态方法、非静态方法、代码块;如何实现:即实现java的monitor机制,当Synchronized修饰代码块时,会在代码块的开始和结束位置插入monitorentry和monitorexit指令。如果修饰方法,会在flag标志中插入ACC_SYNCHRONIZED指令。同步的本质其实就是看线程获取的锁对象是不是同一个锁监听器:例如,静态方法的锁对象监听器是xx.class字节码,那么当一个线程访问该类中sy
2020-08-14 16:55:56
348
原创 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
868
原创 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
492
原创 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
661
原创 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
836
原创 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
553
原创 触摸事件分发流程详解(三):触摸事件分发
Activity中的dispatchTouchEvent:一、如果在自定义的Activity中复写dispatchTouchEvent方法,除非返回super.dispatchTouchEvent(),否则都将直接拦截view的事件分发。因为事件分发是在Activity的dispatchTouchEvent()方法中进行的,如下:dispatchTouchEventpublic boolean dispatchTouchEvent(MotionEvent ev) {1、接受到触摸事件的时候,调用这个
2020-08-13 18:01:16
766
原创 触摸事件分发流程详解(二):事件发送和接受
InputDispatch中的发送部分(待补充)继续接着上篇文章分析NativeInputEventReceiver中的NativeInputEventReceiver中的handleEvent()建立好channel之后,就是通信了。从InputDispatcher从InBoundQueue队列头中取出事件,然后通过将中将消息发出来了,ViewRootImpl通过就是NativeInputEventReceiver中的handleEvent()方法。int NativeInputEventRece
2020-08-13 15:49:58
529
原创 触摸事件分发流程详解(一):建立InputChannel
这里分析从ViewRootImpl开始:ViewRootImpl的setView:触摸事件java端的入口可以从ViewRootImpl的setView讲起,什么时候调用的setView可以查看window的界面显示机制。对于输入事件分发机制来说,这个setView主要做了四件事:在这里创建了客户端的InputChannel对象。通过binder机制,调用WindowSession的addToDisplay方法,并将InputChannel传入进去。创建WindowInputEventReve
2020-08-13 14:55:33
569
原创 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
374
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
644
原创 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
811
原创 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
237
原创 retrofit简单使用以及源码分析
retrofit简单使用以及源码分析:概述retrofit说白了就是动态代理的原理,这篇文章源码分析不对,要是了解动态的代理的话,那么retrofit就没什么难度的了注解的基本知识@Retention – 定义该注解的生命周期● RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。● RetentionPolicy.CLASS : 在类加
2020-08-12 15:37:06
174
原创 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
239
原创 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
1083
1
原创 EventBus简单使用以及源码分析
吐槽一下,这个简书的编辑功能太不友好了,不能像word一样快捷键点击,还需要自己一点一点按格式抠。。。。吐槽完毕,之前源码分析都在自己的本地,没有传到网上,因为很多网上都有,这次尝试搬到网上,但是这个编辑功能太费劲,全搬上来估计格式问题就得调很久,还是不搬了。基本使用:添加依赖:implementation 'org.greenrobot:eventbus:3.1.1'EventBus的注册:EventBus.getDefault().register(this);事件的发送:普通事件的
2020-08-08 13:06:58
340
android_parcelable_code_general
2020-12-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人