自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

蜗牛快跑

you still have lots more to work on.

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

原创 Android studio 之 高级调试技巧,看这一篇够啦

Android Studio idea的调试技巧。包含临时断点 条件断点,依赖断点,接口断点,日志断点,Log设置,异常设置,多线程调试,异常调试,强制返回(在任意位置返回),返回上一步(已经修改的状态,不能恢复),查看或修改变量的值,让调试按照我们的方向走;还有多线程调试,按照我们的意愿的顺序来执行;还有强制抛出异常,远程调试等等各种调试技巧。让你掌握新项目时,游刃有余...............

2019-06-13 16:00:28 5391 2

原创 Android Kotlin协程之Channel的使用

Kotlin中,协程(Coroutine)的Channel通道提供了一种便捷的方法使单个值在多个协程(Coroutine)之间进行相互传输。通道提供了一种在流中传输值的方法。简单说就是Channel用于多个协程之间的通信,让协程(Coroutine)之间的协作更加的顺畅。

2023-03-27 20:11:59 997 1

原创 Android Kotlin之协程-异步流Flow的使用

在Android使用Kotlin中,数据流Flow以协程(Coroutine)为基础构建,与仅返回单个值的挂起函数相反,数据流Flow可按顺序发出多个值。从概念上来讲,数据流Flow是可通过异步方式进行计算处理的一组数据序列。所发出值的类型必须相同。

2023-01-03 10:44:31 989

原创 Android Kotlin之Coroutine(协程)详解

协程Coroutine是一种并发设计模式,您可以在 Android 平台上(Kotlin)使用它来简化异步执行的代码。在 Android Kotlin 上,协程Coroutine有助于管理长时间运行的任务,如果管理不当,这些任务可能会阻塞主线程并导致应用无响应。协程可以类似于RxJava那样,做到异步任务同步化,避免可能出现的回调地狱。同时,通过关键字来标识函数,称为挂起函数,该函数,只能在协程或其他的suspend函数中执行,从而保证主线程的安全。下面,我们先写个简单协程。协程多了2个状态。

2022-12-29 18:16:27 4793

原创 Kotlin标准库函数

Kotlin标准库中包含了几个函数let,apply,also,run,with,它们的目的就是可以在对象的上下文中执行代码块。当我们调用该Lambda表达式时,它会形成一个临时的作用域。在该范围内,可以访问不带名称的对象,此类函数称为作用域函数。下面开始介绍函数let,run,apply,also,with…

2022-12-12 13:18:56 594

原创 Android Jetpack之ViewModel的使用及源码分析

ViewModel 类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面,以及封装相关的业务逻辑。它的主要优点是,它可以缓存状态,并可在配置更改后持久保留相应状态。这意味着在 activity 之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。现在,常用的项目架构,在MVP向MVVM转变。相对于MVP中的P(presenter),MVVM中的ViewModel有哪些优势呢。ViewModel的优势我们先通过代码来看下ViewModel的使用。然后,看下ViewModel的原理。

2022-11-24 18:26:54 889

原创 Android Jetpack之LiveData源码分析

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。如果观察者(由 Observer 类表示)的生命周期处于 STARTED 或 RESUMED 状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给活跃的观察者。

2022-11-24 10:21:06 2728

原创 Android Jetpack之Lifecycle的使用及源码分析

Android Jetpack系列,Lifecycle的使用及源码分析。Lifecycle生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您编写出更有条理且往往更精简的代码,此类代码更易于维护。本文的内容: 一、LifeCycle的使用1.1,在Activity中使用 1.2,在Application中使用 二、自定义LifecycleOwner 三、Lifecycle源码分析(知其然,知其所以然)

2022-11-22 17:58:18 869

原创 Android Jetpack---LiveData简单使用

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。—官方解释LiveData 的部分特性如下:LiveData 可存储数据;LiveData 是一种可存储任何类型的数据的封装容器。

