<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[verymrq的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/verymrq</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; verymrq]]></copyright><item><title><![CDATA[flutter-异步编程]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/101673063</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/101673063</guid><author>verymrq</author><pubDate>Sun, 29 Sep 2019 09:47:28 +0800</pubDate><description><![CDATA[首先看一张Flutter体系结构图：

我们只关注线程相关信息
1、Framework:我们直接接触的层级
2、engine：Dart Isolate Setup,创建Isolate，类似于DartVM中的线程，他的架构就是一个循环：event loops
但这一层并不创建及管理线程，它要求Embeder提供四个Task Runner，也就是和真正的线程类似的玩意，并不是真正的线程。
因为尽管Fl...]]></description><category></category></item><item><title><![CDATA[Android性能优化神器-AspectJ]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/101029126</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/101029126</guid><author>verymrq</author><pubDate>Thu, 19 Sep 2019 17:21:08 +0800</pubDate><description><![CDATA[一、AOP
AOP:面向切面编程(Aspect-Oriented Programming)。
如果说，OOP如果是把问题划分到单个模块的话，那么AOP就是把涉及到众多模块的某一类问题进行统一管理。
比如有三个模块：登陆、转账、大文件上传，现在需要加入性能检测功能，统计这三个模块每个方法耗时多少。

OOP思想做法是设计一个性能检测模块，提供接口供这三个模块调用。这样每个模块都要调用性能检测模块的接...]]></description><category></category></item><item><title><![CDATA[Android Jetpack--lifecycle全解析]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/89356843</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/89356843</guid><author>verymrq</author><pubDate>Wed, 17 Apr 2019 15:18:53 +0800</pubDate><description><![CDATA[1、概述
google的jetpack已经出来很久了，最近项目中用接入后，也是遇到了不少坑。于是抽时间好好研究了下lifecycle、livedata、viewModel等源码，本文就来介绍一下lifecycle的用法及原理。
2、设计初衷
先来一句官方解释：android.arch.lifecycle 包提供了可以用于构建生命周期感知（lifecycle-aware）组件的类和接口，这些组件可以...]]></description><category></category></item><item><title><![CDATA[Dagger2新版注解及源码解析]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/82152246</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/82152246</guid><author>verymrq</author><pubDate>Thu, 30 Aug 2018 10:38:35 +0800</pubDate><description><![CDATA[一、序

接：Dagger2.1不是Dagger2

demo地址：https://github.com/mrqatom/DaggerInjection

通过学习，我们知道了新版Dagger的用法，可是作为有追求的骚年，不能仅仅成为API的搬运工，必须要了解一下其中具体的用法以及实现方式。首先我们来看看几个注解的具体作用。

二、@Component.Builder

我们在AppCompone...]]></description><category></category></item><item><title><![CDATA[Dagger2.1不是Dagger2]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/81875025</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/81875025</guid><author>verymrq</author><pubDate>Tue, 21 Aug 2018 19:02:54 +0800</pubDate><description><![CDATA[一、前言

在学习android architecture components(简称acc)时下载了google官方demo，demo里有一部分是关于dagger+mvvm(mvp)+acc的，本以为阅读起来没有压力但结果却是一脸懵逼，是的，dagger的写法以及注解完全陌生。难道dagger更新了？本着落后就要挨打的原则去google了一番，发现国内资料通篇都是dagger原本的用法，并没有找...]]></description><category></category></item><item><title><![CDATA[支持资源文件替换的多渠道打包插件（四）]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/80564048</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/80564048</guid><author>verymrq</author><pubDate>Mon, 04 Jun 2018 14:23:32 +0800</pubDate><description><![CDATA[系列文章： 
从Android Plugin源码开始彻底理解gradle构建：初识AndroidDSL（一）

从Android Plugin源码开始彻底理解gradle构建：Extension（二）

从Android Plugin源码开始彻底理解gradle构建：Task（三）

一、写在前面

经过前面几篇文章的学习（什么？你还没看，赶紧去补补！），对gradle已经有了大致的了解了，当学习...]]></description><category></category></item><item><title><![CDATA[从Android Plugin源码开始彻底理解gradle构建：Task（三）]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/80482895</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/80482895</guid><author>verymrq</author><pubDate>Fri, 01 Jun 2018 16:48:55 +0800</pubDate><description><![CDATA[系列文章： 

从Android Plugin源码开始彻底理解gradle构建：初识AndroidDSL（一）

从Android Plugin源码开始彻底理解gradle构建：Extension（二）



一、前言回顾

首先我们依然回顾一下basePlugin里的三个回调：




            //plugin的基础设置、初始化工作
            threadRecor...]]></description><category></category></item><item><title><![CDATA[从Android Plugin源码开始彻底理解gradle构建：Extension（二）]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/80426594</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/80426594</guid><author>verymrq</author><pubDate>Wed, 23 May 2018 23:35:51 +0800</pubDate><description><![CDATA[系列文章： 从Android Plugin源码开始彻底理解gradle构建：初识AndroidDSL（一）一、前言回顾        上回我们说到Android plugin的所有自定义plugin都需要重写的apply方法，并讲到该方法里最为重要的三个回调方法，我们回顾一下：            threadRecorder.record(  
                    Exec...]]></description><category></category></item><item><title><![CDATA[从Android Plugin源码开始彻底理解gradle构建：初识AndroidDSL（一）]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/80358111</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/80358111</guid><author>verymrq</author><pubDate>Mon, 21 May 2018 16:31:54 +0800</pubDate><description><![CDATA[一、写在前面        本系列适合人员：对gradle基础有一定了解。        由于gradle已经出来很久了，相关配置文章也比较多，所以就从头开始说了，这里推荐几篇文章：        https://www.jianshu.com/p/8b8a550246bd        刚哥（任玉刚）亲笔：https://blog.youkuaiyun.com/singwhatiwanna/article/...]]></description><category></category></item><item><title><![CDATA[【Rxjava2源码系列】线程调度（二）]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/80097387</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/80097387</guid><author>verymrq</author><pubDate>Fri, 27 Apr 2018 15:40:46 +0800</pubDate><description><![CDATA[一、前言

上一篇文章：【Rxjava2源码系列】基本订阅、消耗事件流程（一） 
已经弄清楚了Rxjava的整体流程，本文就来看看Rxjava强大的线程转换能力。

相信大家最常用到Rxjava的地方就是利用Retrofit做网络请求了吧？不仅如此，只要有耗时操作，都可以考虑利用Rxjava来实现，就是这么任性。本文要研究的包括 
1、线程调度如何实现？

2、subscribeOn、observ...]]></description><category></category></item><item><title><![CDATA[【Rxjava2源码系列】基本订阅、消耗事件流程（一）]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/80097163</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/80097163</guid><author>verymrq</author><pubDate>Thu, 26 Apr 2018 17:39:11 +0800</pubDate><description><![CDATA[一、前言

Rx系列已经出来很久了，笔者也在很早就把他加入项目里使用了，具体使用方法相信大家都很熟悉了，这里就不多讲了。可是虽然用了很久，一旦过一段时间不接触就会生疏，用的时候也比较忐忑，生怕哪里会出问题。所以下决心研究一下他的源码，所谓知己知彼百战不殆。

这里就不列出使用方法了，网上资料已经很多了，也可以去官网上看。我觉得RX最核心的就是：异步以及他的操作符。本文先了解一下他的基本流程，他究竟...]]></description><category></category></item><item><title><![CDATA[【Android源码系列】界面的呈现-WindowManagerService]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/79859760</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/79859760</guid><author>verymrq</author><pubDate>Tue, 10 Apr 2018 08:16:39 +0800</pubDate><description><![CDATA[一、前言

作为Android开发，我们都知道界面就是Activity，通过实现Activity然后控制其生命周期就能将界面展现给用户。那Activity究竟是如何将界面展示出来的呢？或者说展示界面一定需要Activity吗？这就需要知道今天要说到的WindowManagerService（WMS）了。



二、简单认识

一般情况，我们需要写一个View，都会在activity的XML布局里添...]]></description><category></category></item><item><title><![CDATA[【Android源码系列】如何解析APK-PackageManagerService]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/78968935</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/78968935</guid><author>verymrq</author><pubDate>Thu, 04 Jan 2018 11:18:01 +0800</pubDate><description><![CDATA[一、惯例BB新的一年又到了，2018也要加油啊~距离写上一篇文章也有一个月了，今天我们就来看看PackageManagerService（以下简称PMS）。 
PMS和AMS、WMS一样，也是一个系统服务，他的主要作用就是解析APK信息，并保存下来。我们平时写在Manifest里的信息是如何被解析的呢？没错都是他干的。还记得我在前面一篇文章《 VirtualAPK插件化方案原理探索》里留下了一个坑：]]></description><category></category></item><item><title><![CDATA[【Android源码系列】消息机制:Handler源码解析]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/78681901</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/78681901</guid><author>verymrq</author><pubDate>Fri, 01 Dec 2017 16:24:37 +0800</pubDate><description><![CDATA[前言这篇文章本来应该前几天就出炉的，不过笔者当时正看得起劲，头忽然昏的不行，心想难道是撸多了？咳咳..最后脑供血不足去医院检查了一下，做了脑部CT发现很健康，这就奇怪了。后来想想应该是当时门窗都关的太严实了，刚好外面装修的甲醛充满了房间..所以各位在学习的同时一定要锻炼身体啊（好像也没啥因果关系- -），不然什么都是浮云了…. 
进入正题，之前我们研究四大组件源码时，有一个H类大家印象一定很深刻（滑]]></description><category></category></item><item><title><![CDATA[VirtualAPK插件化方案原理探索]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/78573137</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/78573137</guid><author>verymrq</author><pubDate>Tue, 21 Nov 2017 19:02:47 +0800</pubDate><description><![CDATA[一、前言最近刚好在看任玉刚的《安卓开发艺术探索》，学到了不少东西。前面刚写完四大组件的原理分析，算是对Android组件进一步了解。趁热打铁，了解一下滴滴出品的VirtualAPK插件化方案，同样是刚哥参与的，站在巨人的肩膀来看看。 
插件化、热更新在国内近段时间相当火热，我们也得跟上啊。学习插件化不仅仅只有”插件化”这么简单而已，涉及到相当多的知识，对我们提升还是有一定帮助的。之前也看过鸿洋的文章]]></description><category></category></item><item><title><![CDATA[【Android源码系列】ContentProvider启动源码解析]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/78540960</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/78540960</guid><author>verymrq</author><pubDate>Wed, 15 Nov 2017 15:04:02 +0800</pubDate><description><![CDATA[一、前言终于到了ContentProvider，四大组件的尾声了。一般情况（至少我是这样），用到ContentProvider的机会不多，他是Android专门用来跨进程通信使用的，底层也是binder实现。怎么实现的呢？往下看吧。 
一般我们使用的场景是这样的：        Uri  uri = Uri.parse("com.ooo.xxx");
        getContentResolv]]></description><category></category></item><item><title><![CDATA[【Android源码系列】BroadcastReceiver启动源码解析]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/78518777</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/78518777</guid><author>verymrq</author><pubDate>Mon, 13 Nov 2017 11:45:08 +0800</pubDate><description><![CDATA[一、先BB两句Android四大组件源码已经分析完Activity和Service，已经攻克一半，现在读起源码越来越得心应手。 
阅读本篇文章前建议先阅读我的前两篇博文： 
【Android源码系列】Activity启动源码解析 
【Android源码系列】Service启动源码解析 
今天我们来看看BroadcastReceiver（广播）的源码逻辑，此前说过的流程在这里可能会简化（懒）。其实他们]]></description><category></category></item><item><title><![CDATA[【Android源码系列】Service启动源码解析]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/78488297</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/78488297</guid><author>verymrq</author><pubDate>Thu, 09 Nov 2017 12:43:07 +0800</pubDate><description><![CDATA[一、写在前面上次说了Activity启动，我们接着来看Service。同为四大组件，两者的启动方式相差不多，有了上次的经验，分析起来得心应手。但是我们知道Service有两种方式：start&bind。Intent intent = new Intent(MainActivity.this, StartService.class);
                startService(inte]]></description><category></category></item><item><title><![CDATA[【Android源码系列】Activity启动源码解析]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/78470104</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/78470104</guid><author>verymrq</author><pubDate>Tue, 07 Nov 2017 17:20:24 +0800</pubDate><description><![CDATA[一、前言最近看《Android开发艺术探索》大多涉及到源码解析，仅仅看书有点云里雾里，于是配合着源码一起看感觉清晰许多。网上很多推荐source insight看源码，下来之后体验感觉一般，还不如AS直接看。老罗有专门的源码查看教学，但是需要Linux(Ubuntu)/MAC机器，暂时没条件以后考虑（老罗讲的比较深入，值得长期跟）。总之还是在AS里看（求推荐），强烈推荐浏览本文时和着源码。二、源码解]]></description><category></category></item><item><title><![CDATA[真-ViewPager与ScrollView间的ViewPager消失及滑动冲突关系]]></title><link>https://blog.youkuaiyun.com/verymrq/article/details/76165161</link><guid>https://blog.youkuaiyun.com/verymrq/article/details/76165161</guid><author>verymrq</author><pubDate>Wed, 26 Jul 2017 20:31:39 +0800</pubDate><description><![CDATA[前话今天公司项目遇到了ViewPager+ScrollView的布局方式，水平滑动+垂直滑动，可想而知可能会产生冲突。作为老司机，自信满满的准备好了解决冲突的方案，开撸。 
写好运行一波后发现，尼玛啊，ViewPager不见了，说实话以前还真没有写过这种嵌套。没办法，试试将ViewPager固定一下高度呢，看看它存不存在。还真在，这下能看见了。可是不科学啊，我怎么知道页面数据有多少呢，固定值肯定行不]]></description><category></category></item></channel></rss>