- 博客(209)
- 收藏
- 关注

原创 精华文章目录
动画系列动画一、细说Animation五大基本动画动画二、Animation动画插值器动画三、ValueAnimator属性动画的基本使用动画四、ValueAnimator属性动画高级进阶(一)动画五、ValueAnimator属性动画高级进阶(二)动画六、ObjectAnimator动画的基本使用动画七、动画的PropertyValuesHolder与Keyframe动画八、联合...
2020-05-04 12:26:04
234

原创 重要资料集锦——源码、算法、面试、技术中心等等
Android 面试复习资料2020年Android面试题汇总2020年 中级Android面试总结2020年Android面试题含答案一波Android面试(附答案)10大基础实用算法及其讲解Android程序员算法 part 1Android程序员算法 part 2Handler中的Loop死循环,为什么没有阻塞主线程Activity启动流程源码分Android Servi...
2020-05-04 11:11:38
264

原创 为什么不能在子线程中更新UI
首先声明一点:子线程里面是可以更新UI的——创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下:@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layou...
2018-03-01 16:17:39
8892
5

原创 从源码角度分析View的工作原理
一、几个重要的概念:1、MeasureSpec概述: 作用上简单地说就是测量View的Width/Height尺寸。一个子View的Width/Height尺寸同事受自身尺寸参数LayoutParams和父View尺寸的影响。测量过程中系统会将View的LayoutParams根据父View的MeasureSpec参数情况转换成自身的MeasureSpec,然后再根据自身的MeasureSp...
2018-02-26 23:14:22
461

原创 从源码角度理解Android的通信机制——Handler消息机制
一、概述在安卓开发里面,当子线程在执行耗时操作的时候,不是说你的主线程就阻塞在那里等待子线程的完成,也不是调用Thread.wait()或是Thread.sleep()。安卓采取的方法是,主线程为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。 一个程序的运行,就是一个...
2018-02-01 11:52:54
382

原创 自定义View实现ImageView在任意尺寸下对Image的自适应
今天研究图片处理的一些功能,发现当图片宽度铺满屏幕宽度的时候,无论怎么设置scaleType属性+adjustViewBounds属性都无法使图片在铺满屏幕宽度的前提下保持宽高比不变,经过参考网上前辈的经验,发现需要自定义IamgeView,重写onMeasure()方法:具体思路是:获取加载在ImageView中的图片的Drawable对象,然后以屏幕的宽度*Drawable对象的宽高比,获...
2017-10-30 17:24:34
2667

