Android
文章平均质量分 83
珠穆朗玛小王子
又是一个新的开始
展开
-
Android开发常见问题:我的全局变量等于Null?
最近我的app要绑定好多服务,为了简化连接流程封装了Base服务,结果发现初始化全局变量为Null,希望大家不要和我一样再踩这个坑。原创 2023-10-24 15:54:15 · 317 阅读 · 0 评论 -
Android开发常见问题:字符串乱码问题
最近的项目里遇到了字符串乱码的问题,记录一下研究心得。原创 2023-09-07 18:08:52 · 1142 阅读 · 0 评论 -
Effective Java 案例分享(十)
Thread的构造方法只有Runnable类型,所以执行的一定是Thead(Runnable runnable)方法,但是ExecutorService不是,submit重载了两个方法,一个是submit(Runnable),一个是submit(Callable),所以会执行submit(Runnable)。例如上面的代码,当没有参数时,直接在运行时抛出异常是很危险。例如上面的代码,如果参数个数超时3个才会使用可变参数,这种解决方案不是好的办法,但是确实解决了数组内存的问题,所以是否要使用需要谨慎的考虑。原创 2023-08-25 17:03:25 · 172 阅读 · 0 评论 -
Effective Java 案例分享(九)
本章节主要举例了Stream的几种用法。原创 2023-08-18 17:15:56 · 562 阅读 · 0 评论 -
Android开发常见问题:为什么不要用Timer?
从实现上对比,其实Handler和Timer的实现是类似的:队列 + 任务 + 处理器。在性能上可能不会太大的差别。Handler的实现更适合做延时任务,Time更适合做定时器,例如服务端的定时任务,例如每天晚上的0点备份数据,节假日开启某个配置等等。最后总结一句话:在Android开发,Timer几乎所有的使用场景都有对应的Android API可以替换,所以非特殊情况,还是别用比较好。原创 2023-01-04 18:00:27 · 882 阅读 · 0 评论 -
Effective Java 案例分享(五)
19、为继承设计和撰写文档,或者其他有益的方方式随意的继承一个外来的类是非常危险的,所以应当为继承的类设计和撰写文档是非常必要的。一个可继承的类必须描述可重写的方法的内部使用逻辑,以及重写带来的影响;一个可继承的类必须明智的尽可能少的选择哪些属性和方法是protected;测试一个可继承的类,最好找作者以外的人编写子类,最好编写三个子类进行测试;一个可继承的类必须经过充分的测试才能发布使用;一个可继承的类的构造方法里不要使用可重写的方法;一个可继承的类实现了Cloneable或Seriali原创 2022-07-19 17:56:03 · 195 阅读 · 0 评论 -
Handler的removeCallbacksAndMessages怎么不好使了呢?
前言此篇文章记录日常遇到的一个小坑:Handler的removeCallbacksAndMessages没生效。正文需求:需求:有1-5个超时任务,如果某个任务在规定时间内完成,需要取消对应的超时任务;这个需求并不复杂,如果是比较简单的延时任务,可以使用Handler.postDelayed添加延时任务,如果任务在预期内完成,可以通过Handler.removeCallbacksAndMessages删除掉对应的任务:Handler handler = new Handler();// 添原创 2022-05-25 16:11:17 · 1669 阅读 · 0 评论 -
Effective Java 案例分享(四)
保持类和成员的最小的访问权该建议与设计模式六大原则-最少知道原则,意义相同。这样做的好处:便于开发,测试,优化,使用,理解,修改;如果保持最少知道原则:每一个类或者成员都应该尽可能的不可访问。优先使用private,如果需要外部访问在逐级打开访问权限(protect, public);如果一个顶级类或者接口,只被另外的一个类使用,考虑把这个顶级类定义为使用类的静态内部类,减少该类被访问的可能;所有的成员变量的都应该是private,如果不得不去掉private,那么也应该是package-原创 2022-01-13 11:27:41 · 1418 阅读 · 0 评论 -
Effective Java 案例分享(二)
7、抛弃废弃的对象引用当一个对象不再使用时,应该将该引用设置为null,避免该对象并不能被JVM回收。文中列出以下几种情况:数组中的对象,使用结束后要把对应的未知的引用设置为null;注意缓存对象的存活时间;注意listener和callback的添加和移除;...原创 2021-12-16 18:10:43 · 1922 阅读 · 0 评论 -
Effective Java 案例分享(一)
考虑使用静态生产方法替代构造方法如果某一个类拥有多个构造方法,且参数各不相同,使用静态的生产方法替代构造方法的好处:过多的构造方法增加了使用者对于类的理解成本,并且很容易产生误解;静态生产方法拥有自己的方法名,可以进一步描述该方法的使用场景和参数意义;静态生产方法封装了内部的实现,便于扩展。例如实现内部的单例,缓存,子类,匿名类,简单工厂等等;缺点:如果构造方法是私有的,仅仅使用静态生产方法,子类不能继承构造方法;如果使用静态方法,需要使用者首先了解静态生产方法的存在,并在所有的静态方法原创 2021-11-19 10:38:31 · 1866 阅读 · 0 评论 -
Handler的使用陷阱
前言沈阳刚刚入职,最近在阅读之前同事的代码,因为他的架构设计中使用了大量的Handler模型,所以再次总结一下Handler的使用问题,这也面试的常见问题之一。正文问题一:构建Handler异常Handler与Looper,MessageQueue协作,是Android线程切换的主要手段之一,官方推荐开发者自己指定Handler的执行线程,如果你使用的Handler构造函数是无参构造方法:标记有删除线的方法,表示该方法已经废弃,如果在开发中遇到了这样的方法一定要了解具体api废弃的原因,这样可以原创 2021-09-17 16:00:23 · 437 阅读 · 0 评论 -
Java泛型与Kotlin泛型
正文本文主要列举Java泛型与Kotlin泛型的基本知识,以及两者的区别。什么泛型泛型程序设计是程序设计的一种风格或或规范。简单的说就是该类型可变,在编写代码时可以根据情况设置不同的类型。因为泛型的可变性,很容易出现类型转换异常,Java与Kotlin在编译期间提供了泛型检测,帮助开发者在编译期间就能尽量避免此异常的出现。Java泛型的基本知识Java泛型主要用在类,接口,类方法。泛型仅在编译期间有效,编译完成后擦除泛型标记。// 类class ObjectA<T>{}// 接口原创 2021-04-08 18:17:56 · 790 阅读 · 0 评论 -
常用Java线程同步工具类
本篇简单介绍Android以及Java提供了的数据并发类。原创 2021-02-24 18:03:05 · 338 阅读 · 0 评论 -
如何加载一张图片到ImageVIew(Google官方推荐 + 协程)
前言无论是刚刚加入Android的新人还是工作n年的老码农,如何加载一张图片到ImageView,都能轻松搞定。随着Glide的发布,我已经很久没有写过相关的代码了,最近复习了一下Glide的源码,偶然查看了Google官方的Bitmap管理文档,才发现里面大有文章。本篇主要以Google官方文档Bitmap的推荐用法作为基础,手撸一个Demo。正文首先,我从网上找到了一张比较大的图片,尺寸为:3024*3024:把文件命名为cat放入drawable文件夹,然后使用ImageView.setI原创 2020-12-24 18:18:43 · 1291 阅读 · 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 · 441 阅读 · 0 评论 -
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 · 1272 阅读 · 0 评论 -
Java虚拟机内存知识整理
前言本篇文章整理一下书中Java虚拟机内存的相关知识。书名:深入理解Java虚拟机。正文运行时数据区域程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。为了线程切换后能回复到正确的执行位置,每条线程都有一条独立的程序计数器,各条线程之间互不影响,独立存储,我们称这类内存区域为线程私有内存。如果线程正在执行的是一个Java方法,这个计数器记录的是正在小hiing的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空。此内存区域是唯一原创 2020-08-14 15:49:02 · 250 阅读 · 0 评论 -
ZEditText:自定义密码输入框
前言心情非常沉重,仅以此篇文章纪念我摔碎的手机屏幕偶然看到一篇文章,讲解了自定义密码输入框,直接上图:很多的App都有这样的功能,一般实现这种输入框有以下几种方案:实实在在的写了5个EditText,然后各种焦点切换逻辑,哪怕增多或者减少一个输入框,都要改很多东西,最不推荐的一种方法;隐藏一个EditText,把输入的内容显示在可见的TextView上,相对于第一种做法肯定是高级了很多;继承EditText,修改onDraw绘制边框以及文字;我看到的文章,讲解的是第三种做法,他直接继原创 2020-08-10 17:47:55 · 696 阅读 · 0 评论 -
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 · 984 阅读 · 0 评论 -
SlidingScaleTabLayout(3):解决文字动画需要重写PagerAdapter.getItemPosition()的问题
前言自从SlidingScaleTabLayout发布以后,收到的最多的反馈:1、为什么文字切换没有效果?大部分都是PagerAdapter.getItemPosition()的重写问题,虽然demo里有个例子,但是很明显没有达到我当初的预期。重写PagerAdapter.getItemPosition()是一个很不优雅的方案,增多了使用者的开发成本,并且很容易出错,我也一直在找解决方案,终于在上周发了1.2.x版本。正文解决方案来源于我的同事,在之前的开发任务中,我们的app也加入了Tab原创 2020-07-27 11:45:09 · 829 阅读 · 0 评论 -
DSL实战:仿Flutter代码布局实战
前言我的第一份IT工作是Web前端,转眼已过去8年,之前在学习Flutter的时候情不自禁想起了当年苦逼的div生活,之后还略微研究了一下JetPack Compose。这两个库都是代码实现GUI,关于JetPack Compose的用法一直颇有争议,有人说在Android上,使用代码布局是技术的倒退,这一点我有一些自己的看法:Android把布局和代码分离,必须说非常有眼光,相比其他平台,例如ios,Android开发者非常幸福。由于开发者对于App的性能要求越来越苛刻,使用XML布局,每次都需要原创 2020-07-23 18:06:15 · 753 阅读 · 0 评论 -
读书笔记:Kotlin自定义DSL语法
本笔记来自第一行代码第三版第13章,作者郭霖,各大平台均可购买。前言DSL的全称时领域特定语言,它是变成语言赋予开发者的一种特殊能力,通过它我们可以编写出一些看似脱离其原始语法结构的代码,从而构建出一种专有的语法结构。在日常开发中,我们使用DSL语言主要在gradle文件中:dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains..原创 2020-07-23 14:20:12 · 824 阅读 · 0 评论 -
读书笔记:WorkManager的使用
本笔记来自第一行代码第三版第13章,作者郭霖,各大平台均可购买。前言WorkManger为了解决开发者需要在后台执行一些耗时性或周期性的独立的任务。WorkManger不属于Android的四大组件,是独立的任务,在应用退出时,仍然可能会执行。正文总结...原创 2020-07-22 12:15:57 · 719 阅读 · 0 评论 -
常见 Android 代码兼容性问题及解决方案
前言感谢大家对这篇文章的支持,我们将深入研究安卓中常见的兼容性问题的原因以及解决方案,主要目录如下:如何回调 Fragment 的 onActivityResult()方法;监听 ScrollView 滑动底部的兼容问题;WebView的兼容问题Android 5.0 监听网络;Android 7.0 文件共享;Android 8.0 安装 Apk;Android 8.0 发送通...原创 2020-01-13 11:58:06 · 3702 阅读 · 0 评论 -
MotionLayout:一个可以直接写动画的ConstraintLayout
前言前几天在逛公众号的时候偶然看到了关于MotionLayout的文章,效果确实非常的神奇,所以在网上查看了相关的资料,可能是比较新的东西,所以资料上介绍的并不是很全,就自己尝试了一下,写一个笔记记录一下心得。本文是为了快速入门,所以不会介绍的很详细,需要详细了解的可以去看看网上的其他资料。正文MotionLayout是ConstraintLayout的子类,ConstraintLayout...原创 2019-11-28 18:46:06 · 983 阅读 · 0 评论 -
仿win8菜单的按下缩小抬起恢复大小的效果
最近工作不是很忙,一直在看跟技术有关的各种资料,丰富一下自己的知识,提高一下自己的水平,今天上了一下csdn看郭霖老师(移动开发博客专家)的博客,发现哎呀妈呀,换了头像,虽然看博客知道郭霖老师要结婚了,但是换头像高调秀恩爱还是给了我一个惊喜,看着漂亮的新娘子,想起了郭冬临的一句话:他那么磕碜,怎么就看上他了呢…当然这是开玩笑,看了郭霖老师的博客两年了,心里还是很有感触的,所以忍不住把郭霖老师和张鸿洋原创 2016-03-23 18:47:20 · 655 阅读 · 0 评论 -
ListView 使用多布局的方法和简单的原理分析
很多时候我们需要用到一个listview使用多个布局的情况,例如聊天的界面 这是从网上下载的图片,仅供参考。实现:下面来分析一下如何实现图中的效果:如果要滑动的话,可以使用scrollView或者是listview, 但是scrollView 对于内存上无法实现view的复用,所以说不是一个好的方案。使用listview就要使用多个布局文件,这个在android在baseadapter中已经为我们原创 2016-03-26 15:44:59 · 676 阅读 · 0 评论 -
Fragment专辑(二):Fragment的简单用法
在上一篇中简单介绍了Fragment,现在来一个简单的用法用法Fragment需要与FrameLayout结合使用,FrameLayout起到了容器的作用。首先我们要在布局中使用FrameLayout,设置相应宽高等属性,它就是我们要添加内容的容器,如下面的代码<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="ht原创 2016-04-10 15:41:50 · 834 阅读 · 0 评论 -
Fragment专辑(一):Fragment简介
Fragment是android中非常常用的控件之一,他可以帮助开发者实现类似于局部刷新的功能,这样与用户的交互更加简单,一个界面可以展示更多更丰富的内容,而且局部刷新可以节省刷新界面的时间和内存消耗,目前几乎所有的app的主界面都是通过Fragment来实现的,说明不仅开发者,连产品君都见识到了Fragm的过人之处。Fragment的生命周期 详细介绍的博客在网上非常的多,所以再写也就没有必要了原创 2016-04-10 15:24:35 · 561 阅读 · 0 评论 -
Fragment专辑(三):Fragment的添加(add)和替换(replace)的不同
所有的文章都是自己的经验和总结,如果有错误的地方欢迎留言指正,以免影响其他的少年。上一篇有提到一个知识点:transaction.commit();transaction.commitAllowingStateLoss();先提前说明:两者都可以提交fragment的操作,唯一的不同是第二种方法,允许丢失一些界面的状态和信息,几乎所有的开发者都遇到过这样的错误:无法在activity调用了onSa原创 2016-04-11 19:03:35 · 15221 阅读 · 0 评论 -
Fragment专辑(四):Fragment的常用写法
所有的文章都是自己的经验和总结,如果有错误的地方欢迎留言指正,以免影响其他的少年。今天是Fragment专辑的最后一篇,说明一下最常用的写法:一般通过add、show、hide相结合的方法来控制Fragment的显示和隐藏,上一篇已经说过,这样不会再重写一遍Fragment的生命周期,节省了时间和内存,当然特殊需求除外。贴出代码:package com.example.lzp;import andr原创 2016-04-19 17:48:00 · 2486 阅读 · 0 评论 -
Android实现定时器的几种方法
前言这几天正在看Android官方的开发文档,里面有很多很值得思考的开发建议,有时间的朋友可以去看一下(官方是英文文档,如果看不懂可以通过浏览器插件翻译对比着看,还是很方便的)。其中一篇课程提到了AlarmManager,这个类之前仅仅是了解这是一个闹钟的管理器,如果要是做一些胜过提醒、闹钟之类的软件都需要用到。官方的例子用来实现定时器,突然觉得这是一个很神奇的事情,就搜集了一些资料,把我知道的实现原创 2016-08-04 18:23:14 · 47973 阅读 · 1 评论 -
自定义九宫格解锁控件
前言九宫格手势解锁已经是非常常见的手机解锁方式,支付宝等一些软件也都曾经使用过,感觉还是很高大上的。在github已经有很好的开源控件,大家可以去自己搜索,我自己写了一个自定义的九宫格控件,作为练习作业。效果图我不会做动图,就凑合看吧…… 先贴自定义属性代码 <!-- 九宫格解锁--> <declare-styleable name="DrawPointLineUnlockView">原创 2016-11-18 20:34:22 · 827 阅读 · 0 评论 -
DataBinding 学习系列(5)细节上的概念强化和扩展
前言之前已经把大部分的应用都已经介绍了,现在就把一些在概念上和应用上的细节再恶补一下。正文Lambda 表达式之前我们在xml中已经掌握了如果使用variable的对象中的方法:<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClic原创 2017-02-28 11:37:01 · 693 阅读 · 0 评论 -
Charles + Mocky 抓包工具与模拟返回数据的利器(mac版)
前言之前和后端的工程师配合的时候,接口偶尔会出现接口问题导致数据显示失败,而前端断点调试也看不到什么有价值的信息,这个时候后端工程师发话了,“你抓个包给我看看”,搞得我一脸懵逼。作为一个有理想有抱负的工程师,这么low 的场面一定要hold住。如果你也曾经遇到跟我一样的情况,希望你能看看这篇博客,相信对你能够有所帮助。Charles 抓包工具因为我这的网从官方下载的速度很慢,所以是从其他网上下载的,原创 2017-02-14 12:17:36 · 3811 阅读 · 0 评论 -
定时任务Alarm的深入理解
前言之前写过了一遍关于定时任务的文章,这次看了郭神的新书《第一行代码》第二版,写的非常的好,于是把其中一段关于Alarm的介绍整理分享给大家,觉得写的好同志们请去购买正版支持一下。正文Android 中的定时任务一般有两种实现方式,一种是Timer类,一种是使用Android的Alarm机制。这两种方式在多数情况下都能实现类似的效果,但是Timer有一个明显的短板,它并不适合用于那些需要长期在后台运转载 2017-02-14 15:41:15 · 1279 阅读 · 0 评论 -
DataBinding 学习系列(2)详解DataBinding在xml中的使用
前言上一篇简单的介绍了DataBinding的用法,这几篇来仔细的介绍一下的功能。data 标签 的功能<data class="test"></data>class 属性生成指定的名称的Binding对象。什么是Bind对象呢?来回顾之前的一句代码ViewDataBinding mBinder = DataBindingUtil.setContentView(this, R.layout.acti原创 2017-02-17 18:09:47 · 7880 阅读 · 0 评论 -
DataBinding 学习系列(1)基础知识的了解和使用
介绍DataBinding,2015年IO大会介绍的一个框架,是Google对MVVM在Android上的一种实现,可以直接数据绑定到xml中,并实现自动刷新。好处:去掉了大部分的UI相关代码(比如findViewById、 setOnClickListener、setText等)xml变成UI的唯一真实来源,数据绑定也直接发生在xml(更多可以在网上查询)配置网上有很多是以前的资料,现在基本上都是原创 2017-02-15 16:08:06 · 1060 阅读 · 0 评论 -
DataBinding 学习系列(3)新增的可见字段来编写对象(bean)
前言之前主要都是在讲DataBinding在xml中的使用,基本上满足了大部分的需求了,但是不能放下前进的脚步,了解和使用DataBinding中的可见字段,绝对是一件锦上添花的事情。实战首先来看一下之前的User代码/** * Created by li.zhipeng on 2017/2/10. * * 测试用的User类 */public class User { pr原创 2017-02-20 18:33:49 · 686 阅读 · 0 评论 -
DataBinding 学习系列(4)DataBinding的高级功能
前言前几篇已经DataBinding的基础用法已经介绍的差不多了,所以接下来感受一下DataBinding强大的高级功能。正文DataBinding可以通过注解,实现很多强大的功能,并且十分的方便,能够帮助我们省去大量的对xml进行操作的代码,例如加载图片,字符串处理等等操作。@BindingConversion 自定义类型转换<ImageView android:layout_width原创 2017-02-23 14:52:11 · 8943 阅读 · 1 评论