2022-10-24 15:18:52 1372

原创 MotionLayout详解-基础使用

MotionLayoutConstraitLayout子类。在2.0时代添加,只要是动画。涉及的东西有:MotionSceneTransitionOnSwipeOnClickKeyFrameSetConstraintSet位置res-xml,添加(例如,scene_youtube.xml)MotionScene 作为根目录Transition 作为动画控制点。一般里面会有2个ConstraintSet 。分别控制动画开始状态和结束状态Transitioncon

2022-10-24 15:13:05 1437

原创 个人开发者,APP一样可以有很精致的Icon图片

个人开发者,iconfont及svg的使用,不管是为了了解新技术也好,还是为了给自己找个副业增加创收。我们都会开发一个属于自己的APP(网站)。但是,作为个人开发者来说,在开发的过程中,相当一部分时间的时间,并不是在处理业务。而是,在寻找或处理适合自己项目的图片。现在的项目也不再仅仅使用png等图片做Icon了。下面,介绍几种轻松其他的生成icon的办法。让我们节省更多的时间,构思自己的项目。Svg可缩放的矢量图,可以设置任意大小,而不会使图片变得模糊。以Android为例,Android在5.0以...

2022-07-06 18:37:52 1393 1

原创 程序员教你玩转电脑&手机

电脑及手机技巧。微信双开、截图,命令,技巧,优化。查看最近打开的文件,把文件隐藏到图片,查看电脑配置,清除缓存,优化电脑等等

2021-12-09 20:25:59 2953

原创 Gradle 自定义Plugin插件之发送钉钉通知

在之前的文章中,我们介绍了怎么使用Gradle插件,apk加固,上传到蒲公英。这篇文章,主要就是把流程进一步完善,通过Gradle插件实现:打包—加固—上传蒲公英—发送钉钉消息,实现完全自动化.。之前的文章介绍:Gradle 自定义Plugin插件介绍Gradle 自定义Plugin插件之上传APK到蒲公英Gradle 自定义Plugin插件之360加固下面,我们看下发送钉钉通知的简单...

2020-01-03 12:59:33 1977 2

原创 Gradle 自定义Plugin插件之360加固

之前发布的文章:Gradle 自定义Plugin插件之上传APK到蒲公英。让我们知道了自定义插件的一些功能。一般来说,在发布的时候,我们的APK都需要加固的,毕竟安全点。这里,我们就结合之前的插件,再定义一个加固APK的任务。然后,让我们自动化的步伐可以更大一点。打包–→加固–→上传蒲公英。既然是,自动化的部署,我们肯定就不能用图形化的加固操作工具了。操作步骤:一、下面加固的包二、创建...

2020-01-02 11:56:45 2056

原创 Gradle 自定义Plugin插件之上传APK到蒲公英

在之前的文章:Gradle 自定义Plugin插件介绍 中,介绍了通过Gradle自定义插件的几种方式。作为一个的Coder,我们当然不希望我们自定义插件只是简单的打印log啦。比如,之前我们版本开发完成的时候,每次测试的流程都需要手动的打包,加固,上传,钉钉通知等等 。现在,我们就通过自定义插件来实现一个打包完成后,自动上传到蒲公英的插件。首先,在自定义这个插件的时候,我们需要弄明白几个问...

2020-01-01 17:59:44 2813 5

原创 Android Studio: 通过Artifactory搭建本地仓库优化编译速度

Android Studio 编译速度慢,一般来说,原因有下面几个。Gradle下载慢依赖库下载慢依赖库使用"+"(使用最新的),每次都需要去查找新的(尽量不适用这种方式)这里,大部分的库,我们可以通过阿里云代理仓库。但是,如果有我们自己的私有库或者插件的话。肯定不希望放到阿里云上了。这个时候,我们就需要建立,我们自己的本地仓库,让私有仓库,依赖阿里云的私有仓库。依赖关系,如下图...