原创 一图详解Android View的事件分发机制
转载请注明出处:http://blog.youkuaiyun.com/haoyuegongzi/article/details/78344600研究了许久的Android View点击事件的分发机制,到今天稍微有了一点头绪,写此博文,小作总结。 本文参考了郭霖的 Android事件分发机制完全解析,带你从源码的角度彻底理解(上): http://blog.youkuaiyun.com/guolin_blog/a
2017-10-25 18:17:38
758
原创 细说协程零七、协程的创建方式
Android Kotlin开发环境下,协程是我们绕不开的话题。其以同步或者线性的思路实现复杂的异步或者并发逻辑所表现出来的优势,是Retrofit、OkHttp、RxJava等无法比拟的。那么Kotlin的协程究竟有哪些创建方式呢?下面我们来慢慢扒一扒。Android Kotlin的协程创建,一共有7中方式。
2024-10-25 15:24:56
652
原创 标准函数let、run、also、all、with、takeIf、takeUnless
Kotlin中,几个常用的标准函数的异同,功能做一个比较和总结。
2024-10-24 22:44:31
195
原创 ViewModel分析
该方法既执行了 mViewModelStores 的get()方法,也执行了 mViewModelStores 的put()方法。因此,mBagOfTags一定不为空,上面clear()方法的if(){...}判断会执行。因此,某个指定的 ViewModel所对应的key值“DEFAULT_KEY + ":" + canonicalName”,永远是不变的,相当于是final类型的。这两个 Factory 的子类,关键的都是 各自的create()方法,后面我还还会提到。
2024-01-15 11:28:51
519
原创 泛型与Gson解析
/ getGenericSuperclass()得到包含原始类型,参数化,数组,类型变量,基本数据。// objResult就是用户最后需要的结果。* 用于把网络返回的json字符串转换成参数化类型。* 泛型 T 就是用户输入的javaBean的类型。// 把这个json转成用户需要的对象。// 得到javaBean对应的字节码。* 回调的顶层接口(JSON,XML,.....)// result就是网络回来的数据。// 再把用户需要的结果回调给调用者。// 获取参数化类型。* 回调接口的一种实现。
2023-10-06 12:06:42
426
原创 AndroidStudio的 java.lang.String java.io.File.path accessible异常处理
Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module @
2023-07-04 11:26:18
1324
原创 Git clone时报错: OpenSSL SSL_read: Connection was reset, errno 10054
git clone :OpenSSL SSL_read: Connection was reset, errno 10054
2022-11-27 10:11:29
1430
1
原创 Android图片上传的两种方式
图片上传,以及带参数的图片上传是Android开发中,很常见的需求。但也是接口联调难度相对比较大的技术实现,本文介绍两种可靠的图片上传方式。一是通过 MultipartBody 来实现;二是通过图片转字符串来实现。一、通过 MultipartBody 来实现注意事项和重点,都在注释中说明了,就不再啰嗦: // 定义图片文件解析,下面的 * 代表的是要上传的图片的格式,比如:png、jpg、JPEG等等 MediaType MEDIA_TYPE_PNG = Medi
2021-10-22 13:39:39
11765
原创 循环遍历remove移除list元素
通常我们通过for循环移除list的所有元素时,都会遇到一个棘手的问题:数组下标越界的问题,因为每移除一个元素,list的长度就会减少一个,这个时候list的长度和当前表示移除元素位置的index的数值就存在不匹配的可能,也就是index > list.size()的情况。那么我们时不时就不能用过该方式实现list的item元素的移除呢?答案是有的: private static void removeList(){ ArrayList<String> stri
2021-10-01 11:01:36
1088
原创 downloadFile文件下载封装
private Exception exception;private FileOutputStream fos = null;private InputStream is = null;/** * TODO:文件下载 * @param downurl:下载链接 * @param path::下载文件存放地点 * @param filename:下载文件命名 * @param requestType:请求方式--GET/POST * @param requestProperty:HttpU
2021-03-08 00:41:12
2277
原创 Android Jetpack 架构组件之 Navigation
一、关键字段的解释Kotlin语言环境下在Fragment里面操作控件的注意事项:在onCreateView()方法和onStart()方法里面直接通过id操作控件的话,会要求必须加findViewById()获取控件id,否则就会报"must not be null"这个错误。但是在onViewCreated()方法里面就不用这样。另外自定义的方法里面也是必须获取控件id。可以这么理解:在Fragment里面,除了在onViewCreated()方法里面直接操作控件或者调用操作控件的方法外,
2020-12-31 14:45:36
1728
原创 Android Jetpack 架构组件之 DataBinding进阶
一、简介Android Jetpack的数据绑定主要分为两种,一是单向绑定,二是双向绑定。单向绑定可以户这么理解:当我们的源数据发生变化的时候,与原数据绑定的UI也一并变化。双向绑定可以这么理解:当我们的源数据发生变化的时候,与原数据绑定的UI也一并变化;而当UI的数据变化的时候,我们的源数据 也跟着变化;比如我们的源数据 变化,与之绑定的TextView和EditTExt发生变化;当EditTExt输入框的的数据发生变化的时候,我们的元数据和TextView现实的数据也发生变化。二、单向绑定就是Je
2020-12-31 14:12:15
254
转载 Android Jetpack 架构组件之 DataBinding
一、DataBinding 简介:DataBinding ,顾名思义即为数据绑定,其推出目的就是为了减少繁琐的代码,使代码更加的简洁、可读性更强。使用 DataBinding 会让我们的布局文件不简简单单的只有一个布局文件的作用,还包含和很多的逻辑。可以大量减少 Java代码。同时DataBinding还会让我们的代码更有层级,结构更加的清晰完善,数据能够单向或者双向绑定到布局文件当中。这样有助于防止内存泄露,而且能够自动进行空检测以避免空指针异常。二、 DataBinding 的集成**DataB
2020-12-31 13:51:38
438
原创 Android Jetpack 架构组件之 WorkManger
一、前言对于后台任务,我们先回顾以前的做法:以前我们在处理后台任务时,一般都是使用Service(含IntentService)或者线程/线程池,而Service不受页面生命周期影响,可以常驻后台,很适合做一些定时、延时任务,或者其他一些肉眼不可见的神秘勾当。 在处理一些复杂需求时,比如监听网络环境自动暂停重启后台上传下载这类变态任务,我们需要用Service结合Broadcast一起来做,非常的麻烦,再加上传输进度的回调,让人想疯!同时大量的后台任务过度消耗了设备的电量,比如多种第三方推送的servi
2020-12-31 00:14:18
595
原创 Android Jetpack 架构组件之 Room
一、Room简介Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。该库可帮助您在运行应用的设备上创建应用数据的缓存。此缓存充当应用的单一可信来源,使用户能够在应用中查看关键信息的一致副本,无论用户是否具有互联网连接。二、依赖def room_version = "2.2.5"implementation "androidx.room:room-runtime:$room_version"// option
2020-12-30 23:22:06
459
原创 Android Jetpack 架构组件之 LiveData
一、LiveData简介LiveData是一个保存可以被观察的值的数据持有类。与普通的观察者不同,LiveData遵循应用组件的生命周期,比如Observer可以指定他应该观察的具体的Lifecycle。LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。如果观察者(由
2020-12-30 15:48:56
248
原创 Android Jetpack 架构组件之 ViewModel
一、ViewModel 介绍传统开发模式下,Activity、fragment 等任务繁琐,同时负责逻辑和UI,往往在一个比较大型的项目,一个 Activity 几千行代码算少的,让人看了就没下手的欲望,这也为啥衍生了 MVP、MVVM 的原因;而使用 ViewModel 的一个很重要的作用,就是可以为 Activity 分担一部分工作:专门存放界面相关的数据。也就是说,只要是界面上能看到的东西,它的变量都应该放在 ViewModel 中,而不是 Activity,这样就可以一定程序上减少 Activit
2020-12-30 13:58:19
378
原创 Android Jetpack 组件之 Lifecycle
一、Lifecycles简介Lifecycles是Jetpack当中的一个来解决生命周期管理问题的组件,通过监听生命周期的方式。如果我们的类不是Activity的话(广播\碎片另说),那么它是没有生命周期的。但在开发过程中,在MVP模式里,我们需要在P层里回调View的接口来更新UI,如果不对P层做生命周期处理,就很容易发生内存泄漏,为了让P层感知Activity的生命周期,通常会定义如下接口:interface IPresenter { fun onCreate() fun onSta
2020-12-30 10:04:49
445
原创 Kotlin语言的单例实现方式
静态内部类实现方式class Singleton private constructor() { companion object { val instance = SingletonInstance.instance } private object SingletonInstance { val instance = Singleton () }}Kotlin语言的静态内部类单例的实现方式,没有什么好说的。几乎就是翻写Java的实
2020-11-10 19:40:08
426
原创 关于More than one file was found with OS independent path ‘META-INF/xxx的坑
今天将团队的项目从gitlab拉下来,编译的过程中,报了个奇葩的错误:More than one file was found with OS independent path 'META-INF/metadata.kot翻译过来就是:找到超过一个系统的文件,路径是‘META-INF/metadata.kot’解决方案就是在app下的build.gralde的android {}模块里面添加要过滤的文件的配置:android { ...... packagingOptions
2020-10-29 14:01:59
4806
原创 细说协程零六、协程泄露及async异常的处理
前言一、有效避免协程泄露的方式1、通过Job来处理2、通过MainScope()来处理3、viewModelScope对象4、lifecycleScope对象二、异常Exception以及async并发下的异常处理三、几个题外话:1、RxJava与kotlin协程比较2、AsyncTask内存泄露3、协程的delay()和Thread.sleep()谁的性能更好?4、什么时候需要切线程?Android项目开发中对协程的应用是比较灵活的,虽然依然是用****.luanch()来开启一段协程,通常指定Disp
2020-09-27 21:41:37
1963
2
原创 通过xml画圆弧,再也不用求UIP图了
直接上代码,怼UI:<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><!-- 左右负边距,就是一条直线, 然后高度高出布局的一半, 左右负责yuan弧度大小 top控制举例控件底部举例--> <item android:left="-150dp" android:right="-150d
2020-09-17 17:42:43
700
原创 细说协程零五、Kotlin协程常用Api,只需本文就足够了
fun <V> requestData(mObservable: Observable<BaseData<V>>,callBack: HttpCallBack<V>): Disposable { return mObservable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(obj
2020-09-15 18:57:33
899
原创 细说协程零二、为什么要用协程
首先我们来看看目前Android开发中成熟的Retrofit + OkHttp + RxJava网络请求的格式:fun <V> requestData(mObservable: Observable<BaseData<V>>,callBack: HttpCallBack<V>): Disposable { return mObservable.subscribeOn(Schedulers.io()) .observeOn(
2020-09-15 18:15:29
423
原创 细说协程零四、Koltin协程的基本要素
Koltin协程的基本要素基本上都是上一节里面我们提到的那些元素:kotlin标准库、上下文、拦截器、挂起函数等等。这一节我们先来看看挂起函数。挂起函数val user = githubApi.getUserSuspend("bennyhuo")println(user)suspend fun getUserSuspend(): User { return githubApi.getUserSuspend("haoyuegongzi")} interface GitHubApi {
2020-09-15 11:05:16
378
原创 细说协程零三、协程的常见实现
一、协程的分类:1、按调用栈分:有栈协程:每隔协程会分配单独的类似线程的调用栈,比如Lua Coroutine;无栈协程:不会分配单独的调用栈,挂起点的状态通过闭包或者对象来保存,没办法嵌套函数,实现挂起,比如Python Generator。挂起和恢复没有函数的嵌套是无盏协程的非常典型的特征,否则即为有盏协程。有栈协程涉及到分配独立的内存等硬件资源,这是额外的资源开销,因此有栈协程的使用受到一定限制,没有无栈协程受欢迎。Kotlin、JavaScript、C#这些语言的协程都是属于无栈协程。2
2020-09-13 18:03:34
848
原创 细说协程零一、协程的概念
序引:什么是进程和线程直白地讲,进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源、数据资源、独立的内存空间。线程又是什么呢?线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有多个子线程。同时,线程拥有自己的栈空间。总结起来就是:对操作系统来说,进程是CPU进行资源分配和管理的最小单元,线程是CPU调度任务执行的最小单元。影子:什么是协程1、协程就是可以由程序自行控制挂起(暂停执行)、恢复(继续在原来暂停的地方
2020-09-13 10:07:02
582
1
原创 Kotlin学习笔记二十五、内部类、匿名内部类
内部类class NestedDemo { var mNested = "NestedDemo" fun funNested(){ println("funNested()") } class Outer { private val zero = 0 val one = 1 fun outerFun():Int{ return 1 } class I
2020-09-10 15:34:40
841
原创 Kotlin学习笔记二十四、Kotlin单例object关键字
kotlin里面的单例是通过关键字object来实现的:object Singleton { fun nowDateTime():String{ var sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS") return sdf.format(Date()) } val nowDate:String get() { var sdf = SimpleDateForm
2020-09-10 14:36:21
682
原创 Kotlin学习笔记二十三、代理delegate
代理的定义:我代表/代替你处理你的事情。我们先来定义一个接口:interface Api{ fun create() fun prepare() fun start() fun end()}再来看看他的实现类ApiImpl.kt :class ApiImpl:Api { override fun create() { println("create()") } override fun prepare() {
2020-09-10 11:33:30
208
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人