Android
文章平均质量分 81
Harold Gao
这个作者很懒,什么都没留下…
展开
-
Android 接口的default 方法运行时报错AbstractMethodError
记录一个Android项目中遇到的问题,我们通过exclude方式重写了一个依赖,改用本地的实现,其中一个接口的default 方法,在运行时报错:AbstractMethodError,也就是没有找到这个default的实现。原创 2022-12-04 22:53:37 · 1207 阅读 · 0 评论 -
WebView输入框软键盘遮挡问题(沉浸状态栏和adjustResize的冲突)
WebView为什么没有在软键盘弹出时更新布局,是由于沉浸状态栏和adjustResize的冲突。手动处理软键盘更新布局,需要考虑到底部虚拟按键的高度。原创 2022-11-13 11:34:13 · 2093 阅读 · 0 评论 -
Android Jacoco多模块单元测试覆盖率
使用Jacoco,统计多模块Android项目中,单元测试的覆盖率原创 2022-07-21 10:12:29 · 1161 阅读 · 0 评论 -
Glide如何从File中解析出Gif图片
Glide 是如何从 ByteBuffer 解析出 Gif 动图的,并如何实现 Gif 动画循环♻️。原创 2021-06-18 12:11:03 · 483 阅读 · 1 评论 -
Android基础|AIDL 中的方向标签 inout 一句话总结
代表数据流向。out 类比 `List#toArray(T[])` 来理解,inout 类比 `Arrays#sort(T[])` 来理解。原创 2021-06-17 16:46:39 · 377 阅读 · 0 评论 -
Glide从磁盘加载图片资源的流程
Glide 从磁盘中加载图片的过程。涉及到如何从网络加载图片,和写入 DATA 磁盘缓存、RESOURCE 磁盘缓存、ActiveResources 缓存的时机,以及如何从 ModelLoaderRegistry 中获取 ModelLoader。原创 2021-06-16 21:58:13 · 747 阅读 · 0 评论 -
跟着Glide学习缓存设计
Glide 是一个开源图片加载库,使用了多种缓存来优化图片加载:Bitmap缓存池、活动资源缓存、内存缓存和磁盘缓存。那么它们的需求和实现有何不同呢?原创 2021-06-15 11:24:15 · 125 阅读 · 0 评论 -
通过反编译字节码看懂 Kotlin suspend 函数
Idea 自带的 kotlin bytecode 反编译惨不忍睹,难以看懂。还是结合 javap 直接阅读 JVM 指令的逻辑,更容易理解魔法背后是如何实现的。本文仅提供一个 suspend 函数反编译的示例,供学习之用,不足以完全理解 Kotlin 协程。原创 2021-05-28 13:44:44 · 641 阅读 · 0 评论 -
Java String如何保存字符串
本文基于 String 源码进行剖析,涉及到字符编码的知识参考自 Unicode Tutorials - Herong’s Tutorial Examples,英文资料讲解的非常详细,建议大家都读一下。String 真的是 Immutable 的吗Java 中的 Unicode 字符串会按照 Latin1(所有的字符都小于 0xFF 时)或者 UTF16 的编码格式保存在 String 中,保存为 byte 数组:private final byte[] value;通常所说的 Immutab.原创 2021-05-12 16:42:01 · 966 阅读 · 0 评论 -
LiveData 单元测试
本文参考自 Unit-testing LiveData and other common observability problems参考 Google 代码官方测试代码 here单元测试时,LiveData.value 返回 null @Test @Throws(Exception::class) fun testLiveDataFail() = runBlocking { meditationDao.insert(MeditationTrip()) .原创 2021-04-29 22:42:40 · 882 阅读 · 1 评论 -
Android工程师学习资源推荐
Android新人入门第一书,郭神的公众号依然每个工作日都在更新:第一行代码(第3版)JavaJava 和 Kotlin 都是基于 JVM 虚拟机,学习 class 字节码结构,了解 Java 内存模型,了解 JVM 的锁优化,GC 算法,基于 JDK 13技术预览版(2019年中期):深入理解Java虚拟机(第3版)Java 并发最经典的书,出版了十几年,基于 JDK 1.6,由 concurrent 包作者们编写,2021 年读起来仍然非常受用:Java并发编程实战Kotlin只是跟原创 2021-04-12 16:22:22 · 134 阅读 · 0 评论 -
Android中如何获取系统服务
context.getSystemService 如何获取系统服务?ServiceManger 如何获取系统服务?LocalServices 用在哪里?原创 2020-12-30 10:00:01 · 2372 阅读 · 0 评论 -
Android内存泄漏核查(2020-11-25修改)
内存泄露是指,由于调用栈中持有对象的强引用,使得垃圾回收器无法回收内存中的这个对象。文章目录一、8 种内存泄露核查二、Android 中的6种内存泄漏场景1 资源2 Handler3 Thread4 Context5 集合6 非静态内部类三、检测内存泄漏dumpsysProfile使用 LeakCamary 自动检测APP中的内存泄露P.S. 推荐阅读一、8 种内存泄露核查8 种内存泄露的 Demo:https://github.com/NimbleDroid/Memory-Leaks全局进程的原创 2020-11-25 10:49:33 · 553 阅读 · 0 评论 -
TextView显示长文本
TextView中显示长文本的几种方案。包括水平跑马灯,和垂直滚动条。原创 2019-12-15 13:08:17 · 1112 阅读 · 0 评论 -
Android添加广播权限限制
发送广播时,除了通过 Action 筛选 Receiver,还可以限制只有具有某种权限的应用才能接收。接收广播接时,除了通过 Action 筛选广播,还可以限制只接收具有某种权限的应用发送的广播。原创 2019-12-08 11:25:54 · 2473 阅读 · 0 评论 -
RemoteViews使用场景和工作原理
使用RemoteViews 的作用是在其他进程中显示并更新 View 界面。主要用于通知栏和桌面小部件上。1 通知栏的使用我们使用 NotificationCompat.Builder.build() 来创建一个通知,然后调用 NotificationManager.notify() 来显示通知栏,在需要自定义通知栏 UI 时,就需要 RemoteViews 来帮忙了。第一步:...原创 2018-08-07 15:34:26 · 3007 阅读 · 0 评论 -
安卓轮子之Retrofit源码赏析
Retrofit 中 Service 接口的实现对于自定义 Service 类:public interface GithubService { @GET("users/{user}/repos") MyCall<String> listRepos(@Path("user") String user);}使用时:GithubService gi...原创 2018-08-11 19:22:59 · 284 阅读 · 0 评论 -
Android使用系统文件管理器选择文件,并将Uri转换为File
0.README1.利用系统文件管理器选择文件得到Uri码2.Uri转化成File能读取的路径参考文献0.README本文的android代码测试机型为:小米4。首先用系统文件管理器选择文件,获得文件Uri,然后解析Uri得到文件真实路径。 1.利用系统文件管理器选择文件得到Uri码这里借鉴的是CSDN博客里别的大佬的回答(见参考文献...原创 2018-03-09 13:09:51 · 62071 阅读 · 10 评论 -
如何在编辑器中使用正则表达式来替换文本
README匹配邮箱利用“组”来替换代码Greedy 和 Reluctantfind(), lookingAt(), matches()的区别参考文献:README本文讨论了正则表达式的一些应用,由浅入深。 匹配邮箱String mail = "123abcABC_@123abcABC.com.cn.abc.ABC";Str...原创 2018-03-16 17:01:26 · 1235 阅读 · 0 评论 -
JSON格式总结
JSON: JavaScript Object Notation(JavaScript 对象表示法)JSON 是存储和交换文本信息的语法,类似 XMLJSON 比 XML 更小、更快,更易解析1.对象(在{和}之间){ "name":"runoob", "alexa":10000, "site":null }2.嵌套对象(某个属性值为对象时)转载 2018-03-20 16:14:52 · 191 阅读 · 0 评论 -
android启动activity文本框不打开输入法界面
Android开发时,如果一个Activity页面有EditText文本框,在加载这个页面时,会自动打开输入法界面,占去了半个屏幕,很不方便。 因此提供如下方法:在manifests文件中activity属性中添加一行代码: android:windowSoftInputMode="stateHidden" 修改后如下:<activity android:n...原创 2018-03-26 15:39:44 · 1772 阅读 · 0 评论 -
JDK1.8 并发之线程池
线程池优点:1. 重用线程池中的线程,避免线程的创建销毁带来的性能开销。2. 控制线程池的最大并发数。3. 对线程简单管理:如定时执行以及指定间隔循环执行。实现ThreadPoolExecutor方法是线程池的真正实现,下面是它的一个比较常用的构造方法:public ThreadPoolExecutor(int corePoolSize, ...原创 2018-05-14 17:27:35 · 3795 阅读 · 0 评论 -
Android Studio使用aidl实现进程间通信
使用aidl自动生成IBinder接口aild的写法: 1.package 包名; 2.import &lt;任何非默认类型的类,包括同一包下的&gt;; 3.接口中的数据类型只能是:基本数据类型,String和CharSequence,List(ArrayList),Map(HashMap),Parcelable,AIDL若用到自定义的Parcelable类,需要新建同名a...原创 2018-05-14 18:50:54 · 505 阅读 · 0 评论 -
RadioGroup中显示radiobutton之外的其他组件
RadioGroup是一种Layout,它的RadioButton按钮必须是它的直接子控件,这就否定了将RadioButton和其他TextView子类的控件放在单独的Layout下的思路。我采取的办法实际上不是在RadioGroup中直接添加了子控件,而是通过布局的拼凑来实现的。<RelativeLayout android:layout_width="match_...原创 2018-06-04 11:22:47 · 1523 阅读 · 0 评论 -
Android新手必读的RecyclerView使用总结
RecyclerView比ListView要复杂一些,如果总结起来,使用方法也很清晰。希望我的总结能帮助到更多的Andoid爱好者。1.依赖库使用RecylerView需要Google支持库recyclerview-v72.RecylerView作用:回收和定位屏幕上的View,列表项显示数据还是需要另外两个子类的支持:ViewHolder子类和Adapter子类。s...原创 2018-06-11 13:32:07 · 540 阅读 · 0 评论 -
Java中的反射
最近在学习java反射机制,读到了一篇很棒的博客,我的这篇文章是对原文的概括性笔记,总结了这部分知识的学习体系。 1. java.lang.Class获取Class对象知道类名时,编译期加载:Class myObjectClass = MyObject.class通过读取字符串,运行时加载:Class class = Class.forName(&amp;quot;com.jenkov.myapp...原创 2018-06-05 15:10:25 · 212 阅读 · 0 评论 -
Java中类的实例化过程变量的初始化顺序,以及常见笔试程序阅读题分析
类是在任何static成员被访问时加载的(构造器也是static方法)。类的整个加载过程包括加载、验证、准备、解析、初始化5个阶段。我这里只讨论我们在笔试题中比较关心的、影响程序输出的部分。类加载:在准备阶段,static变量在方法区被分配内存,然后内存被初始化零值(注意和static变量初始化的区别)。在初始化阶段,执行类构造器<clinit>()方法(注意和实例构造器<ini...原创 2018-06-06 19:23:25 · 1024 阅读 · 0 评论 -
Android 消息机制
Message Message 是线程之间传递的消息,可以携带少量数据,用于在不同线程之间交换数据。 public 字段 含义 注释 int what 用户定义的消息标记 int arg1 内置可存放的第一个整型数据 int arg2 内置可存放的第二个整型数据 Object obj 内置可存放的一个...原创 2018-07-17 12:54:50 · 176 阅读 · 0 评论 -
OkHttp3 使用详解及网络连接缓存的处理机制
1. 创建 OkHttpClient 对象可以直接新建,也可以用建造者模式建造出来。直接新建时,其实也是使用建造者设置了默认的请求参数。OkHttpClient client = new OkHttpClient();OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(5, TimeUni...原创 2018-07-12 16:38:03 · 3103 阅读 · 0 评论 -
使用 AIDL 实现客户端和服务的进程间通信(IPC)
1. 使用步骤AIDL 的意思是 Android 接口定义语言。利用它来定义进程间通信时双方认可的编程接口。第一步:创建 .aidl 文件AIDL 接口方法中支持的参数类型:8 个基本数据类型StringCharSequenceList:List 中的所有元素必须是以上支持的数据类型、其他 AIDL 生成的接口或自定义的 Parcelable 类型。接收端实际接受的具体类始...原创 2018-08-09 15:20:57 · 1123 阅读 · 0 评论 -
安卓轮子之Retrofit的使用
表单请求1. 普通表单@FormUrlEncoded:表示请求体是一个 Form 表单Content-Type:application/x-www-form-urlencoded采用 @Field 注解:@FormUrlEncoded@POST("login/login")Call&lt;ResponseBody&gt; login(@Field("mail") Str...原创 2018-08-11 19:15:39 · 438 阅读 · 0 评论