2019-12-27 21:01:07 2021 1

原创 Gradle 自定义Plugin插件介绍

Android studio通过Gradle来构建我们的项目。一般情况下,我们只是使用Gradle来配置一些功能,比如,buildTypes,productFlavors等等。实际上,Gradle提供了很多有用的功能,可以让我们更加方便的管理我们的项目。这篇,我们介绍下Gradle的Plugin插件。官方介绍Gradle的plugin插件,有三种方式:一,Build script简单...

2019-12-25 19:52:29 6382 3

原创 Android 架构:使用枚举重新设计缓存目录的构建

首先声明,这篇文章不是讲getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()等等文件目录的存放位置,及使用方法的。本文章,主要是想说下通过枚举来管理缓存目录(就是上面那么目录),是否比我们常用的常量管理缓存目录更有优势。我们先看下Android下的缓存目录上面就是一般,我们需要用的一些缓存数据的目录,...

2019-12-17 23:57:40 742

原创 Android 架构:设计单例,使单例对象面向接口编程

我们都知道面向接口编程的优点:提高编程的灵活性模块解耦,降低维护成本。但是,对于平时我们使用的单例来说,我们是无法做到上面的事情的。如果,我们想让单例对象也做到这样的面向对象编程的话。我们就需要其他的地方来保证对象的唯一性,不能通过传统的方式,在对象内部保证对象的唯一性。普通单例设计新单例1,我们先创建一个反射工具类2,我们创建一个单例的工厂3,创建一个IUserManag...

2019-12-16 23:39:58 925

原创 Android 自定义控件:加载长图View(局部加载)

当我们在需要加载大图,长图的时候。如果,我们把整张图片都加载进去的话,很可能会OOM。因为,我们的手机屏幕是有限的。所以,我们可以只加载显示的部分就可以了,这样就需要用到局部加载。需求分析:Rect。我们既然想要局部加载,肯定是需要一个Rect的绘制矩形的。GestureDetector。既然是局部加载,我们肯定是需要手势判定,然后滑动的。Scroller。 局部加载,肯定是可以让滑...

2019-12-01 00:53:43 1529

原创 Android ConstraintLayout 约束布局的使用介绍

相对定位Margins居中定位与偏移圆形定位尺寸约束链(Chains)虚拟辅助对象BarrierGroupGuidelinePlaceholder优化nonestandarddirectbarrierchaindimensions相对定位相对定位是在ConstraintLayout中创建布局的基本构建之一。这些约束可以让你将给定的widget相...

2019-11-13 16:01:29 3321 1

原创 Dart之基础知识学习

Flutter基础知识:Dart之方法方法的定义可选参数默认参数值方法对象匿名方法闭包Dart之类对象的基础特性类属性构造方法对象的操作Dart之类对象的高级特性类的继承抽象类接口Mixins操作符的覆写Flutter之方法1,方法的定义2,可选参数Flutter可选参数就是在调用方法的时候,有些参数是可传可不传的。它有两种方式。...

2019-11-03 17:49:07 817 2

原创 Android Jenkins自动化构建之参数化构建、多分支构建(二)

上篇,Android之Jenkins自动化打包流程及问题处理(一) 完成Jenkins最基本的自动化国建过程。但是,我们正式的项目往往需要配置很多的参数,设置等等。所以,最进本的打包,是无法满足我们的要求的。这篇文章,就说明下,自动化打包的其他配置,参数化构建,多分支构建等等。本文内容:参数化构建多分支构建定时构建一、参数化构建在新建的项目里,点击左侧配置进入配置页面,【G...

2019-10-25 23:05:11 1815

原创 Android之Jenkins自动化打包流程及问题处理(一)

问题Aapt2Exception AAPT2 error本地打包没有出现这个问题。只在Jenkins上才报了这个错误。解决办法:在相应的项目配置–构建–高级下面,勾选 Force GRADLE_USER_HOME to use workspace如下图...

