- 博客(169)
- 资源 (12)
- 问答 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 我的首个付费专栏发布啦!!!
最近CSDN的付费专栏推送通知好几次了,一直在犹豫要不要写?写些什么内容?万一写完了之后被喷了怎么办?毕竟是收费内容,文章的质量要求还是非常高的,经过一番心理斗争,决定尝试一下。首先是内容的选择,还是希望写一写目前技术较新,但是完整资料较少的课题,经过仔细思考选择了协程。协程目前已经是Kotlin面试的必考题,如果你还没用过,或者了解的不够深入的话,现在是时候搞起来了。专栏从12月份开始,反复修改到发布,差不多一个多月的时间,总共七篇:协程系列(一):协程的基础使用协程系列(二):协程的高级用法协程
2021-02-01 12:02:30
555
原创 Android开发常见问题:我的全局变量等于Null?
最近我的app要绑定好多服务,为了简化连接流程封装了Base服务,结果发现初始化全局变量为Null,希望大家不要和我一样再踩这个坑。
2023-10-24 15:54:15
252
原创 Effective Java 案例分享(十)
Thread的构造方法只有Runnable类型,所以执行的一定是Thead(Runnable runnable)方法,但是ExecutorService不是,submit重载了两个方法,一个是submit(Runnable),一个是submit(Callable),所以会执行submit(Runnable)。例如上面的代码,当没有参数时,直接在运行时抛出异常是很危险。例如上面的代码,如果参数个数超时3个才会使用可变参数,这种解决方案不是好的办法,但是确实解决了数组内存的问题,所以是否要使用需要谨慎的考虑。
2023-08-25 17:03:25
133
原创 Effective Java 案例分享(七)
该方法会把Stack中所有的元素放入dst集合中,但是传入的dst必须是E类型的集合。?extends E,表示E的所有子类,包括E;?super E, 表示E所有的父类,包括E;生产者(producer)使用extends,消费者(consumer)使用super;
2023-05-12 16:24:37
662
1
原创 Android开发常见问题:为什么不要用Timer?
从实现上对比,其实Handler和Timer的实现是类似的:队列 + 任务 + 处理器。在性能上可能不会太大的差别。Handler的实现更适合做延时任务,Time更适合做定时器,例如服务端的定时任务,例如每天晚上的0点备份数据,节假日开启某个配置等等。最后总结一句话:在Android开发,Timer几乎所有的使用场景都有对应的Android API可以替换,所以非特殊情况,还是别用比较好。
2023-01-04 18:00:27
834
原创 【十个鸡蛋】
在外面的日子,我想着有了钱,可以把外面的租房退了买一个属于自己的家,再讨个媳妇,如果有余付还能攒下过日子。曾经我们很穷,日子很苦,每天为了生活四处奔波,那时我还小,你总是照顾我。你有些生气:这些年我照顾你,是不是付出的比较多,你在外面时间长了,知不知道我过的很苦。你说:你还年轻,买房讨媳妇再等几年不是问题,外面的日子好混,这边不行,我压力太大。在这个时代里,鸡蛋是硬通货。我说:我明白,但是你是不是提前告诉我有个准备,我知道的话也会支持你。我说:我明白,但是你得提前告诉我一声,现在才告诉我,我这都没准备。
2023-01-03 11:24:59
343
原创 Effective Java 案例分享(五)
19、为继承设计和撰写文档,或者其他有益的方方式随意的继承一个外来的类是非常危险的,所以应当为继承的类设计和撰写文档是非常必要的。一个可继承的类必须描述可重写的方法的内部使用逻辑,以及重写带来的影响;一个可继承的类必须明智的尽可能少的选择哪些属性和方法是protected;测试一个可继承的类,最好找作者以外的人编写子类,最好编写三个子类进行测试;一个可继承的类必须经过充分的测试才能发布使用;一个可继承的类的构造方法里不要使用可重写的方法;一个可继承的类实现了Cloneable或Seriali
2022-07-19 17:56:03
168
原创 Handler的removeCallbacksAndMessages怎么不好使了呢?
前言此篇文章记录日常遇到的一个小坑:Handler的removeCallbacksAndMessages没生效。正文需求:需求:有1-5个超时任务,如果某个任务在规定时间内完成,需要取消对应的超时任务;这个需求并不复杂,如果是比较简单的延时任务,可以使用Handler.postDelayed添加延时任务,如果任务在预期内完成,可以通过Handler.removeCallbacksAndMessages删除掉对应的任务:Handler handler = new Handler();// 添
2022-05-25 16:11:17
1593
原创 Effective Java 案例分享(四)
保持类和成员的最小的访问权该建议与设计模式六大原则-最少知道原则,意义相同。这样做的好处:便于开发,测试,优化,使用,理解,修改;如果保持最少知道原则:每一个类或者成员都应该尽可能的不可访问。优先使用private,如果需要外部访问在逐级打开访问权限(protect, public);如果一个顶级类或者接口,只被另外的一个类使用,考虑把这个顶级类定义为使用类的静态内部类,减少该类被访问的可能;所有的成员变量的都应该是private,如果不得不去掉private,那么也应该是package-
2022-01-13 11:27:41
1389
原创 Effective Java 案例分享(三)
11、重写Object.equals时,必须重写Object.hashcode;12、总是重写toString方法;13、谨慎的重写clone方法;14、考虑实现Comparable接口
2022-01-06 14:23:20
1892
原创 Effective Java 案例分享(二)
7、抛弃废弃的对象引用当一个对象不再使用时,应该将该引用设置为null,避免该对象并不能被JVM回收。文中列出以下几种情况:数组中的对象,使用结束后要把对应的未知的引用设置为null;注意缓存对象的存活时间;注意listener和callback的添加和移除;...
2021-12-16 18:10:43
1872
原创 Effective Java 案例分享(一)
考虑使用静态生产方法替代构造方法如果某一个类拥有多个构造方法,且参数各不相同,使用静态的生产方法替代构造方法的好处:过多的构造方法增加了使用者对于类的理解成本,并且很容易产生误解;静态生产方法拥有自己的方法名,可以进一步描述该方法的使用场景和参数意义;静态生产方法封装了内部的实现,便于扩展。例如实现内部的单例,缓存,子类,匿名类,简单工厂等等;缺点:如果构造方法是私有的,仅仅使用静态生产方法,子类不能继承构造方法;如果使用静态方法,需要使用者首先了解静态生产方法的存在,并在所有的静态方法
2021-11-19 10:38:31
1851
原创 Handler的使用陷阱
前言沈阳刚刚入职,最近在阅读之前同事的代码,因为他的架构设计中使用了大量的Handler模型,所以再次总结一下Handler的使用问题,这也面试的常见问题之一。正文问题一:构建Handler异常Handler与Looper,MessageQueue协作,是Android线程切换的主要手段之一,官方推荐开发者自己指定Handler的执行线程,如果你使用的Handler构造函数是无参构造方法:标记有删除线的方法,表示该方法已经废弃,如果在开发中遇到了这样的方法一定要了解具体api废弃的原因,这样可以
2021-09-17 16:00:23
389
原创 Java泛型与Kotlin泛型
正文本文主要列举Java泛型与Kotlin泛型的基本知识,以及两者的区别。什么泛型泛型程序设计是程序设计的一种风格或或规范。简单的说就是该类型可变,在编写代码时可以根据情况设置不同的类型。因为泛型的可变性,很容易出现类型转换异常,Java与Kotlin在编译期间提供了泛型检测,帮助开发者在编译期间就能尽量避免此异常的出现。Java泛型的基本知识Java泛型主要用在类,接口,类方法。泛型仅在编译期间有效,编译完成后擦除泛型标记。// 类class ObjectA<T>{}// 接口
2021-04-08 18:17:56
760
原创 协程系列(六):分析协程的实现原理(下)
本篇在了解了协程基本原理的情况下,继续扩展协程知识体系:异常处理机制的源码,以及async实现异步任务的源码。
2021-01-29 19:22:56
222
原创 如何加载一张图片到ImageVIew(Google官方推荐 + 协程)
前言无论是刚刚加入Android的新人还是工作n年的老码农,如何加载一张图片到ImageView,都能轻松搞定。随着Glide的发布,我已经很久没有写过相关的代码了,最近复习了一下Glide的源码,偶然查看了Google官方的Bitmap管理文档,才发现里面大有文章。本篇主要以Google官方文档Bitmap的推荐用法作为基础,手撸一个Demo。正文首先,我从网上找到了一张比较大的图片,尺寸为:3024*3024:把文件命名为cat放入drawable文件夹,然后使用ImageView.setI
2020-12-24 18:18:43
1189
6
原创 源码解析:Application的创建过程(android 11)
前言此文仅分析Applcation的创建过程。正文如果我们要启动App,系统会创建ZygoteInit进程启动整个应用,其中ZygoteInit.main是整个应用启动的入口,在main方法中,我们需要fork一份系统服务: if (startSystemServer) { Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer); // {@code r == null} in th
2020-11-12 18:42:17
419
原创 Gson踩坑笔记:为什么对象的构造方法没有被执行?
前言最近做项目遇到了一个很奇怪的问题,情况如下:创建对象TestBean,其中type和name需要接口返回并解析,time字段需要客户端修改,做一些必要的记录,希望time的默认值为10:val jsonStr ="{type: 99, name:\"superman\"}"data class TestBean(val type: Int, val name: String, var time: Long = 10)在运行前,我认为这段代码非常完美,但是结果却很意外:难道Gson把构造
2020-10-26 18:32:47
1222
原创 读书笔记:Java类的加载机制
前言本文内容来源于《深入理解Java虚拟机》,各大电商平台均可购买。正文类加载的时机类加载的整个生命周期:加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载对于初始化阶段,虚拟机严格规定只有5中情况必须立即对类初始化:遇到new . getstatic、putstatic或invokestattic这4条字节码指令时,如果类没有初始化,则需要先触发其初始化。常见场景:使用new创建对象,读取或设置静态字段(被final修饰,已在编译期把结果放入常量池的静态字段除外)的时候
2020-09-04 12:18:47
225
原创 Java虚拟机内存知识整理
前言本篇文章整理一下书中Java虚拟机内存的相关知识。书名:深入理解Java虚拟机。正文运行时数据区域程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。为了线程切换后能回复到正确的执行位置,每条线程都有一条独立的程序计数器,各条线程之间互不影响,独立存储,我们称这类内存区域为线程私有内存。如果线程正在执行的是一个Java方法,这个计数器记录的是正在小hiing的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空。此内存区域是唯一
2020-08-14 15:49:02
229
原创 ZEditText:自定义密码输入框
前言心情非常沉重,仅以此篇文章纪念我摔碎的手机屏幕偶然看到一篇文章,讲解了自定义密码输入框,直接上图:很多的App都有这样的功能,一般实现这种输入框有以下几种方案:实实在在的写了5个EditText,然后各种焦点切换逻辑,哪怕增多或者减少一个输入框,都要改很多东西,最不推荐的一种方法;隐藏一个EditText,把输入的内容显示在可见的TextView上,相对于第一种做法肯定是高级了很多;继承EditText,修改onDraw绘制边框以及文字;我看到的文章,讲解的是第三种做法,他直接继
2020-08-10 17:47:55
671
原创 Handler中loop方法为什么不会导致线程卡死
前言最近闲的时间比较多,浏览一些公众号和一些IT网站,突然看到一个问题:Handler中loop方法为什么不会导致线程卡死?我先浏览了一下源码,以下为截取部分片段:/**Looper*/public static void loop() { ... for (;;) { Message msg = queue.next(); // might block if (msg == null) {
2020-08-03 12:15:25
962
原创 SlidingScaleTabLayout(3):解决文字动画需要重写PagerAdapter.getItemPosition()的问题
前言自从SlidingScaleTabLayout发布以后,收到的最多的反馈:1、为什么文字切换没有效果?大部分都是PagerAdapter.getItemPosition()的重写问题,虽然demo里有个例子,但是很明显没有达到我当初的预期。重写PagerAdapter.getItemPosition()是一个很不优雅的方案,增多了使用者的开发成本,并且很容易出错,我也一直在找解决方案,终于在上周发了1.2.x版本。正文解决方案来源于我的同事,在之前的开发任务中,我们的app也加入了Tab
2020-07-27 11:45:09
805
原创 DSL实战:仿Flutter代码布局实战
前言我的第一份IT工作是Web前端,转眼已过去8年,之前在学习Flutter的时候情不自禁想起了当年苦逼的div生活,之后还略微研究了一下JetPack Compose。这两个库都是代码实现GUI,关于JetPack Compose的用法一直颇有争议,有人说在Android上,使用代码布局是技术的倒退,这一点我有一些自己的看法:Android把布局和代码分离,必须说非常有眼光,相比其他平台,例如ios,Android开发者非常幸福。由于开发者对于App的性能要求越来越苛刻,使用XML布局,每次都需要
2020-07-23 18:06:15
720
原创 读书笔记:Kotlin自定义DSL语法
本笔记来自第一行代码第三版第13章,作者郭霖,各大平台均可购买。前言DSL的全称时领域特定语言,它是变成语言赋予开发者的一种特殊能力,通过它我们可以编写出一些看似脱离其原始语法结构的代码,从而构建出一种专有的语法结构。在日常开发中,我们使用DSL语言主要在gradle文件中:dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains..
2020-07-23 14:20:12
793
原创 读书笔记:WorkManager的使用
本笔记来自第一行代码第三版第13章,作者郭霖,各大平台均可购买。前言WorkManger为了解决开发者需要在后台执行一些耗时性或周期性的独立的任务。WorkManger不属于Android的四大组件,是独立的任务,在应用退出时,仍然可能会执行。正文总结...
2020-07-22 12:15:57
693
原创 自定义View:秀一个音乐app的歌词变色TextView
前言从2014年开始从事安卓的工作,就一直关注郭霖大神的博客,慢慢的到微信公众号,再到第三行代码。说来惭愧,我只投过一篇稿,大部分都是处于蹭吃蹭喝的潜水状态,感慨已年近三十,在头发掉光之前再投第二篇稿。我个人比较喜欢做一些有意思的东西,所以这次把最近做的一个小功能跟大家分享一下:仿音乐App歌词播放变色的TextView。正文首先先看一下效果图:...
2020-05-21 19:13:19
750
1
Android 线程同步Demo
2017-04-17
HandlerThread使用demo
2017-04-14
谁用过百度地图 地理围栏啊 ,为什么我的围栏无效
2014-04-26
TA创建的收藏夹 TA关注的收藏夹
TA关注的人