源码介绍 播放线程运行 首先从播放线程的拉起开始,这儿以PlaybackThread为例, 由于PlaybackThread是以智能指针形式存在的,因此在创建后,会调用onFirstRef,因此这整个流程从这个函数开始 - 1; part1 = mFrameCountP2 - rear; } else { front &= mFrameCountP2 = STOPPING_2 && mState != STOPPED && mState != PAUSED && mState ! int32_t flush = android_atomic_acquire_load(&cblk->u.mStreaming.mFlush); if (flush ! } } mFlushed += (newFront - front) & mask; } } 这时候就完成了AudioTrack主要流程的实现解读
34B66A6E-F3C7-4D02-A508-14F271CD3445.png A6A6A7B1-1CC9-4820-9F87-D513CA85F93C.png 48C9C055-75B4-4B0B-9D82-8F8A699AA1C1.png 449E97DB-A71E-4E1E-8915-7E9A6BFFE07D.png D397C456-AD94-42DB-8123-74FB3CF44FAB.png
二、源码解析 Looper源码解析 Android应用程序进程在启动的时候,会在线程中加载 /frameworks/base/core/java/android/app/ActivityThread.java 2.获得当前线程,这个线程主要用来判断Looper是不是属于当前线程。 myLooper方法,比较简单,直接从ThreadLocal取出。 next源码 Message next() { final long ptr = mPtr; ............... 在代码2中,如果拿到数据了,接下来就是考虑延迟处理消息还是直接处理消息。 2.生产消费设计模式: 生产者enqueueMessage往queue中入队消息,next往MessageQueue里拿消息是一个消费者。
1 //org.apache.ibatis.binding.MapperRegistry 2 public <T> T getMapper(Class<T> type, SqlSession sqlSession MapperProxy是一个重要的类,所以我们将其代码全部贴出: 1 //org.apache.ibatis.binding.MapperProxy 2 public class MapperProxy
一.Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;
---- Pre 接上文 Spring5源码 - 04 invokeBeanFactoryPostProcessors 源码解读_1 ---- 源码解读 总体流程 ? ---- 源码分析 /** * *调用bean工厂的后置处理器 * 1)BeanDefinitionRegistryPostProcessor(先被执行) * 所有的bean定义信息将要被加载到容器中 ,Bean实例还没有被初始化 * 2)BeanFactoryPostProcessor(后执行) * 所有的Bean定义信息已经加载到容器中,但是Bean实例还没有被初始化 bean定义前后进行处理 * BeanDefinitionRegistryPostProcessor是bean定义解析前调用 * 1)实现了PriorityOrdered接口的 * 2) ---- 那继续分段来解读Spring的设计思想 【初始化对应的集合 & 遍历用户自己手动添加的后置处理器】 ?
(最短栈、最长栈) private[spark] case class CallSite(shortForm: String, longForm: String) 源码中通过「getCallSite( )」 方法配置返回CallSite 参数示意: 参数英文名 参数含义 lastSparkMethod 方法存入 firstUserFile 类名存入 firstUserLine 行号存入 源码如下:
scheduling pool, job group, description, etc. from an ActiveJob associated // with this Stage //2.
端那么直接创建一个Ref RpcUtils.makeDriverRef(name, conf, rpcEnv) } } 创建BroadcastManager广播管理器 Spark2. metricsSystem, memoryManager, outputCommitCoordinator, conf) 总结 Spark Env 源码顺序大致就是上面的流程 ,更细致的后面的博文中会持续更新解读。
1.直接看下setContentVIew源码 activity.java public void setContentView(@LayoutRes int layoutResID) { getWindow ().setContentView(layoutResID);// initWindowDecorActionBar(); } 1.在activity.java源码中我们可以看到 mWindow = new PhoneWindow(this, window, activityConfigCallback);所以我们直接看PhoneWindow源码中的setContentView。 2.调用mLayoutInflater.inflate,把resId文件映射成各种view。 2.addViewInner 主要是把子view添加到childViews数组中。
前言 对于Android开发者来说,View无疑是开发中经常接触的,包括它的事件分发机制、测量、布局、绘制流程等,如果要自定义一个View,那么应该对以上流程有所了解、研究。 以下源码均取自Android API 21。 transitionTo(newScene); } else { mLayoutInflater.inflate(layoutResID, mContentParent); // 2 } } if (mContentParent == null) { mContentParent = generateLayout(mDecor); // 2 messages to start doing things try { root.setView(view, wparams, panelParentView); // 2
在上一篇文章中,我们分析了DAGScheduler的代码,重点了解了stage的创建和划分,是重中之重。这篇文章重点分析下task的创建:
上一篇文章中我们学习了RxJava2中 FlatMap 的原理,同时知道,FlatMap经过转换后发射的数据不是严格有序的,如果需要数据按顺序被发射,RxJava2提供了另外一个操作符, 也是这篇文章的主角 FlatMap vs ConcatMap 之前分析了FlatMap发射数据无序的原因,但是没有实际用代码验证过,这里我们在分析ConcatMap源码之前,我们先运行测试代码,有个直观的感受。 废话不多说,直接看ConcatMap源码。 ConcatMap 源码 嗯,先看方法定义,熟悉的味道 @CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) public final < 这样,整个流程就清楚了,不是很难,但是读了源码,用的时候,会更有自信。以上,水平有限,看官们开心-v-
源码分析 在上篇文章介绍 ContentResolver 时提到,外界(包括当前进程的其他组件)也无法直接访问 ContentProvider 的,而是需要通过ContentResolver来间接访问, 这一点我在 第 2 节 ConentProvider 的启动过程 会详细介绍 。 现在,我们先分析 ContentResolver#query(...) 的源码: 1.1 获取 IContentProvider 对象 源码中 ContentResolver#acquireProvider() 是抽象方法,具体实现在子类 ApplicationContentResolver 查询 todo ---- 2. 启动 ContentPrivider 的方法就是上面源码中的 installContentProviders(); 2、installContentProviders() 会初始化属于当前进程的 ContentProvider
这才去翻了翻源码,今天总结一下。 Android 消息机制主要涉及 4 个类: Message MessageQueue Handler Looper 我们依次结合源码分析一下。 ; m.obj = obj; return m; } Pasted from: http://book2s.com/java/src/package/android 这篇文章结合源码完整的看了一遍 Message MessageQueue Handler Looper,现在看着上面的图,可以自信地说我“熟悉 Android 消息机制”了哈哈。 Thanks 《Android 开发艺术探索》 http://book2s.com/java/src/package/android/os/handler.html#d0bdd75e69340e6c9e876ee32501beae http://book2s.com/java/src/package/android/os/looper.html http://book2s.com/java/src/package/android
在学习 React 源码的过程中,给我帮助最大的就是这个系列文章,于是决定基于这个系列文章谈一下自己的理解。本文会大量用到原文中的例子,想体会原汁原味的感觉,推荐阅读原文。 本系列文章基于 React 15.4.2 ,以下是本系列其它文章的传送门: React 源码深度解读(一):首次 DOM 元素渲染 - Part 1 React 源码深度解读(二):首次 DOM 元素渲染 - Part 2 React 源码深度解读(三):首次 DOM 元素渲染 - Part 3 React 源码深度解读(四):首次自定义组件渲染 - Part 1 React 源码深度解读(五):首次自定义组件渲染 - Part 2 React 源码深度解读(六):依赖注入 React 源码深度解读(七):事务 - Part 1 React 源码深度解读(八):事务 - Part 2 React 源码深度解读(九 ):单个元素更新 React 源码深度解读(十):Diff 算法详解 正文 上一篇文章介绍了 transaction 的基本概念和用法。
在上一篇文章中,我们分析了DAGScheduler的代码,重点了解了stage的创建和划分,是重中之重。这篇文章重点分析下task的创建:
(这个对我们实际工程中使用map有意义,知道代码被执行的线程是必须的) 废话不多说,进入源码 Map源码 Observable类是RxJava的门面,基本上所有的转换符都在这里定义,直接看Map 的方法定义 map 方法.png 可以看到,Function类,泛型有2个参数,第一个是原数据类型,第二个是转换后的数据类型,最终返回的是ObservableMap 类(RxJava的类命名很规范,如果是Observable 源码的实现还是很简单的,在我们了解了源码的实现后,思路会更清晰,写代码时也会更有把握。 现在我们来解答前面我们抛出的问题,Function在什么时候被调用?在哪个线程被调用? 问题先留在这里,进入源码 FlatMap 源码 FlatMap操作符涉及的代码会相对多一些,但是也是有规律可循。 dramloop.png Map 和 FlatMap 二个操作符的 源码就解析到这里,水平有限,有不对的,还望大佬不吝赐教。
throw new RuntimeException(e.toString()); } return on; } 就这样tomcat的JMX是注册成功的,但是既然分析源码 1. findDescriptor 方法根据bean找到对应描述文件,将实例加载到Registry类的registry句柄中去,然后再进行查找(后文描述),一般这种情况是找的到的 2. = ret ) { continue; } name=unCapitalize( name.substring(2));
对上面的几个对象有个基本概念之后,再来深究下代码,从一个最普通的urllib2.urlopen()开始,先来熟悉下第一个重点对象:build_opener这个函数。 大家最为熟悉的一段代码: res = urllib2.urlopen('http://python.org') 这端代码的作用就是打开http://python.org这个网站,返回一个response 当然这个opener也不是一次加载就再也不可变了,urllib2提供了install_opener这个方法,你可以在客户端调用build_opener然后用前面的那个install_opener来加载。 另外,最近一直在思考一个问题,如何把这些(我学到的东西,比如urllib2)东西能够更好的,更清晰易懂的让读者明白。 自己理解urllib2的源码不难,难的是以何种方式或者说何种组织结构来写能让人更容易懂。不知道各位有没有什么好的建议或者好的书籍推荐。