2019-10-25 18:43:21 1062

原创 Android 性能优化之UI布局优化

前言Android系统每隔16ms发出VSYNC(Vertical Synchronization(垂直同步))信号,触发对UI进行渲染,也就是我们的应用必须在16ms内完成屏幕刷新的全部逻辑。为什么是16ms呢,这是因为一般来说人眼分辨的最大帧数是每秒60帧。一帧看做一张图片的话,可以算出1000/60 =16.6ms。这样才能达到每秒60帧,然而,这个每秒帧数的参数是由手机硬件所决定的,现...

2019-10-15 16:48:47 948

原创 Android 性能优化之网络优化

网络优化,对APP来说,网络优化是很重要的一个优化手段。它直接影响用户体验。比如,手机都有APP的流量消耗排行,再或者用户进入后,一直在Loading。长时间的等待,让用户会认为你的APP反应慢,体验很差。下面,就聊下一般都有哪些网络优化的手段及 检查网络流量网络优化的手段1,网络连接的优化1.1 添加网络数据缓存访问的网络数据,我们可以添加网络缓存并配置缓存策略。比如,在无网络的情况下...

2019-10-14 18:59:33 928

原创 源码分析:Android Okhttp源码浅析(二)

承接的Okhttp的框架分析。“源码分析:Android Okhttp源码浅析(一)”我们知道了,拦截器都是链式调用的。当有请求发送时,每个拦截器都会处理请求;然后,扔给下一个拦截器来处理,直到返回结果;然后,把结果,再一次的扔到上一个的拦截器来处理结果。最后把Response处理完成的Response返回。看下官方图下面,我们就看下每个拦截器的作用。我们自己的应用拦截器Ret...

2019-09-16 13:24:12 473

原创 Gradle:Android打包动态传参及多productFlavors配置

Android通过Gradle命名动态传参打包Android通过gradle的productFlavors多个维度切换项目环境Android通过Gradle命名动态传参打包 Android开发中,我们常常需要给测试,或者其他人提供APP的安装包。这些安装包跟生产包,多多少少会有差异。一些简单的,我们通过buildType可以满足我们的需求。但是,还有一些需求,往往每次打包的时候,就需要我...

2019-08-12 18:34:54 3011

原创 Android项目集成kotlin,导致项目无法运行(出现一个红叉)解决办法

问题:Error:Please select Android SDK近期,项目不太忙,打算引出google推了几年的Kotlin。毕竟,Kotlin是Google推荐的Android开发首选语言,也推了好几年了。然后,就手动加入各种配置,提交到了git上。结果,有的同学更新后,编译通过了,就是在项目运行哪里有个红叉,怎么也不能运行。Edit configuration 里面也提示 Error:...

2019-06-27 16:55:08 3567

原创 Android通过位运算对多状态进行操作

提到位运算,我们都知道是**按位与(&)、按位或(|)、按位异或(^)、取反(~)**。并且,我们也知道每个运算符的作用,并且位运算的效率是很高的。但是,你在项目中用到过的有多少呢?(当然,可读性跟提升的这点效率之间还需要平衡。)。笔者对位运算也仅仅是知道一点,这也导致了,在处理问题的时候,并不会把它考虑在内。在看Android源码的时候,发现源码里面有很多是通过位运算来解决问题的。比...

2019-05-21 14:09:27 1209

原创 源码分析: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 455

原创 源码分析:LinkedList浅析

