自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

haoyuegongzi的博客

天狼啸月

  • 博客(207)
  • 收藏
  • 关注

原创 精华文章目录

动画系列动画一、细说Animation五大基本动画动画二、Animation动画插值器动画三、ValueAnimator属性动画的基本使用动画四、ValueAnimator属性动画高级进阶(一)动画五、ValueAnimator属性动画高级进阶(二)动画六、ObjectAnimator动画的基本使用动画七、动画的PropertyValuesHolder与Keyframe动画八、联合...

2020-05-04 12:26:04 195

原创 重要资料集锦——源码、算法、面试、技术中心等等

Android 面试复习资料2020年Android面试题汇总2020年 中级Android面试总结2020年Android面试题含答案一波Android面试(附答案)10大基础实用算法及其讲解Android程序员算法 part 1Android程序员算法 part 2Handler中的Loop死循环,为什么没有阻塞主线程Activity启动流程源码分Android Servi...

2020-05-04 11:11:38 224

原创 为什么不能在子线程中更新UI

首先声明一点:子线程里面是可以更新UI的——创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下:@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layou...

2018-03-01 16:17:39 8784 5

原创 从源码角度分析View的工作原理

一、几个重要的概念:1、MeasureSpec概述: 作用上简单地说就是测量View的Width/Height尺寸。一个子View的Width/Height尺寸同事受自身尺寸参数LayoutParams和父View尺寸的影响。测量过程中系统会将View的LayoutParams根据父View的MeasureSpec参数情况转换成自身的MeasureSpec,然后再根据自身的MeasureSp...

2018-02-26 23:14:22 417

原创 从源码角度理解Android的通信机制——Handler消息机制

一、概述在安卓开发里面,当子线程在执行耗时操作的时候,不是说你的主线程就阻塞在那里等待子线程的完成,也不是调用Thread.wait()或是Thread.sleep()。安卓采取的方法是,主线程为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。 一个程序的运行,就是一个...

2018-02-01 11:52:54 348

原创 自定义View实现ImageView在任意尺寸下对Image的自适应

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

2017-10-30 17:24:34 2581 1

原创 一图详解Android View的事件分发机制

转载请注明出处:http://blog.csdn.net/haoyuegongzi/article/details/78344600研究了许久的Android View点击事件的分发机制,到今天稍微有了一点头绪,写此博文,小作总结。 本文参考了郭霖的 Android事件分发机制完全解析,带你从源码的角度彻底理解(上): http://blog.csdn.net/guolin_blog/a

2017-10-25 18:17:38 685

原创 ViewModel分析

该方法既执行了 mViewModelStores 的get()方法,也执行了 mViewModelStores 的put()方法。因此,mBagOfTags一定不为空,上面clear()方法的if(){...}判断会执行。因此,某个指定的 ViewModel所对应的key值“DEFAULT_KEY + ":" + canonicalName”,永远是不变的,相当于是final类型的。这两个 Factory 的子类,关键的都是 各自的create()方法,后面我还还会提到。

2024-01-15 11:28:51 395

原创 泛型与Gson解析

/ getGenericSuperclass()得到包含原始类型,参数化,数组,类型变量,基本数据。// objResult就是用户最后需要的结果。* 用于把网络返回的json字符串转换成参数化类型。* 泛型 T 就是用户输入的javaBean的类型。// 把这个json转成用户需要的对象。// 得到javaBean对应的字节码。* 回调的顶层接口(JSON,XML,.....)// result就是网络回来的数据。// 再把用户需要的结果回调给调用者。// 获取参数化类型。* 回调接口的一种实现。

2023-10-06 12:06:42 314

原创 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 999

原创 RecyclerView的复用流程

RecyclerView的复用流程图

2023-05-02 15:11:49 132 1

原创 Android系统启动流程

本文以思维导图的方式简书Android系统的启动流程

2022-12-12 09:53:40 227

原创 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 1331

原创 模拟器连不上AndroidStudio的处理方案

模拟器连AndroidStudio的处理方案

2022-11-23 11:01:08 2093

原创 AMS的启动

以流程图的形式详细介绍了AMS的启动过程。

2022-11-21 23:14:16 201

原创 Android图片上传的两种方式

图片上传,以及带参数的图片上传是Android开发中,很常见的需求。但也是接口联调难度相对比较大的技术实现,本文介绍两种可靠的图片上传方式。一是通过 MultipartBody 来实现;二是通过图片转字符串来实现。一、通过 MultipartBody 来实现注意事项和重点,都在注释中说明了,就不再啰嗦: // 定义图片文件解析,下面的 * 代表的是要上传的图片的格式,比如:png、jpg、JPEG等等 MediaType MEDIA_TYPE_PNG = Medi

2021-10-22 13:39:39 10716

原创 循环遍历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 946

原创 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 2158

原创 Android Jetpack 架构组件之 Navigation

一、关键字段的解释Kotlin语言环境下在Fragment里面操作控件的注意事项:在onCreateView()方法和onStart()方法里面直接通过id操作控件的话,会要求必须加findViewById()获取控件id,否则就会报"must not be null"这个错误。但是在onViewCreated()方法里面就不用这样。另外自定义的方法里面也是必须获取控件id。可以这么理解:在Fragment里面,除了在onViewCreated()方法里面直接操作控件或者调用操作控件的方法外,

2020-12-31 14:45:36 1409

原创 Android Jetpack 架构组件之 DataBinding进阶

