- 博客(125)
- 资源 (30)
- 问答 (1)
- 收藏
- 关注

原创 Android studio 之 高级调试技巧,看这一篇够啦
Android Studio idea的调试技巧。包含临时断点 条件断点,依赖断点,接口断点,日志断点,Log设置,异常设置,多线程调试,异常调试,强制返回(在任意位置返回),返回上一步(已经修改的状态,不能恢复),查看或修改变量的值,让调试按照我们的方向走;还有多线程调试,按照我们的意愿的顺序来执行;还有强制抛出异常,远程调试等等各种调试技巧。让你掌握新项目时,游刃有余...............
2019-06-13 16:00:28
7711
3
原创 Android Kotlin协程之Channel的使用
Kotlin中,协程(Coroutine)的Channel通道提供了一种便捷的方法使单个值在多个协程(Coroutine)之间进行相互传输。通道提供了一种在流中传输值的方法。简单说就是Channel用于多个协程之间的通信,让协程(Coroutine)之间的协作更加的顺畅。
2023-03-27 20:11:59
1439
原创 Android Kotlin之协程-异步流Flow的使用
在Android使用Kotlin中,数据流Flow以协程(Coroutine)为基础构建,与仅返回单个值的挂起函数相反,数据流Flow可按顺序发出多个值。从概念上来讲,数据流Flow是可通过异步方式进行计算处理的一组数据序列。所发出值的类型必须相同。
2023-01-03 10:44:31
1483
1
原创 Android Kotlin之Coroutine(协程)详解
协程Coroutine是一种并发设计模式,您可以在 Android 平台上(Kotlin)使用它来简化异步执行的代码。在 Android Kotlin 上,协程Coroutine有助于管理长时间运行的任务,如果管理不当,这些任务可能会阻塞主线程并导致应用无响应。协程可以类似于RxJava那样,做到异步任务同步化,避免可能出现的回调地狱。同时,通过关键字来标识函数,称为挂起函数,该函数,只能在协程或其他的suspend函数中执行,从而保证主线程的安全。下面,我们先写个简单协程。协程多了2个状态。
2022-12-29 18:16:27
5854
原创 Kotlin标准库函数
Kotlin标准库中包含了几个函数let,apply,also,run,with,它们的目的就是可以在对象的上下文中执行代码块。当我们调用该Lambda表达式时,它会形成一个临时的作用域。在该范围内,可以访问不带名称的对象,此类函数称为作用域函数。下面开始介绍函数let,run,apply,also,with…
2022-12-12 13:18:56
692
原创 Android Jetpack之ViewModel的使用及源码分析
ViewModel 类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面,以及封装相关的业务逻辑。它的主要优点是,它可以缓存状态,并可在配置更改后持久保留相应状态。这意味着在 activity 之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。现在,常用的项目架构,在MVP向MVVM转变。相对于MVP中的P(presenter),MVVM中的ViewModel有哪些优势呢。ViewModel的优势我们先通过代码来看下ViewModel的使用。然后,看下ViewModel的原理。
2022-11-24 18:26:54
1006
原创 Android Jetpack之LiveData源码分析
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。如果观察者(由 Observer 类表示)的生命周期处于 STARTED 或 RESUMED 状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给活跃的观察者。
2022-11-24 10:21:06
2841
原创 Android Jetpack之Lifecycle的使用及源码分析
Android Jetpack系列,Lifecycle的使用及源码分析。Lifecycle生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您编写出更有条理且往往更精简的代码,此类代码更易于维护。本文的内容: 一、LifeCycle的使用1.1,在Activity中使用 1.2,在Application中使用 二、自定义LifecycleOwner 三、Lifecycle源码分析(知其然,知其所以然)
2022-11-22 17:58:18
1046
原创 Android Jetpack---LiveData简单使用
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。—官方解释LiveData 的部分特性如下:LiveData 可存储数据;LiveData 是一种可存储任何类型的数据的封装容器。
2022-10-24 15:18:52
1493
原创 MotionLayout详解-基础使用
MotionLayoutConstraitLayout子类。在2.0时代添加,只要是动画。涉及的东西有:MotionSceneTransitionOnSwipeOnClickKeyFrameSetConstraintSet位置res-xml,添加(例如,scene_youtube.xml)MotionScene 作为根目录Transition 作为动画控制点。一般里面会有2个ConstraintSet 。分别控制动画开始状态和结束状态Transitioncon
2022-10-24 15:13:05
1565
原创 个人开发者,APP一样可以有很精致的Icon图片
个人开发者,iconfont及svg的使用,不管是为了了解新技术也好,还是为了给自己找个副业增加创收。我们都会开发一个属于自己的APP(网站)。但是,作为个人开发者来说,在开发的过程中,相当一部分时间的时间,并不是在处理业务。而是,在寻找或处理适合自己项目的图片。现在的项目也不再仅仅使用png等图片做Icon了。下面,介绍几种轻松其他的生成icon的办法。让我们节省更多的时间,构思自己的项目。Svg可缩放的矢量图,可以设置任意大小,而不会使图片变得模糊。以Android为例,Android在5.0以...
2022-07-06 18:37:52
1618
1
原创 程序员教你玩转电脑&手机
电脑及手机技巧。微信双开、截图,命令,技巧,优化。查看最近打开的文件,把文件隐藏到图片,查看电脑配置,清除缓存,优化电脑等等
2021-12-09 20:25:59
3087
原创 Gradle 自定义Plugin插件之发送钉钉通知
在之前的文章中,我们介绍了怎么使用Gradle插件,apk加固,上传到蒲公英。这篇文章,主要就是把流程进一步完善,通过Gradle插件实现:打包—加固—上传蒲公英—发送钉钉消息,实现完全自动化.。之前的文章介绍:Gradle 自定义Plugin插件介绍Gradle 自定义Plugin插件之上传APK到蒲公英Gradle 自定义Plugin插件之360加固下面,我们看下发送钉钉通知的简单...
2020-01-03 12:59:33
2140
2
原创 Gradle 自定义Plugin插件之360加固
之前发布的文章:Gradle 自定义Plugin插件之上传APK到蒲公英。让我们知道了自定义插件的一些功能。一般来说,在发布的时候,我们的APK都需要加固的,毕竟安全点。这里,我们就结合之前的插件,再定义一个加固APK的任务。然后,让我们自动化的步伐可以更大一点。打包–→加固–→上传蒲公英。既然是,自动化的部署,我们肯定就不能用图形化的加固操作工具了。操作步骤:一、下面加固的包二、创建...
2020-01-02 11:56:45
2260
原创 Gradle 自定义Plugin插件之上传APK到蒲公英
在之前的文章:Gradle 自定义Plugin插件介绍 中,介绍了通过Gradle自定义插件的几种方式。作为一个的Coder,我们当然不希望我们自定义插件只是简单的打印log啦。比如,之前我们版本开发完成的时候,每次测试的流程都需要手动的打包,加固,上传,钉钉通知等等 。现在,我们就通过自定义插件来实现一个打包完成后,自动上传到蒲公英的插件。首先,在自定义这个插件的时候,我们需要弄明白几个问...
2020-01-01 17:59:44
3135
5
原创 Android Studio: 通过Artifactory搭建本地仓库优化编译速度
Android Studio 编译速度慢,一般来说,原因有下面几个。Gradle下载慢依赖库下载慢依赖库使用"+"(使用最新的),每次都需要去查找新的(尽量不适用这种方式)这里,大部分的库,我们可以通过阿里云代理仓库。但是,如果有我们自己的私有库或者插件的话。肯定不希望放到阿里云上了。这个时候,我们就需要建立,我们自己的本地仓库,让私有仓库,依赖阿里云的私有仓库。依赖关系,如下图...
2019-12-27 21:01:07
2292
1
原创 Gradle 自定义Plugin插件介绍
Android studio通过Gradle来构建我们的项目。一般情况下,我们只是使用Gradle来配置一些功能,比如,buildTypes,productFlavors等等。实际上,Gradle提供了很多有用的功能,可以让我们更加方便的管理我们的项目。这篇,我们介绍下Gradle的Plugin插件。官方介绍Gradle的plugin插件,有三种方式:一,Build script简单...
2019-12-25 19:52:29
6956
3
原创 Android 架构:使用枚举重新设计缓存目录的构建
首先声明,这篇文章不是讲getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()等等文件目录的存放位置,及使用方法的。本文章,主要是想说下通过枚举来管理缓存目录(就是上面那么目录),是否比我们常用的常量管理缓存目录更有优势。我们先看下Android下的缓存目录上面就是一般,我们需要用的一些缓存数据的目录,...
2019-12-17 23:57:40
919
原创 Android 架构:设计单例,使单例对象面向接口编程
我们都知道面向接口编程的优点:提高编程的灵活性模块解耦,降低维护成本。但是,对于平时我们使用的单例来说,我们是无法做到上面的事情的。如果,我们想让单例对象也做到这样的面向对象编程的话。我们就需要其他的地方来保证对象的唯一性,不能通过传统的方式,在对象内部保证对象的唯一性。普通单例设计新单例1,我们先创建一个反射工具类2,我们创建一个单例的工厂3,创建一个IUserManag...
2019-12-16 23:39:58
1022
原创 Android 自定义控件:加载长图View(局部加载)
当我们在需要加载大图,长图的时候。如果,我们把整张图片都加载进去的话,很可能会OOM。因为,我们的手机屏幕是有限的。所以,我们可以只加载显示的部分就可以了,这样就需要用到局部加载。需求分析:Rect。我们既然想要局部加载,肯定是需要一个Rect的绘制矩形的。GestureDetector。既然是局部加载,我们肯定是需要手势判定,然后滑动的。Scroller。 局部加载,肯定是可以让滑...
2019-12-01 00:53:43
1855
原创 Android ConstraintLayout 约束布局的使用介绍
相对定位Margins居中定位与偏移圆形定位尺寸约束链(Chains)虚拟辅助对象BarrierGroupGuidelinePlaceholder优化nonestandarddirectbarrierchaindimensions相对定位相对定位是在ConstraintLayout中创建布局的基本构建之一。这些约束可以让你将给定的widget相...
2019-11-13 16:01:29
3770
1
原创 Dart之基础知识学习
Flutter基础知识:Dart之方法方法的定义可选参数默认参数值方法对象匿名方法闭包Dart之类对象的基础特性类属性构造方法对象的操作Dart之类对象的高级特性类的继承抽象类接口Mixins操作符的覆写Flutter之方法1,方法的定义2,可选参数Flutter可选参数就是在调用方法的时候,有些参数是可传可不传的。它有两种方式。...
2019-11-03 17:49:07
887
2
原创 Android Jenkins自动化构建之参数化构建、多分支构建(二)
上篇,Android之Jenkins自动化打包流程及问题处理(一) 完成Jenkins最基本的自动化国建过程。但是,我们正式的项目往往需要配置很多的参数,设置等等。所以,最进本的打包,是无法满足我们的要求的。这篇文章,就说明下,自动化打包的其他配置,参数化构建,多分支构建等等。本文内容:参数化构建多分支构建定时构建一、参数化构建在新建的项目里,点击左侧配置进入配置页面,【G...
2019-10-25 23:05:11
2029
原创 Android之Jenkins自动化打包流程及问题处理(一)
问题Aapt2Exception AAPT2 error本地打包没有出现这个问题。只在Jenkins上才报了这个错误。解决办法:在相应的项目配置–构建–高级下面,勾选 Force GRADLE_USER_HOME to use workspace如下图...
2019-10-25 18:43:21
1193
原创 Android 性能优化之UI布局优化
前言Android系统每隔16ms发出VSYNC(Vertical Synchronization(垂直同步))信号,触发对UI进行渲染,也就是我们的应用必须在16ms内完成屏幕刷新的全部逻辑。为什么是16ms呢,这是因为一般来说人眼分辨的最大帧数是每秒60帧。一帧看做一张图片的话,可以算出1000/60 =16.6ms。这样才能达到每秒60帧,然而,这个每秒帧数的参数是由手机硬件所决定的,现...
2019-10-15 16:48:47
1070
原创 Android 性能优化之网络优化
网络优化,对APP来说,网络优化是很重要的一个优化手段。它直接影响用户体验。比如,手机都有APP的流量消耗排行,再或者用户进入后,一直在Loading。长时间的等待,让用户会认为你的APP反应慢,体验很差。下面,就聊下一般都有哪些网络优化的手段及 检查网络流量网络优化的手段1,网络连接的优化1.1 添加网络数据缓存访问的网络数据,我们可以添加网络缓存并配置缓存策略。比如,在无网络的情况下...
2019-10-14 18:59:33
1060
原创 源码分析:Android Okhttp源码浅析(二)
承接的Okhttp的框架分析。“源码分析:Android Okhttp源码浅析(一)”我们知道了,拦截器都是链式调用的。当有请求发送时,每个拦截器都会处理请求;然后,扔给下一个拦截器来处理,直到返回结果;然后,把结果,再一次的扔到上一个的拦截器来处理结果。最后把Response处理完成的Response返回。看下官方图下面,我们就看下每个拦截器的作用。我们自己的应用拦截器Ret...
2019-09-16 13:24:12
533
原创 Gradle:Android打包动态传参及多productFlavors配置
Android通过Gradle命名动态传参打包Android通过gradle的productFlavors多个维度切换项目环境Android通过Gradle命名动态传参打包 Android开发中,我们常常需要给测试,或者其他人提供APP的安装包。这些安装包跟生产包,多多少少会有差异。一些简单的,我们通过buildType可以满足我们的需求。但是,还有一些需求,往往每次打包的时候,就需要我...
2019-08-12 18:34:54
3341
原创 Android项目集成kotlin,导致项目无法运行(出现一个红叉)解决办法
问题:Error:Please select Android SDK近期,项目不太忙,打算引出google推了几年的Kotlin。毕竟,Kotlin是Google推荐的Android开发首选语言,也推了好几年了。然后,就手动加入各种配置,提交到了git上。结果,有的同学更新后,编译通过了,就是在项目运行哪里有个红叉,怎么也不能运行。Edit configuration 里面也提示 Error:...
2019-06-27 16:55:08
3706
原创 Android通过位运算对多状态进行操作
提到位运算,我们都知道是**按位与(&)、按位或(|)、按位异或(^)、取反(~)**。并且,我们也知道每个运算符的作用,并且位运算的效率是很高的。但是,你在项目中用到过的有多少呢?(当然,可读性跟提升的这点效率之间还需要平衡。)。笔者对位运算也仅仅是知道一点,这也导致了,在处理问题的时候,并不会把它考虑在内。在看Android源码的时候,发现源码里面有很多是通过位运算来解决问题的。比...
2019-05-21 14:09:27
1336
原创 源码分析:HashMap浅析
HashMap作为最基础的存放集合。在Java中不同于List存放单个元素,它是以key-value的形式来存放数据的,在项目中有着广泛的应用。我们一起来看看,它是怎么实现的呢。常用的Map操作有:Map<Object,Object> map = new HashMap();map.put(...);map.get();map.remove();......
2019-05-13 16:17:55
503
原创 源码分析:LinkedList浅析
LinkedList是一个基于双向链表实现的集合。上篇我们分析了ArrayList集合,现在,我们来分析下LinkedList又是怎么实现的,它跟ArrayList有哪些差别呢。先看下构造器 public LinkedList() { } public LinkedList(Collection<? extends E> c) { this();...
2019-05-13 16:05:26
474
原创 源码分析:ArrayList浅析
作为我们平时开发用的最多的一个基础的集合;并且面试时候,经常用它与LinkedList来比较异同。我们有必要了解下它内部的一些东西。它的内部并不复杂,我们就按照,我们的使用习惯来一个个的看。ArrayList<String> arrayList= new ArrayList();arrayList.add("xxx");arrayList.add("XX");arrayL...
2019-05-13 15:57:55
589
原创 源码分析:Activity加载并显示View的流程分析(二)
上一篇,源码分析:Activity加载并显示View的流程分析(一),分析了Activity的setContentView()方法是怎么一步步把xml的layoutId资源文件解析并放到DecorView里面的。这一篇,我们就分析下,这个DecorView的测量,绘制并显示出来的过程。之前分析Activity生命周期调用的时候(Activity的生命周期调用(二)),我们知道,会调用Activ...
2019-01-22 15:25:27
793
原创 源码分析:Activity加载并显示View的流程分析(一)
我们在用Activity的时候,一般都是在onCreate()方法中设置setContentView()方法。然后,进去Activity的话,页面就加载出来了。这里就分析下,他是怎么一步步的显示出来的。我们先分析下Activity::setContentView(layoutId)之后,都做了什么。Activity::setContentView(layoutId) public vo...
2019-01-22 15:15:38
1207
1
原创 源码分析:Activity生命周期调用顺序(二)
Activity生命周期调用顺序,接着上篇源码分析:Activity声明周期调用顺序(一)当进入一个Activity后,会执行attach()→onCreate()→onStart()→onRestoreInstanceState()→onPostCreate()→onResume()→onPostResume()等方法ActivityThread.H 的handleMessage()方法...
2019-01-15 10:47:05
1706
原创 源码分析:Activity生命周期调用顺序(一)
我们一般打开一个新的Activity,都会调用**startActivity(Intent)**。新的Activity的生命周期就开始被调用了。下面,我们就从**Activity.startActivity**开始,看下源码是怎么一步步的调用新启动的Activity的声明周期的。先放一个完整的时序图现在开始分析startActivity(Intent)public class A...
2019-01-15 10:02:03
2452
1
原创 源码分析:EventBus3.0.0源码解析
基本的使用//伪代码public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout...
2019-01-07 16:35:48
517
原创 Android开发的实用冷知识
Andoid 冷知识,版本兼容,手机兼容,各种的使用技巧,及总结。可以跟join相反,可以把字符串根据指定格式转换成数组。isEmpty(CharSequence)如果字符串为null或长度为0的话,就会返回true,不用,我们自己判断两个。equals(CharSequence,CharSequence)判断两个字符串是否相等length()如果字符串isEmpty的............
2018-08-07 17:14:14
2896
原创 Retrofit2 源码分析
Retrofit介绍Retrofit是Square公司的一个开源网络访问框架。主要是把网络请求的数据,通过接口来封装。内部通过OKHttpClient来请求。Retrofit的简单配置,使用 Retrofit retrofit = new Retrofit .Builder() .baseUrl(&amp;amp;amp;quot;https://ap...
2018-08-04 14:55:03
649
svg转换成Android 可用的vector
2022-07-02
android 增量升级 生成差分包工具及源码
2015-04-16
android support v4自带的侧滑
2014-07-02
viewholder模式的简介写法
2014-06-14
android fragment+viewpager(pagerTabStrip)多界面切换
2014-05-13
SwipeRefreshLayout(Google下拉刷新控件)
2014-05-07
greenDao简单demo
2014-05-06
android gridview问题
2013-11-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人