
源码
文章平均质量分 61
yuezheyue123
这个作者很懒,什么都没留下…
展开
-
android源码--setContentView()和LayoutInflater.inflate()源码分析
查看源代码的网站http://androidxref.com 1.activity中的setContent(id)的源码 这里的getWindow()其实就是PhoneWindow对象,直接在studio中并不能查看,需要借助上面的网站 2.在PhoneWindow类中,重要的还是调用了installDecor()方法和LayoutInflater中的inflate方法,其中insta...原创 2018-08-30 16:24:38 · 650 阅读 · 0 评论 -
设计模式---模板方法模式和AsyncTask的源码分析
定义:定义一个操作中的方法的框架,将这些方法的具体的实现延迟到子类中实现, 使得子类能够不改变算法的结构就能重新定义算法的内容。也就是流程封装。使用场景:代码执行的流程是固定的,也就是我们常用的将各个方法抽取的到父类中,然后通过钩子函数进行约束子类中的行为。我们常用的BaseActivity,BaseFragment等都是使用这种设计模式。优点:封装不变的部分,扩展可变的部分。提取公共的方法,...原创 2018-09-27 11:14:49 · 186 阅读 · 0 评论 -
源码分析---Thread源码分析
1.线程的使用2.线程初始化,这里的第三个参数就是线程的名字,也就是我们打印后的线程名。3.调用start()方法。,这里最重要的就是调用native方法nativeCreate()。在这里进行创建线程,并且调用run()方法。这样Runnable中的run()方法也就被调用了4.调用nativeCreate()方法后调用run()方法。这里的target就是Runnable对象。...原创 2018-09-28 11:25:03 · 222 阅读 · 0 评论 -
源码分析---线程池ThreadPoolExecutor源码分析
1.使用2.构造器,这里需要传递一个线程的制作工厂DefaultThreadFactory。在DefaultThreadFactory类中,封装了newThread()方法,在这里,会创建线程。这个方法会在下面进行调用。3.接着调用execute()方法。这里重要的是调用addWorker()方法。4.在addWorker()方法中。在这里创建线程,并且启动线程。其中在Wor...原创 2018-09-28 14:38:19 · 213 阅读 · 0 评论 -
SparseArray源码分析
1.构造器默认传递的数组大小为10这里创建了两个数组,一个存放value,另一个存储key。这两个数组相同索引值所对应的key和value是相互对应的。2.存放数据,先用二分法查询到相应key所对应的索引①如果查到索引,那么就直接通过索引去修改相对应的value数组值就可以。②如果没有查到索引,就取反。这里的DELETED是在delete()方法中删除时候赋予的一个空...原创 2019-01-23 17:15:14 · 177 阅读 · 0 评论 -
HashMap源码分析
HashMap&运算0&0=0 1&1=1 其他有0为0也是有扩容的情况这个的原理是一个数组 然后其中的每个元素存放的都是链表。当一个添加一个hash值相同的节点时候最新的节点会放在数组中,其他的节点会往后移动。链表的节点,可以很清楚的知道是一个单链表。HashMap的创建,仅仅是定义了数组的默认的长度,并没有创建数组,是在put()中创建的...原创 2019-03-20 10:51:36 · 168 阅读 · 0 评论 -
ViewStub的源码
使用ViewStub能够实现view懒加载,只有在调用setVisible()或是调用inflate()方法的时候,才进行加载模块。使用:在布局中使用ViewStub,然后通过layout标签,引入其他的布局文件。源码:1.在ViewStub加载的时候,先执行onMeasure方法,设置width和height的值为0.并且在draw()方法中是空实现...原创 2019-04-01 10:29:37 · 231 阅读 · 0 评论 -
Binder的机制和AIDL源码分析
1.Binder的原理Binder主要是解决跨进程通信。分为Client和Server两个进程。Client和Server是相对的,也就是说谁发消息谁就是Client,然后收消息就是Server。ServiceManager负责吧Binder Server注册到一个容器中。Binder的通信过程。①首先Server在ServerManager容器中注册。②如果Client若要调用Serv...原创 2019-04-02 18:04:13 · 228 阅读 · 0 评论 -
源码分析---onSaveInstanceState()方法分析
①在Activity的onSaveInstanceState()方法中,调用super()方法,里面最终就是调用这里的方法。主要是保存activity的状态,fragment的状态,最终调用application进行存储状态。②首先是Activity的状态。上面的mWindow其实就是PhoneWindow,然后调用saveHierarchyState()方法。这里会使用mContentPar...原创 2018-09-21 13:54:49 · 1717 阅读 · 0 评论 -
android源码--androidEventBus分析
观察者:1.首先是订阅者进行订阅在activity中使用注解来确定订阅的方法,tag相当于广播的action,在方法中只能填一个参数。参数类型不限制。2.在EventBus类中进行注册,使用mMethodHunter类,主要是负责维护事件和订阅者之间的map关系3.在SubscribeMethodHunter类中,将通过订阅的类获取里面加入注解的方法,因为支持一个参数,因此进行过滤...原创 2018-09-20 14:08:44 · 305 阅读 · 0 评论 -
Java简单了解LruCache源码
1.在LruCache的构造器中很明显知道LruCache使用LinkedHashMap,并且将accessOrder设置为true。这样在使用LinkedHashMap的get()方法的时候就会使其双链表重新进行排序,也就是将当前查询的节点断开,然后调用addBefore()方法重新将节点添加到双链表的头部。并且传递了LruCache所占的内存的大小maxsize。 2.调用put()方法...原创 2018-07-26 09:25:16 · 1794 阅读 · 0 评论 -
Java简单了解LinkedList源码
LinkedList 实现的原理应该是单链表,因为空链表的情况应该是header节点的前一节点和后一节点均为null。如果是循环链表,空链表应该头节点的头尾指针指向自己 。 首先注意链表的数据结构写法private static class Node<E> { E item;//数据 Node<E> n原创 2018-07-16 17:24:21 · 210 阅读 · 0 评论 -
java简单了解LinkedHashMap源码
LinkedHashMap也是循环双链表,继承自HashMap 因此调用put() 和构造器都是HashMap()的方法,但是在put()中的addEntry()中使用的是继承自HashMap中的HashMapEntry 并且又添加了两个属性由原来的单链表变成了循环的双向链表。并且这个双向链表是在init()方法中进行初始化的。这个方法在HashMap中构造器中进行调用,但是并没有实现。具体的实现...原创 2018-07-26 09:22:22 · 281 阅读 · 0 评论 -
Okhttp的全解析(1)
转载请申明出处: 本文出自[云遮月的博客] 1、通过Response response = client.newCall(request).execute();调用newCall()方法2、newCall()方法实际调用RealCall.newRealCall(this, request, false ), 返回的就是ReallCall 继承与Call表示的是一个请...原创 2018-06-14 09:36:45 · 507 阅读 · 0 评论 -
android源码---AlertDialog源码分析
AlertDialog的流程图 1.基本使用 2.创建AlertParams对象。 3.在builder的方法中进行给AlertParams对象进行赋值。并且返回this,这样达到链式调用的效果。 4.调用show()方法 5.在这里才创建了AlsertDialog()的对象 6.在AlertDialog的构造器中创建AlertController的对象。 ...原创 2018-09-03 16:53:23 · 323 阅读 · 0 评论 -
android源码--activity启动源码分析
1.app应用的真正入口是ActivityThread类中的main()方法。 2.调用Looper.prepareMainLooper()方法。 3.调用prepare(false)方法,这里的threadLocal其实就是一个map集合。这样新创建了一个Looper对象,添加到集合中。 在Looper的构造器中,初始化了消息队列并且获取当前的线程 4.调用myLoope...原创 2018-09-10 16:51:13 · 582 阅读 · 0 评论 -
android源码---ListView的notifyDataSetChanged()源码
1.调用2.在BaseAdapter中很明显发现是订阅者模式在这里创建了被观察者者对象3.具体的被观察者类,当有变化的时候就通过notifyChanged()方法通知注册的观察者。4.抽象的被观察者类.这里完全是正规的观察者模式的写法,包含了观察者的注册,解注册。并且里面也是利用了ArrayList进行观察者的存储。5.在BaseAdapter中进行暴露观察者的注册和解注册的...原创 2018-09-18 14:24:42 · 607 阅读 · 0 评论 -
android源码---ViewGroup的dispatchTouchEvent()的源码分析
貌似在LinearLayout RelativeLayout的dispatchTouchEvent()方法都在ViewGroup中。对于TextView的也是在View中。 ①当调用方法的时候,如果是ACTION_DOWN时,要清除原有的触摸的事件。 ②对于cancelAndClearTouchTargets()方法,参数event不可能为null,因此重要的是for循环。然后调用d...原创 2018-09-14 17:57:00 · 1260 阅读 · 0 评论 -
handler机制
1.在线程的内部,可能 有多个handler对象,但是只能有一个MessageQueue对象,因此也只有一个Looper对象。在Looper类的静态方法prepare()中为线程创建MessageQueue()对象,里面会使用ThreadLocal类,该类就是提供“线程局部存储”。也就是在同一个线程中会得到相同的数据,但是在不同线程中读取就会有不同的数据。在ThreadLocal中存储的就是L...原创 2019-05-21 18:13:21 · 136 阅读 · 0 评论