一、简介Android Jetpack的数据绑定主要分为两种,一是单向绑定,二是双向绑定。单向绑定可以户这么理解:当我们的源数据发生变化的时候,与原数据绑定的UI也一并变化。双向绑定可以这么理解:当我们的源数据发生变化的时候,与原数据绑定的UI也一并变化;而当UI的数据变化的时候,我们的源数据 也跟着变化;比如我们的源数据 变化,与之绑定的TextView和EditTExt发生变化;当EditTExt输入框的的数据发生变化的时候,我们的元数据和TextView现实的数据也发生变化。二、单向绑定就是Je

2020-12-31 14:12:15 208

原创 Android Jetpack 架构组件之 DataBinding

一、DataBinding 简介:DataBinding ,顾名思义即为数据绑定,其推出目的就是为了减少繁琐的代码,使代码更加的简洁、可读性更强。使用 DataBinding 会让我们的布局文件不简简单单的只有一个布局文件的作用,还包含和很多的逻辑。可以大量减少 Java代码。同时DataBinding还会让我们的代码更有层级,结构更加的清晰完善,数据能够单向或者双向绑定到布局文件当中。这样有助于防止内存泄露,而且能够自动进行空检测以避免空指针异常。二、 DataBinding 的集成**DataB

2020-12-31 13:51:38 333

原创 Android Jetpack 架构组件之 WorkManger

一、前言对于后台任务,我们先回顾以前的做法:以前我们在处理后台任务时,一般都是使用Service(含IntentService)或者线程/线程池,而Service不受页面生命周期影响,可以常驻后台,很适合做一些定时、延时任务,或者其他一些肉眼不可见的神秘勾当。 在处理一些复杂需求时,比如监听网络环境自动暂停重启后台上传下载这类变态任务,我们需要用Service结合Broadcast一起来做,非常的麻烦,再加上传输进度的回调,让人想疯!同时大量的后台任务过度消耗了设备的电量,比如多种第三方推送的servi

2020-12-31 00:14:18 484

原创 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 345

原创 Android Jetpack 架构组件之 LiveData

一、LiveData简介LiveData是一个保存可以被观察的值的数据持有类。与普通的观察者不同,LiveData遵循应用组件的生命周期,比如Observer可以指定他应该观察的具体的Lifecycle。LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。如果观察者(由

2020-12-30 15:48:56 193

原创 Android Jetpack 架构组件之 ViewModel

一、ViewModel 介绍传统开发模式下,Activity、fragment 等任务繁琐,同时负责逻辑和UI,往往在一个比较大型的项目,一个 Activity 几千行代码算少的,让人看了就没下手的欲望,这也为啥衍生了 MVP、MVVM 的原因;而使用 ViewModel 的一个很重要的作用,就是可以为 Activity 分担一部分工作:专门存放界面相关的数据。也就是说,只要是界面上能看到的东西,它的变量都应该放在 ViewModel 中,而不是 Activity,这样就可以一定程序上减少 Activit

2020-12-30 13:58:19 275

原创 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 335

原创 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 352

原创 关于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 4514

原创 细说协程零六、协程泄露及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 1571 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 573

原创 细说协程零五、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 750

原创 细说协程零二、为什么要用协程

首先我们来看看目前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 365

原创 细说协程零四、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 311

原创 细说协程零三、协程的常见实现

一、协程的分类:1、按调用栈分:有栈协程:每隔协程会分配单独的类似线程的调用栈,比如Lua Coroutine;无栈协程:不会分配单独的调用栈,挂起点的状态通过闭包或者对象来保存,没办法嵌套函数,实现挂起,比如Python Generator。挂起和恢复没有函数的嵌套是无盏协程的非常典型的特征,否则即为有盏协程。有栈协程涉及到分配独立的内存等硬件资源,这是额外的资源开销,因此有栈协程的使用受到一定限制,没有无栈协程受欢迎。Kotlin、JavaScript、C#这些语言的协程都是属于无栈协程。2

2020-09-13 18:03:34 680

原创 细说协程零一、协程的概念

序引:什么是进程和线程直白地讲,进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源、数据资源、独立的内存空间。线程又是什么呢?线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有多个子线程。同时,线程拥有自己的栈空间。总结起来就是:对操作系统来说,进程是CPU进行资源分配和管理的最小单元,线程是CPU调度任务执行的最小单元。影子:什么是协程1、协程就是可以由程序自行控制挂起(暂停执行)、恢复(继续在原来暂停的地方

2020-09-13 10:07:02 484 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 717

原创 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 642

原创 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 157

原创 Kotlin学习笔记二十二、类属性延迟初始化

延迟初始化主要有一下几种方式:一、lateinit“lateinit”关键字的使用示例:lateinit var strData:Stringfun main(args: Array<String>) { strData = "任缥缈"}kotlin关键字“lateinit”使用注意事项:1、lateinit会让编译器忽略变量的初始化 ,同时不支持Int、Boolean、Char等基本数据类型;2、开发者必须在能够完全掌握变量的生命周期变化的场景下使用关键字“latei

2020-09-10 09:53:01 242

原创 Kotlin学习笔记二十一、集合的变换与序列以及聚合

集合的变换与序列这一节主要是记录集合list、map、array等的filter()、map()、flatMap()函数的使用。这些函数在日常开发中有着重要的地位。1、map的map()、 filter()方法:val mMap: MutableMap<String, String> = mutableMapOf("01" to "02", "13" to "35", "15" to "36", "03" to "45")将mMap的key和value拼接在一起形成新的字符串,返回一

2020-09-09 18:14:07 573

空空如也

空空如也

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

TA关注的人

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