LinkedList是一个基于双向链表实现的集合。上篇我们分析了ArrayList集合,现在,我们来分析下LinkedList又是怎么实现的,它跟ArrayList有哪些差别呢。先看下构造器 public LinkedList() { } public LinkedList(Collection<? extends E> c) { this();...

2019-05-13 16:05:26 433

原创 源码分析:ArrayList浅析

作为我们平时开发用的最多的一个基础的集合;并且面试时候,经常用它与LinkedList来比较异同。我们有必要了解下它内部的一些东西。它的内部并不复杂,我们就按照,我们的使用习惯来一个个的看。ArrayList<String> arrayList= new ArrayList();arrayList.add("xxx");arrayList.add("XX");arrayL...

2019-05-13 15:57:55 526

原创 源码分析:Activity加载并显示View的流程分析(二)

上一篇,源码分析:Activity加载并显示View的流程分析(一),分析了Activity的setContentView()方法是怎么一步步把xml的layoutId资源文件解析并放到DecorView里面的。这一篇,我们就分析下,这个DecorView的测量,绘制并显示出来的过程。之前分析Activity生命周期调用的时候(Activity的生命周期调用(二)),我们知道,会调用Activ...

2019-01-22 15:25:27 708

原创 源码分析:Activity加载并显示View的流程分析(一)

我们在用Activity的时候,一般都是在onCreate()方法中设置setContentView()方法。然后,进去Activity的话,页面就加载出来了。这里就分析下,他是怎么一步步的显示出来的。我们先分析下Activity::setContentView(layoutId)之后,都做了什么。Activity::setContentView(layoutId) public vo...

2019-01-22 15:15:38 1104 1

原创 源码分析:Activity生命周期调用顺序(二)

Activity生命周期调用顺序,接着上篇源码分析:Activity声明周期调用顺序(一)当进入一个Activity后,会执行attach()→onCreate()→onStart()→onRestoreInstanceState()→onPostCreate()→onResume()→onPostResume()等方法ActivityThread.H 的handleMessage()方法...

2019-01-15 10:47:05 1510

原创 源码分析:Activity生命周期调用顺序(一)

我们一般打开一个新的Activity,都会调用**startActivity(Intent)**。新的Activity的生命周期就开始被调用了。下面,我们就从**Activity.startActivity**开始,看下源码是怎么一步步的调用新启动的Activity的声明周期的。先放一个完整的时序图现在开始分析startActivity(Intent)public class A...

2019-01-15 10:02:03 2259 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 471

原创 Android开发的实用冷知识

Andoid 冷知识,版本兼容,手机兼容,各种的使用技巧,及总结。可以跟join相反,可以把字符串根据指定格式转换成数组。isEmpty(CharSequence)如果字符串为null或长度为0的话,就会返回true,不用,我们自己判断两个。equals(CharSequence,CharSequence)判断两个字符串是否相等length()如果字符串isEmpty的............

2018-08-07 17:14:14 2643

原创 Retrofit2 源码分析

Retrofit介绍Retrofit是Square公司的一个开源网络访问框架。主要是把网络请求的数据,通过接口来封装。内部通过OKHttpClient来请求。Retrofit的简单配置,使用 Retrofit retrofit = new Retrofit .Builder() .baseUrl(&amp;amp;amp;amp;quot;https://ap...

2018-08-04 14:55:03 602

svg转换成Android 可用的vector

svg转换成Android 可用的vector。 下载,解压后,直接打开index.html。 把下载的svg文件拖动到框里即可。

2022-07-02

android listview带有editText

android listview带有editText的情况,解决editText的焦点问题,及数据错位问题。后2个包没用。

2016-02-24

android 6.0 指纹识别 finger (eclipse版)

android 6.0,指纹识别功能(eclipse版),官方例子,去掉了dagger。

2016-01-28

andorid Lollipop(5.0)--activity跳转动画

android Lollipop(5.0的跳转动画),有共享view的activity跳转动画

2015-05-07

android 折线图demo

android graphView折线 demo。

2015-05-06

Android Support Library 22.1

android 22.1的 support v4 包。

2015-04-23

android 增量升级 生成差分包工具及源码

bsdiff android增量升级所需的工具及源码。下载-解压-cmd,切换到bsdiff.exe所在的目录,执行: bsdiff.exe oldApkPath newApkPath demo.patch。 oldApkPath:老版本的apk所在路径 newApkPath:新版本的apk所在路径 demo.patch:生成的patch差分包名字 例如:bsdiff.exe E:\test\aOld.apk E:\test\aNew.apk E:\test\a.patch

2015-04-16

android动态改变shape的颜色值

android 用shape画出来的颜色做背景时,动态的改变它的颜色属性。

2015-03-03

google官网自定义控件实例

google官方的自定义控件实例,重写了onMeasure,onDraw方法以及自定义属性的使用。

2015-03-03

android string.xml %1$s %d\%的用法

android string.xml %1$s %d\%的用法,动态修改里面的值

2015-02-02

自定义多选listview

android 官方的自定义多选的listview的实现。

2015-01-31

仿网易布局(主界面切换)

android 官方slidingTab实例,仿网易新闻主布局的切换(标题跟viewpager一起滑动)

2015-01-31

textswitcher的官方demo

android官方的textswitcher demo,textview内容的切换(带动画效果)。

2015-01-29

viewpager里动态加载fragment

viewpager里面动态的加载fragment.

2014-09-24

drawerlayoutDemo

一个简单的drawerlayout的Demo,导航抽屉,侧滑。

2014-07-06

android support v4自带的侧滑

SlidingPanelLayout为在UI最上层的使用提供了一个水平的,多个面板的布局。左边的面板可以看作是一个内容列表或者是浏览,右边的面板的任务是显示详细的内容。

2014-07-02

viewholder模式的简介写法

把SparseArray绑定到一个view,SparseArray 初始化会分配10长度的地址,理论上会浪费了内存,但是这些都在允许范围内。省去了重复写viewholder的重复,重复。。自己留作纪念。

2014-06-14

ViewTreeObserverDemo

viewTreeOberver 计算组件大小的一个简单demo.

2014-05-24

android fragment+viewpager(pagerTabStrip)多界面切换

android fragment viewpager +pagerTabStrip,实现多界面滑动。

2014-05-13

android仿淘宝,自动获取短信验证码 demo

仿淘宝,注册时候,自动填写发送过来的验证码。一个简单的demo。没有在安装安全软件的手机上测试过。。

2014-05-13

android baseAdapter的简单封装demo

一个简单baseAdapter的封装demo.减少一些不必须要的重复的代码。

2014-05-13

SwipeRefreshLayout(Google下拉刷新控件)

google发布了自己的下拉刷新控件------SwipeRefreshLayout,该控件封装在android-support-v4 jar包中,依靠监听OnRefreshListener实现刷新操作。该控件用法简单,setEnable()方法控制刷新是否可用,setRefreshing()方法控制刷新进度条动画是否可用,由于是要实现下拉刷新,官方文档明确指出该控件所含有的一个直接子View必须是能够滚动的,如ListView、ScrollView等等。

2014-05-07

greenDao简单demo

greenDaoMaster一个移动开发的ORM框架.网上资料很多,这里就是一个简单的demo. http://download.csdn.net/detail/ecliujianbo/7302487是实体类生成的java项目

2014-05-06

GreenDao java实体类生成

这个只是greenDao用来生成java的实体类的项目(java项目)。

2014-05-06

android 观察者模式

android,通过观察者模式,更新加载的数据。

2014-04-17

仿微信 摇一摇

android,仿微信,摇一摇功能的实现。

2014-04-17

仿IOS的scrollview

仿IOS的弹性scrollview,别人的资源,感觉不错。

2014-04-17

android 横向listview HorizontalListView

横向的listview,HorizontalListView

2014-04-17

flowlayout 顺序布局,自动换行

flowLayout,顺序布局,自动换行。

2014-04-17

android 使用雅黑字体 ttf

使用雅黑的ttf,来改变默认显示的字体。

2014-04-17

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除