<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[long8313002的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/long8313002</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; long8313002]]></copyright><item><title><![CDATA[Kotlin异步转同步]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/109164146</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/109164146</guid><author>long8313002</author><pubDate>Mon, 19 Oct 2020 16:56:54 +0800</pubDate><description><![CDATA[传统写法


  suspend fun requestLocation(context: Context) = withContext(Dispatchers.IO) {

        val lock = CountDownLatch(1)
        var mLocation: AMapLocation? = null

        val callBack = object : LocationManager.ILocationCallback {
            overri]]></description><category></category></item><item><title><![CDATA[Android开发Activity页面预加载]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/109046692</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/109046692</guid><author>long8313002</author><pubDate>Tue, 13 Oct 2020 11:12:20 +0800</pubDate><description><![CDATA[概述

    某些业务场景下，为了提高用户体验，我们可能需要在前一个页面就将下一个页面的数据准备好，减少用户后续操作的时间。因为Activity在设计上采用了低耦合，高度的隔离使得传统的预加载Activity方案不够优雅，现提供一种更加优雅的预加载方案，可以预先加载好布局和页面数据。



github：https://github.com/long8313002/PreloadingActivity



使用

   说明：因为库使用的是kotlin开发，需要在项目配置kotli...]]></description><category></category></item><item><title><![CDATA[Android高扩展高可用版本升级库]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108799854</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108799854</guid><author>long8313002</author><pubDate>Fri, 25 Sep 2020 17:19:06 +0800</pubDate><description><![CDATA[概述

    最近又需要做一个apk升级功能，这个功能基本上每新做一个app就需要重写一遍，为了方便后续的使用，现对升级功能进行封装。因为面向不是单一应用，所以需要保持高抽象、高扩展性，以适配所有的app。



配置



build.gradle


 implementation 'com.zhangzheng.versionupgrade:library:1.0.0'



AndroidMainfest.xml


 &lt;provider
            androi...]]></description><category></category></item><item><title><![CDATA[Android最优雅SharedPreferences封装（Kotlin版本）]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108772654</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108772654</guid><author>long8313002</author><pubDate>Thu, 24 Sep 2020 14:21:11 +0800</pubDate><description><![CDATA[概述

    SharedPreferences作为android开发中最常用的持久化存储方案，非常适合属性和配置的本地存储（另外也可以使用本地文件、数据库的方式实现持久化）。虽然SharedPreferences的使用较为方便，但是维护起来确非常的麻烦，我们很容易定义出冗余的配置，也可能会生成大量的配置文件，甚至我们没有足够的信心来确定，定义的属性是否被重复定义（会导致隐晦bug）。现基于Kotlin来进行面向对象API的封装（使用到的技术有：类扩展、动态代理、注解等）。



使用

...]]></description><category></category></item><item><title><![CDATA[Android使用Kotlin协程封装网络库]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108751307</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108751307</guid><author>long8313002</author><pubDate>Wed, 23 Sep 2020 14:24:32 +0800</pubDate><description><![CDATA[概述

    最近又要替换网络库成了，导致所有的业务代码都要替换且要重新测试回归。为了防止后续再遇到这样事情，降低替换核心库的成本，现利用协程对网络库进行封装。



理想API调用方式


     launch {
            val response = TestReq(q = "电脑").request&lt;TestResponse&gt;()
            Toast.makeText(this, response?.result?.toString()?:"...]]></description><category></category></item><item><title><![CDATA[android布局XML属性能力增强（圆角、虚线、边框等）]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108703057</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108703057</guid><author>long8313002</author><pubDate>Mon, 21 Sep 2020 10:28:49 +0800</pubDate><description><![CDATA[概述

     android开发中，我们常常使用xml来写布局文件，这种实现方式不仅简单，而且表达能力更强。但是google提供的布局属性有限，有些功能的实现我们不得不实用代码，或者自定义控件的方式来实现。那有没有一种方法，可以将属性增强来实现额外的功能呢？例如我们常常使用background 来表示和设置背景，那是不是可以使用layout_radius来表示和设置圆角呢？



使用示例

 需要在项目build.gradle中引用依赖


 implementation 'com.zh...]]></description><category></category></item><item><title><![CDATA[android富文本(SpannableString封装)]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108596142</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108596142</guid><author>long8313002</author><pubDate>Tue, 15 Sep 2020 11:17:42 +0800</pubDate><description><![CDATA[github地址：https://github.com/long8313002/EasyRichText





使用指南



项目build.gradle


implementation 'com.zhangzheng.easyrichtext:library:1.0.0'



布局xml文件





显示效果









支持属性


			分类
			
			
			属性名称
			
			
			说明
			
			
			示例
			
		
			基本属性
			
...]]></description><category></category></item><item><title><![CDATA[Activity启动速度极限优化]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108470737</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108470737</guid><author>long8313002</author><pubDate>Tue, 08 Sep 2020 16:01:35 +0800</pubDate><description><![CDATA[结论：加载时间从436ms--&gt;96ms(优化率78%)

github: https://github.com/long8313002/ActivityOptimization





概述

本文主要是为了和大家探讨，页面加载性能，主流优化方案外的其他技术方案。核心目的是极限减小页面启动速度，好处的话也是毋庸置疑的，可以极大增加用户体验。另外也是扩展思路，掌握更多知识点。







主流方案

   本文不会花太多篇幅讨论这些主流方案，另外这些方案在百度也很容易可以找到，不...]]></description><category></category></item><item><title><![CDATA[永不停歇的引擎-异常处理]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108422991</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108422991</guid><author>long8313002</author><pubDate>Sat, 05 Sep 2020 18:34:05 +0800</pubDate><description><![CDATA[最近发现了之前写的一篇博客，和这个类似，大家可以参考着看。事件太久了，我都忘记还有另外一个博客地址了。

https://blog.youkuaiyun.com/zhangzheng0602/article/details/69383926









开源地址：https://github.com/long8313002/CrashProtect

使用指南：

build.gradle


implementation "com.zhangzheng.crashProtect:crashprotect...]]></description><category></category></item><item><title><![CDATA[实用Gradle-监控包体积]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108408962</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108408962</guid><author>long8313002</author><pubDate>Fri, 04 Sep 2020 17:48:04 +0800</pubDate><description><![CDATA[概述

最新项目出现包体积上涨很多问题，但是确不知道是哪次提交导致的，为了避免这种后续再出现这种情况，利用gradle写了个包体积监控的任务。





流程









钉钉通知格式









实现


import org.apache.http.HttpResponse
import org.apache.http.HttpStatus
import org.apache.http.client.HttpClient
import org.apache.http.c...]]></description><category></category></item><item><title><![CDATA[实用Gradle-过滤权限]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108408923</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108408923</guid><author>long8313002</author><pubDate>Fri, 04 Sep 2020 17:46:14 +0800</pubDate><description><![CDATA[概述

   最近遇到一个问题，公司因为合规的要求需要将app申请的权限收紧，对于不必要的权限下架。但是项目中因为用到了很多第三方库，库里面有定义一大堆权限，所以没办法简单的删删减减来解决这个问题。





实现


println("---------------开始过滤无用权限申请-----------------")

def filterPermissions = []

//filterPermissions.add("android.permission.CAMERA")//...]]></description><category></category></item><item><title><![CDATA[实用Gradle-优雅依赖库]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108408365</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108408365</guid><author>long8313002</author><pubDate>Fri, 04 Sep 2020 17:22:35 +0800</pubDate><description><![CDATA[概述

gradle提高了android的工程化能力，它使得app的编译更加的灵活可控，今天我们主要来说说依赖三方库的那些事。







早期依赖

早期android项目都是单模块的，依赖关系在一起维护，所以不用考虑重复库导致的冲突问题。如下：









模块化依赖

随着工程越来越大，我们被迫将项目进行拆分，从之前的单模块的项目，升级成了多模块共同编译。随着模块化的进行，将会遇到不能模块依赖同一个库，一般为了保证依赖的版本一致，我们会在gradle.properties中定...]]></description><category></category></item><item><title><![CDATA[优雅的网络请求]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108406401</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108406401</guid><author>long8313002</author><pubDate>Fri, 04 Sep 2020 16:13:28 +0800</pubDate><description><![CDATA[概述

今天基于retrofit+kotlin来封装更优雅的网络的请求，retrofit本身就是对okhttp的一次表层封装，提供了更高的可扩展性。并且采用动态代理的方式，将真正的实现封装起来，对于用户而言只需要定义信息接口，而不必了解不需要的细节，总的来说降低的复杂度，提高了可读性、并且更加的灵活。







传统的retrofit

retrofit提供了同步和异步请求的方法，一般情况下我们会使用它提供的异步API，如果使用同步方法的话，我们需要自己维护线程切换，增加了使用成本。


...]]></description><category></category></item><item><title><![CDATA[优雅的Activity通信方式]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108402511</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108402511</guid><author>long8313002</author><pubDate>Fri, 04 Sep 2020 13:37:25 +0800</pubDate><description><![CDATA[概述

android对Activity的设计采用了严格的代码隔离，两个Activity之间不经过特殊的处理很难直接进行通信（保存静态变量），坏处呢，当然就是提高了交互成本，使得开发和阅读都会变得困难。好处的话是，代码边界有效的屏蔽了代码影响的扩散，保证了整个APP的稳定性。事实上，多进程启动Activity，也都是基于充分代码隔离的基础上，设计出来的。







传统交互方式









代码示例









说明



这种交互方式，有三个问题：



通过c...]]></description><category></category></item><item><title><![CDATA[浅谈开闭原则]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108391214</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108391214</guid><author>long8313002</author><pubDate>Thu, 03 Sep 2020 19:02:02 +0800</pubDate><description><![CDATA[概述

开闭原则是java 6大基本原则之一，而6大原则在软件开发中属于内功心法的存在，需要长期进行修炼，才能有所成就。今天就单独谈谈“开闭原则”，它的定义是：对扩展开放、对修改关闭。简单、直白的定义，确很难理解它到底想表达什么？







目的

想想如果软件只允许扩展，但是不允许修改会发生什么呢？旧的被测试过的代码，永远不会再次被改变，不改变意味着不会引入新的bug，不会产生影响，那系统将会一直保持稳定，只要测试保证新扩展的能力是稳定的。所以初步可以得出结论，开闭为了稳定。



如果...]]></description><category></category></item><item><title><![CDATA[谈谈Android热修复]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108389110</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108389110</guid><author>long8313002</author><pubDate>Thu, 03 Sep 2020 17:32:42 +0800</pubDate><description><![CDATA[概述

热修复成名已久，现在才开始谈确实有点晚了，不过没关系，这里给大家提供一个比较简单的思路。目的呢？算法帮助大家深入、或者复习“类加载”机制把，挺好玩的。







加载模型（双亲委派）





示意图









代理模式

android类加载采用的是双亲委派模式，就是会将请求先委托给父加载器进行处理，处理不了自己再处理。谈到委派，很容易想到“代理模式”，事实上对于ClassLoader而言，它与parent的关系确实是代理/委托关系，对被代理类进行访问控制（如果它...]]></description><category></category></item><item><title><![CDATA[android单元测试]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108381993</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108381993</guid><author>long8313002</author><pubDate>Thu, 03 Sep 2020 14:28:52 +0800</pubDate><description><![CDATA[不要被单元测试拖累！不要被单元测试拖累！！不要被单元测试拖累！！！





概述

   单元测试是针对系统最小单元（一般是函数、也可以是类或者模块）来进行正确性检测。我们使用单元测试的目的是优化代码质量、提高开发效率，不要一味的追求100%代码覆盖率，没有意义。







优先单元测试

    如果你写好了代码，再写单元测试，那一定是为了单元测试而单元测试，你一定感受不到它的好处了，或者你会说我有了单元测试，后期的重构或者改造我将更自信（我不只一次听到这种说法，单元测试验...]]></description><category></category></item><item><title><![CDATA[浅谈APP技术规划]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108367552</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108367552</guid><author>long8313002</author><pubDate>Wed, 02 Sep 2020 18:18:04 +0800</pubDate><description><![CDATA[设计目的



支撑前期APP快速的迭代，并且为后期重构创造条件
	提升代码的可复用性
	实现组件化、模块化开发
	树立代码规范，引导开发流程
	提升代码可维护性（灵活、扩展性高、可读）






设计原则



模块内高内聚
	模块间低耦合
	模块单一职责
	模块可独立运行
	模块可移植
	模块可插拔






组件聚合原则

复用/发布等同原则（为复用性而聚合）
	共同闭包原则（为可维护性而聚合）
	共同复用原则（未避免不必要发布而拆分）










组件...]]></description><category></category></item><item><title><![CDATA[模块化架构设计]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108367446</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108367446</guid><author>long8313002</author><pubDate>Wed, 02 Sep 2020 18:10:39 +0800</pubDate><description><![CDATA[前言

架构设计是一个不断演变的过程，当项目较小，或者项目刚刚起步的阶段，我们往往不需要关注架构设计，只有当软件膨胀到一定程度，我们才会针对当前业务，设计出适合当前阶段的架构。所以有的项目就会出现不断膨胀，不断重构的情况。那为什么不一开始就设计一个大而全的架构？我认为有以下几点：

1、架构是对当前业务进行的一层抽象，当业务不稳定，或者在高速迭代的过程中，我们没办法定义出稳定的抽象层。导致哪怕架构设计好，也会在业务迭代的过程中被破坏。

2、架构的过程事实上也是一个解耦的过程，而解耦越充分，相应的也会...]]></description><category></category></item><item><title><![CDATA[无痕埋点设计方案]]></title><link>https://blog.youkuaiyun.com/long8313002/article/details/108367424</link><guid>https://blog.youkuaiyun.com/long8313002/article/details/108367424</guid><author>long8313002</author><pubDate>Wed, 02 Sep 2020 18:08:21 +0800</pubDate><description><![CDATA[概述





我们做的是什么事情？

动态化自动埋点设计
	配置化远程可视化埋点方案设计




为什么做无痕埋点？

现有埋点方案占有大量开发资源
	现有埋点方案修改或者新增埋点需要重新发版
	现有埋点方案测试复杂，容易错误或者遗漏埋点




做好无痕无痕埋点可以解决什么问题？

简化研发埋点工作量
	实现可视化埋点
	实现不发版本，修改新增埋点






流程图











事件汇总

事件埋点，在软件开发中属于横切逻辑。需要通过面向切面的思维方式，将所有...]]></description><category></category></item></channel></rss>