![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
安卓
文章平均质量分 79
Android Han
这个作者很懒,什么都没留下…
展开
-
一篇理解 OkHttp 源码实现原理 -- 简述
首先来看一个最简单的Http请求是如何发送的。.build()})这段代码看起来比较简单,OkHttp请求过程中最少只需要接触RequestCallResponse,但是框架内部会进行大量的逻辑处理。所有网络请求的逻辑大部分集中在拦截器中,但是在进入拦截器之前还需要依靠分发器来调配请求任务。关于分发器与拦截器,我们在这里先简单介绍下,后续会有更加详细的讲解分发器:内部维护队列与线程池,完成请求调配;拦截器:五大默认拦截器完成整个请求过程。整个网络请求过程大致如上所示通过建造者模式构建与。转载 2023-09-07 11:50:20 · 228 阅读 · 0 评论 -
Kotlin 内联函数 inline 解答 (节省内存开销)
Kotlin 内联函数 inline转载 2023-07-15 15:52:15 · 472 阅读 · 0 评论 -
RxJava2 + Retrofit2 处理data为null的情况
"data": null, "message": null},客户端就会抛出类型转换异常,原因是框架的封装是通过rxjava将。,其实思路一样只是将BaseResponse,改成了Optional,我觉得没什么必要引入新的类。结果,就会导致客户端crash了,因为网络请求我们传的泛型是数据bean,这就是导致类型转换异。是为了减少逻辑的判断,但是这样做,如果和服务端没有约定好,服务端返回null或者其他类型的。代码就不贴了,解决方式按照这个思路处理即可。想参考代码可以看下这个。原创 2022-12-02 10:04:19 · 1307 阅读 · 1 评论 -
NTFS, FAT32和exFAT文件系统有什么区别
当用户在Windows平台上插入新的U盘或移动硬盘时,系统会自动弹出需要格式化的窗口,提供了3种不同文件格式:NTFS,FAT32,exFAT。很多用户对这3种格式知之甚少,只是根据弹窗的指示进行操作,Windows也没有对3种格式提供详细的解释。本文会对这些问题进行详细解释:首先需要明白什么是文件系统。文件系统是系统对文件的存放排列方式,不同格式的文件系统关系到数据是如何在磁盘进行存储,文件名、文件权限和其他属性也存在不同。Windows操作系统支持 NTFS, FAT32, and ex..原创 2021-11-09 11:24:08 · 11162 阅读 · 0 评论 -
Android RecyclerView 根据屏幕宽度动态调整列
当我们的应用窗口是可以拖动调整宽度的时候,网格列表下,想根据屏幕宽度动态调整网格列数,就需要对RecyclerView进行动态计算GridColumnCount并进行设置。这里就需要对RecyclerView进行自定义,我们直接看代码:public class GridLayoutRecyclerView extends RecyclerView{ private int mWidth; private int mGridItemWidth; private int mGrid原创 2021-09-07 10:55:35 · 1781 阅读 · 0 评论 -
Android handler 同步屏障简要说明
同步屏障:发送异步消息的关键就是要消息开启一个同步屏障。屏障的意思即为阻碍,顾名思义,同步屏障就是阻碍同步消息,只让异步消息通过。如上图所示,在消息队列中有同步消息和异步消息(黄色部分)以及一道墙----同步屏障(红色部分)。有了同步屏障的存在,msg_2 和 msg_M 这两个异步消息可以被优先处理,而后面的 msg_3 等同步消息则不会被处理。那么这些同步消息什么时候可以被处理呢?那就需要先移除这个同步屏障举个栗子:开演唱会的时候,观众们需要在体育馆门口排队依次检票入场(..原创 2021-09-06 11:44:39 · 362 阅读 · 0 评论 -
Android 面试---跳台阶的问题解析
问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级,求,该青蛙跳上一个N级台阶总共有多少种跳法?分析:1级台阶的跳法显然只有一种,2级台阶有两种,对于3级台阶以上N级,可以看成 n 的函数,记为 f(n),当 n> 2 时,如果第一次跳 1级,此时跳法总数等于后续 n-1 级台阶的跳法数目,记为 f(n-1),如果第一次跳2级,此时跳法总数等于后续 n-2 级台阶的跳法数目,记为 f(n-2)。所以 总数目即为 f(n)=f(n-1)+f(n-2),根据这种思路,容易写出算法如下: ..原创 2021-09-02 20:55:40 · 316 阅读 · 0 评论 -
Android数据结构队列与栈
对于队列稍有耳闻的同学肯定会知道它有一个特点:先进先出。正是这个特点使得队列在处理一些对于顺序要求很高的需求时有很好的效果,就像网络请求的排序,队列大概是这样的:上图可以队列是一个很明显的先进先出的结构,中间的元素是不允许修改的。java中使用Queue来描述队列,它里面有一系列方法:- offer方法,向队列尾部入列一个元素;- poll方法,把队列的第一个元素出列;- peek方法,查看队列的第一个元素,但是不出列。除了上面3个方法,其实还有3个方法:add,remove,e.原创 2021-09-02 20:50:01 · 1024 阅读 · 0 评论 -
Android R 如何访问Android/data目录
前言Android R上分区存储的限制得到进一步加强,无论APP的targetsdkversion是多少,都将无法访问Android/data和Android/obb这二个应用私有目录。这无疑对会部分APP的业务场景及用户体验造成冲击,典型的如下文件管理类软件:微信、QQ传输的文件无法展示给用户以便捷使用 垃圾清理类软件:清理缓存功能受阻“你有你的张良计,我有我的过墙梯”,现市面上文件管理类软件(如MT管理器)已解决上述系统限制,本文将浅析其实现方案,并主要分析以下2个问题:SAF是通过何种翻译 2021-09-02 20:31:17 · 14213 阅读 · 0 评论 -
Android 10(Q)/11(R) 分区存储适配
首先说明下:如果想在Android 11 上访问Android data目录文件需要使用DocumentFile相关来进行授权访问,java.File类已没有权限访问,因为Android 11 引入的Fuse文件系统做了隔离Android 访问data目录大部分应用都会请求 ( READ_EXTERNAL_STORAGE ) ( WRITE_EXTERNAL_STORAGE ) 存储权限,来做一些诸如在 SD 卡中存储文件或者读取多媒体文件等常规操作。这些应用可能会在磁盘中存储大量文件,即使应用被卸转载 2021-08-31 12:40:52 · 959 阅读 · 0 评论 -
Android 11 引发的IO 性能下降问题分析 SDCardFS Vs FUSE
Sdcard vs External storage在Android手机的早期,几乎所有设备都依赖于使用microSD卡进行存储。这是由于当时的手机出厂时内部存储容量很小。但是,至少与内部闪存可以读取/写入数据的速度相比,用于存储应用程序的SD卡通常无法提供出色的用户体验。因此,越来越多地将SD卡用于外部数据存储,由于SD卡作为外部存储设备的泛滥,Android的存储命名约定基于以下事实:每个设备都有一个实际的物理microSD卡插槽。但是,即使在不包含SD卡插槽的设备上,/ sdcard标签仍..转载 2021-08-31 11:31:15 · 4518 阅读 · 0 评论 -
Android单元测试框架介绍 -- 调研篇
查阅了关于Android单元测试的一些资料后,发现网上对于现有的单元测试框架说法褒贬不一,各有优缺点,在框架的选择上也是需要很多因素来决定,因此我总结了一下最近的调研,对现有的单元测试框架做下简单介绍,列举下各个框架的优缺点,根据每个框架的优缺点,做下抉择。单元测试一般分两类:本地测试:运行在本地的计算机上,这些测试编译之后可以直接运行在本地的Java虚拟机上(JVM)。可以最大限度的缩短执行的时间。如果测试中用到了Android框架中的对象,那么谷歌推荐使用Robolectric来模拟对象。 插原创 2021-08-29 14:46:40 · 1786 阅读 · 0 评论 -
使用 Room 将数据保存到本地数据库
Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备重新连接到网络后,用户发起的所有内容更改都会同步到服务器。由于 Room 负责为您处理这些问题,因此我们强烈建议您使用 Room(而不是 SQLite)。不过,如果您想直接使用 SQLite API,请参阅使用 SQLite 保存数据翻译 2021-08-11 14:44:09 · 656 阅读 · 0 评论 -
ANR常见场景分析策略
定义主线程在特定的时间内没有做完特定的事情常见的场景 A.input事件超过5S没有处理完成 B.service executing 超时(bind,create,start,unbind等等),前台20s,后台200s C.广播处理超时,前台10S,后台60s D.ContentProvider执行超时,20s常见的原因 A.耗时操作,如复杂的layout,庞大的for循环,IO等。 B.被Binder 对端block C.被子线程同步锁b原创 2021-07-15 18:48:51 · 3724 阅读 · 0 评论 -
根据屏幕宽高等比例缩放图片
public static Bitmap resizeBitmap(Bitmap bitmap, int screenWidth ,int screenHeight){ // 获得图片的宽高. int width = bitmap.getWidth(); int height = bitmap.getHeight(); //取得图片和图片所处空间的比例 float scaleBitmap = ((float) bitmap.getWidth()) / bitm...原创 2021-06-27 16:14:44 · 449 阅读 · 1 评论 -
android 多窗口复用方案 documentLaunchMode属性的作用
Let’s take a quick look at the launchMode values:standard and singleTop both allow multiple instances of an activity to be created, within other tasks.singleTask and singleInstance both limit an activity to a single instance, as the first activity in i原创 2021-06-18 19:03:15 · 1015 阅读 · 1 评论 -
adb shell am instrument 命令详解(调试参数传递)
官网关于该命令的详解:点击查看1 Instrument是什么?instrument为am命令的一个子命令。用于启动一个Instrumentation测试。首先连接手机或者模拟器,通过adb shell命令,进入shell层进行操作。2 命令格式及参数解读(来自官网)格式:instrument [options]component目标component是表单test_package/runner_class,在UiAutomator2.0中,目标component为:测试包名/a...原创 2021-03-01 11:28:49 · 3857 阅读 · 0 评论 -
Android自动化测试入门(三)Espresso
Android自动化测试入门(三)EspressoEspresso是谷歌力推的一个UI自动化测试框架,新建一个Andrdoid工程的时候默认就引入了Espresso的核心依赖,所以作为Android开发者,非常有必要学习这个框架。之前使用UI Automator的时候,我们经常在不同的指令之间添加一个时间延时保证手机端执行完成,在Espresso直接使用onView(),onView()会等待界面执行完在执行下一步。Espresso和UI Automator一样,也是在项目的app/src/翻译 2021-01-21 21:31:18 · 422 阅读 · 0 评论 -
Android自动化测试入门(二)UI Automator
Android自动化测试入门(二)UI AutomatorUI Automator是一个界面测试框架,支持跨进程,几乎可以模拟所有的人工操作。需要运行在4.3或者更高的系统版本上。它的测试代码的编写不依赖于目标应用的内部实现细节,非常适用编写黑盒自动化测试。UI Automator 测试框架的主要功能包括:uiautomatorviewer: 用来扫描和分析当前设备的当前页面的布局结构,它是sdk中自带的工具位置在sdk/tools/bin/uiautomatorviewer.bat U.翻译 2021-01-21 21:21:21 · 385 阅读 · 1 评论 -
Android自动化测试入门(四)单元测试
Android自动化测试入门(四)单元测试单元测试一般分两类:本地测试:运行在本地的计算机上,这些测试编译之后可以直接运行在本地的Java虚拟机上(JVM)。可以最大限度的缩短执行的时间。如果测试中用到了Android框架中的对象,那么谷歌推荐使用Robolectric来模拟对象。 插桩测试:在Android设备或者模拟器上运行的测试,这些测试可以访问插桩测试信息,比如被测设备的Context,使用此方法可以运行具有复杂Android依赖的单元测试。前两篇中的Espresso 和 UI Aut翻译 2021-01-21 20:57:00 · 415 阅读 · 0 评论 -
AndroidQ 运行时报java.lang.NoClassDefFoundError:Animator.AnimatorListener$-CC
报此错误是因为Android 在29引入了default 方法,需要重写Animator.AnimatorListener 默认实现对应的生命周期即可,public class AnimatorListenerImpl implements Animator.AnimatorListener { @Override public void onAnimationStart(Animator animation, boolean isReverse) { this.on原创 2020-12-28 11:13:00 · 535 阅读 · 1 评论 -
AndroidQ 运行时报java.lang.NoClassDefFoundError:Application$ActivityLifecycleCallbacks$-CC
报此错误是因为Android 在29引入了default 方法,需要重写ActivityLifecycleCallbacks 默认实现对应的生命周期即可,abstract void onActivityCreated(Activity activity, Bundle savedInstanceState)Called when the Activity calls Activity#onCreate.abstract void onActivityDestroyed(Activity a.原创 2020-12-28 11:08:45 · 926 阅读 · 0 评论 -
为System.exit添加回调-监听用户杀进程
在app中调用System.exit(0)时,当前activity的onDestroy()方法没有被调用,现在为System.exit(0)方法添加一个回调。为System.exit添加回调System.exit(int): 123 public static void exit(int status) { Runtime.getRuntime().exit(status);} Runtime#exit(int)...原创 2020-12-10 14:18:36 · 515 阅读 · 0 评论 -
代码修改RecyclerView的scrollbar颜色
因为scrollbar是view的私有内部类,所以需要动态修改RecyclerView的scrollbar颜色,只能通过反射获取scrollbar的drawable,然后用反射着色,亲测可用,代码直接粘贴就可使用。import android.content.Context;import android.content.res.ColorStateList;import android.graphics.Color;import android.graphics.drawable.Drawa.原创 2020-09-02 19:51:18 · 1327 阅读 · 0 评论 -
android复制文件、文件夹,使用FileChannel带进度条
FileChannel管道流复制文件是基于nio的传输方式。速度上有30%的提升。其次在我的项目中使用传统FileOutputStream方式,在复制大文件时。进度打印出现迟滞。综合这两点选择使用FileChannel方案。本文章是简单使用多线程方式实现,个人测试文件读写在多线程下比单线程快4倍,有参考的小伙伴使用的话 还是最好使用线程池进行处理性能上的优化。public class CopyPasteUtil { private static long dirSize = 0;// 文件夹原创 2020-09-01 21:58:15 · 2181 阅读 · 6 评论 -
RecyclerView 的 scrollbar 和 ItemDecoration 的绘制和遮挡问题
前言RecyclerView 是自带 scrollbar 的, 可自定义设置它的展示与方向还有属性「scrollbarStyle」。RecyclerView 的 ItemDecoration 很方便,可以为每个 item 之间添加分割线, 那么分割线的绘制是怎么绘制的呢?与 item view 的绘制顺序是什么样的呢?以下内容分为三部分:scrollbar 的属性 scrollbarStyle ItemDecoration 自定义分割线的注意事项和绘制顺序 两者之间可能产生的问题1.转载 2020-09-01 21:43:47 · 1161 阅读 · 0 评论 -
Android .9图编译时遇到的问题(com.android.builder.internal.appt.v2.Aapt2Exception:AAPT2 error:check logs for )
一.前言今天做闪屏页面,页面的图片设置的background,不同设备的手机会有所拉伸,图片又不能剪裁,只能做成.9图。.9图的制作1.把四个边预留好的一像素透明区域的png图片后缀改成.9.png,放入到Android studio 对应的图片包下2.点击查看图片,切换9-Path 查看 ,并制作3.现在来说一下.9图四个边的意义右下-文字的放置区域左上-图片的拉伸区域告诉大家一个记住的小窍门, 顺时针“右下放,左上伸”。所以就这个图而言它的四个角不会拉伸,文字.原创 2020-06-18 20:22:03 · 618 阅读 · 0 评论 -
万能fragment通信
万能fragment通信Fragment 通信原则两个fragment不应该直接通信(two fragments should never communicate directly)常见的通信1. eventBus rxBus优点:方便,快捷,简单缺陷:反射,性能打折扣,效率低 代码难维护 数据无法返回,单项传递2.handler缺点:耦合 无法...转载 2020-03-29 17:38:59 · 175 阅读 · 0 评论 -
2019个人面试问题总结
1.java中error和exception的区别Error类和Exception类的父类都是throwable类,他们的区别是:Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类...原创 2019-12-12 14:46:06 · 325 阅读 · 2 评论 -
进程和线程的区别
阐释:1)进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。一个进程内可拥有多个线程,进程可开启进程,也可开启线程。一个线程只能属于一个进程,线程可直接使用同进程的资源,线程依赖于进程而存在。2)线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程...原创 2019-11-26 16:45:53 · 691 阅读 · 0 评论 -
Android 开发常见内存泄漏指南
我们都知道,写一个 Android 的应用很容易,但是要写一个高性能的应用可就不容易了。以我的个人经验来说,在 App 的开发过程中,主要的精力都会放在新功能、新模块、新组件的开发上。开发过程中,看得见的 UI 比看不见的性能更能吸引我们的目光。所以我强制自己将“优化应用程序(如内存泄漏)”的优先级提高,并养成习惯。长期以来,不关注性能,带来了很多的技术债。经过一年多的努力调整, 比起一年...原创 2019-11-06 10:30:01 · 155 阅读 · 0 评论 -
记录一些好的文章链接分享给大家
本篇文章是记录本人在看博客时看到一些不错的文章:会陆续更新好的文章地址链接给大家分享。java篇:准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?链接地址:https://juejin.im/post/5db92860e51d4529ee588406深入理解 Handler 消息机制链接地址:https://juejin.im/post/5d712cedf2...原创 2019-11-04 17:04:37 · 753 阅读 · 0 评论 -
Handler的工作原理,在子线程中可以new Handler()吗?
Handler的工作主要包含消息的发送和接受过程。发送过程通过post的一系列方法和send的一系列方法来实现,post的一系列方法最终是通过send的一系列方法来实现的。发送一条消息的典型过程如下:public final boolean sendMessage(Message msg){ return sendMessageDelayed(msg, 0);...原创 2019-10-29 15:03:34 · 935 阅读 · 0 评论 -
Fragment中的onActivityResult问题
大家或许有遇到这个神坑,在Fragment中使用startActivityForResult能够成功,可是在Fragment中的onActivityResult却无法被调用。一不注意就让人一夜愁白了头。苦经探索(当然包括亲爱的百度和谷歌),终于总结出了一些规律。在Fragment中使用startActivityForResult之后,onActivityResult的调用是从activi...原创 2019-10-15 11:33:07 · 537 阅读 · 0 评论 -
Android事件分发机制(View 的绘制流程,单元测试链接)
Android View 的绘制流程链接:https://www.jianshu.com/p/c151efe22d0dAndroid事件分发机制详解:史上最全面、最易懂链接:https://www.jianshu.com/p/38015afcdb58从面试角度聊Android事件分发机制链接:https://www.jianshu.com/p/dc6fabc32996...原创 2019-10-14 19:57:30 · 185 阅读 · 0 评论 -
Activity Fragment生命周期--页面切换
Fragment与Fragment相互切换之间的生命周期方法Activity横竖屏切换生命周期也可以参考这篇文章首先,写一写关于Fragment生命周期的相关。先放上一张老图!!Fragment 1 切换到 Fragment 2时生命周期变化1、通过 add hide show 方式来切换 FragmentFragment 2再切换到 Fragment ...原创 2019-10-14 16:36:41 · 461 阅读 · 0 评论 -
安卓性能优化、常见内存泄漏
一 View的优化1) 降低View树的高度,即减少View的层级嵌套,使用RelativeLayout替代LinearLayout。2) 使用include或者merge标签,将布局包含进来。3) 使用ViewStub,一些布局文件在正常情况下不会显示出来,可以使用ViewStub使其在使用时在加载。4) 不要在onDraw()等类似绘制函数中执行大量操作或者相对耗时的任务...原创 2019-10-12 01:18:59 · 135 阅读 · 0 评论 -
RxJava 详解
安卓最新异步rxjava转载 2016-12-15 16:12:01 · 319 阅读 · 0 评论 -
关于 RxJava 最友好的文章—— RxJava 2.0 全新来袭
谈谈RxJava2.0的新特性转载 2016-12-19 15:58:13 · 803 阅读 · 0 评论 -
50个安卓开发者应该熟悉的Android Studio技巧和资源
本文列举出一些可以提高整体效率的Android Studio技巧和资源。转载 2016-12-28 11:47:54 · 508 阅读 · 0 评论