![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android拓展
文章平均质量分 80
mayundoyouknow
喜欢运动,爱思考
展开
-
解决ViewPager嵌套RecyclerView,RecyclerView嵌套RecyclerView瀑布流事件冲突问题
1.瀑布流效果2.嵌套滚动效果实现3.嵌套滚动浮动菜单栏3.1嵌套事件链接机制3.2实现上拉刷新,上拉加载更多原创 2021-12-20 19:47:25 · 1814 阅读 · 1 评论 -
Android常用的shape,selector,layer-list使用说明
shape的优势,Android开发中,使用shape可以方便的帮我们画出背景,相对于png图片来说,使用shape可以减少安装包的大小,而且能够更好的适应不同的手机;1.shape(GradientDrawable)shape顾名思义就是形状的意思,我们在平时开发的中,应用的频率也很高,该文件是一个xml文件,并放在drawable文件夹下如res/drawable/filename.xml,那么引用方式也很简单,我们一般在控件的background使用,如android:background=.原创 2021-11-10 19:11:23 · 2441 阅读 · 0 评论 -
Android之Window与WindowManager窗口管理
1.Window与WindowManager基本概念Window、PhoneWindow顶层窗口样式和行为的抽象类,概括了Android窗口的基本属性和功能。该类实例的getDecorView()方法返回的DecorView被用于作为顶层视图添加到WM中;创建时机:ActivityThread.handleLaunchActivity--->ActivityThread.performLaunchActivity--->Activity.attachWindowManager,Wi原创 2021-11-05 19:59:46 · 1491 阅读 · 0 评论 -
Android悬浮框实践
1.常见悬浮框显示样式示例及应用场景现在很多的应用都在使用悬浮框,例如微信视频,点击Home键以后,微信视频窗口一直停留在桌面上,小米手机屏幕上的快捷键(Home,锁屏...)等,那么我们今天将实现Android悬浮框,以及探索悬浮框常见错误;2.实现原理2.1悬浮框插入接口2.2...原创 2021-11-04 16:34:29 · 2059 阅读 · 0 评论 -
Android CoordinatorLayout之自定义Behavior
1.CoordinatorLayout是什么?CoordinatorLayout继承自ViewGroup,并实现了NestedScrollingParent2接口,类似一个功能强大的FrameLayout;CoordinatorLayout的产生主要有两个主要的目的:1)在布局文件中作为最顶层的布局容器控件;2)在CoordinatorLayout中直接为子控件提供特定的交互功能;相当于是给CoordinatorLayout里直接子控件建立依赖关系,使原本相互独立的控件,产生依赖关系,可以实原创 2021-09-15 18:44:37 · 1359 阅读 · 0 评论 -
Android之Scroller详解讲解-真正了解滚动处理
1.Scroller是什么?Scroller本身不会去移动View,它是一个移动计算辅助类,用于跟踪控件滑动的轨迹,只相当于一个滚动轨迹的记录工具,最终还是通过View的scrollTo,scrollBy方法完成View的移动;2.Scroller源码分析,如何实现滚动轨迹记录的呢?再讲源码之前先了解两个重要的方法:1)startScroll()public void startScroll(int startX, int startY, int dx, int dy, int dur原创 2021-08-23 11:44:00 · 2117 阅读 · 1 评论 -
Android长时间后台运行,内存被回收再次打开导致APP崩溃(APP在后台被系统回收后,如何重新启动?)
1.Android内存异常回收导致Activity被销毁的原因是?2.Android内存异常回收导致数据为空如何处理?原创 2021-07-25 20:53:49 · 6704 阅读 · 6 评论 -
ThreadPoolExecutor实际线程池管理线程
线程池的目的防止线程的随意创建,无法管理,将我们执行的线程放入线程池中执行,实际同时执行的线程数量依赖CPU几核;1.线程池常用管理处理并行执行:threadPool = ThreadPool.getInstantiation(); threadPool.addParallelTask(new Runnable() {});串行执行:threadPool = ThreadPool.getInstantiation(); threadPool.addSerialTask(new Runna原创 2021-07-22 17:57:11 · 436 阅读 · 0 评论 -
Android之使用BottomSheetDialog展示WebView/WheelView等事件冲突处理
问题在用BottomSheetDialog展示WebView/WheelView等滑动控件时,当向下拖动时我们会发现WebView/WheelView等滑动控件无法滑动,BottomSheetDialog向下滑动隐藏关闭了,如下效果:解决问题1.提出设想一般WebView/WheelView的向下滑动/拖动的效果应该是正常显现出来的,而BottomSheetDialog控件本身自带拖动效果也是将其整个View给消失掉的,这两者在同时向下拖动时就会产生部分冲突。(如果没有冲突,那么必定是谷原创 2021-04-04 17:10:51 · 1338 阅读 · 0 评论 -
Android之Material Design风格相关控件小结
要使用Material Design风格控件,首先需要在Gradle中加入Support Design Library,例如:implementation 'com.android.support:design:28.0.0'1.CoordinatorLayout1.1.CoordinatorLayout+AppBarLayout布局文件代码:<?xml version="1.0" encoding="utf-8"?><android.support.design原创 2021-04-03 21:22:43 · 255 阅读 · 0 评论 -
Java各种类的区别(类,内部类)补充--面试整理二
1.类的修饰符1.1.finalNormalClass.javapublic final class NormalClass{ private int x = 10; public int getX() { return x; } public void setX(int x) { this.x = x; }}class NormalClass1 extends NormalClass{ }The type NormalClass1 cannot subcla原创 2021-02-17 14:07:39 · 1948 阅读 · 1 评论 -
Java各种类的区别(类,内部类)--面试整理二
以下我将陆续写一些近一个月面试的记录,欢迎大家拍砖讨论;1.类是什么?类是一个模版,它描述一个类对象的行为和状态。现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑:(状态和行为的用途)软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。通过上图创建一个简单的类原创 2021-02-17 13:12:48 · 12327 阅读 · 1 评论 -
面试官:“Handler的runWithScissors()了解吗?为什么Google不让开发者用?“
一、序runWithScissors()是 Handler 的一个方法,被标记为 @hide,不允许普通开发者调用。这个方法算是比较冷门,如果面试中被问及,面试者不知道时,通常面试官会换个问法:"如何在子线程通过 Handler 向主线程发送一个任务,并等主线程处理此任务后,再继续执行?"。这个场景,就可以借助runWithScissors()来实现。虽然该方法被标记为 @hide,但是在 Framework 中,也有不少场景使用到它。不过它也有一些隐患,正是因为这些隐患,让 Androi...转载 2021-02-16 19:03:01 · 210 阅读 · 1 评论 -
每日一字节跳动面试真题:说一下RecyclerView 性能优化
字节跳动四面有三面都问了这个问题,在此做了整理,希望可以帮助到大家,欢迎查漏补缺。数据处理和视图加载分离我们知道,从远端拉取数据肯定是要放在异步的,在我们拉取下来数据之后可能就匆匆把数据丢给了 VH 处理,其实,数据的处理逻辑我们也应该放在异步处理,这样 Adapter 在 notify change 后,ViewHolder 就可以简单无压力地做数据与视图的绑定逻辑,比如:mTextView.setText(Html.fromHtml(data).toString())这里的 Html转载 2020-12-24 20:11:33 · 310 阅读 · 1 评论 -
RecyclerView配合DiffUtil,数据对比,局部刷新
本文转载自作者: 承香墨影,附上作者微信和公众号一、前言DIffUtils 是 Support-v7:24:2.0 中,更新的工具类。因为已经更新了一段时间了,也不好说是最新更新的。它主要是为了配合RecyclerView 使用,通过比对新、旧两个数据集的差异,生成旧数据到新数据的最小变动,然后对有变动的数据项,进行局部刷新。接下来就 DiffUtil 的使用细节,进行一个详细的讲解,希望一篇文章就完全理解 DiffUtil。二、为什么会有DiffUtilRecyclerView转载 2020-12-24 19:58:37 · 1989 阅读 · 1 评论 -
主线程中的Looper.loop()死循环为什么不会导致ANR?
源码的 ActivityThread 类中有这么一段代码:public final class ActivityThread { public static void main(String[] args) { ... Looper.prepareMainLooper(); // 注意此处 ActivityThread thread = new ActivityThread(); thread.attach(fa转载 2020-12-22 08:08:12 · 554 阅读 · 0 评论 -
面试之Android事件传递
以上是测试结构;firstl = this.findViewById(R.id.firstlinearLayout); secl = this.findViewById(R.id.seclinearLayout); testtv = this.findViewById(R.id.textView); firstl.setOnTouchListener(new View.OnTouchListener() { @Overri...原创 2020-12-21 23:24:23 · 247 阅读 · 1 评论 -
Android Handler究竟是如何实现跨线程的?
背景本文要解决的问题是:1、Handler究竟是怎样实现跨线程通信的?2、为什么要使用ThreadLocal?为什么还要写这么一篇文章呢?网上关于Handler机制的文章已经多如牛毛,但是大多数源码分析都是在分析Looper、MessageQueue、Message之类的,看了之后还是不知道,或者不会去想,Handler究竟是如何做到跨线程的。有的也会讲ThreadLocalMap,个人理解,它不是做到跨线程的原因,它只是对于Handler机制的一种优化。阅读本文需要先对Handler机制有一定了转载 2020-12-19 09:45:38 · 902 阅读 · 1 评论 -
Android性能优化(五)之细说Bitmap
在上一篇《Android性能优化(四)之内存优化实战》中谈到那个内存中的大胖子Bitmap,Bitmap对内存的影响极大。 例如:使用Pixel手机拍摄4048x3036像素(1200W)的照片,如果按ARGB_8888来显示的话,需要48MB的内存空间(4048*3036*4 bytes),这么大的内存消耗极易引发OOM。本篇文章就来说一说这个大胖子。1. Bitmap内存模型Android Bitmap内存的管理随着系统的版本迭代也有演进:1.在Android 2.2(API8)之前,当G转载 2020-12-16 21:53:32 · 572 阅读 · 0 评论 -
Lifecycle、LiveData、ViewModel讲解之ViewModel
Lifecycle、LiveData、ViewModel介绍在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。ViewModelViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。ViewModel产生的原因Android 框架可以管理界面控制器(原创 2020-11-13 17:58:16 · 411 阅读 · 0 评论 -
Lifecycle、LiveData、ViewModel讲解之LiveData
Lifecycle、LiveData、ViewModel介绍在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。LiveDataLiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知.原创 2020-11-11 18:03:34 · 634 阅读 · 0 评论 -
Lifecycle、LiveData、ViewModel讲解之Lifecycle
Lifecycle、LiveData、ViewModel介绍在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。Lifecycle(Lifecycle)生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。a.原创 2020-11-09 17:05:19 · 1404 阅读 · 0 评论 -
AndroidX是什么?
为什么会有AndroidX和android.support.*支持库?在开发支持多个 API 版本的应用时,您可能需要一种标准的方法,以便对早期版本的 Android 系统提供新功能,或者优雅地回退到等效的功能。您可以利用这些库提供相应的兼容性层,而无需编译代码来处理早期版本的平台。此外,支持库还提供标准 Framework API 中未提供的额外的工具类和功能,使您能更轻松地面向更多设备进行开发和提供支持。Android 支持库最初是适用于各种应用的单个二进制库,如今它已经发展为一套用于应用开发的原创 2020-11-04 18:44:50 · 2579 阅读 · 1 评论 -
https实现原理(SSL认证过程)
目录1.https验证原理1.1原理图1.2https建立连接过程1.2.1 客户端访问https连接1.2.2 - 1.2.3 服务端发送证书(公钥)给客户端1.2.4- 1.2.5 客户端验证服务端的证书1.2.6 - 1.2.7 服务端接收加密信息,解密得到客户端提供的随机字符串1.2.8 客户端验证服务端返回的握手信息,完成握手1.3 验证总结2.SSL请求完整过程示例3.客户端验证证书的合法性Http协议由于 HTTP 协议在通信过程中,是基于明原创 2020-09-03 10:15:43 · 6376 阅读 · 0 评论 -
HTTP1.0和HTTP1.1的区别及轮询、长轮询、长连接、websocket
目录1.HTTP1.0和HTTP1.1的区别1.1.HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理1.2.HTTP 1.1增加host字段1.3.100(Continue) Status(节约带宽)1.4.Chunked transfer-coding1.5.cache2.Web端即时通讯技术2.1轮询2.2长轮询(comet)2.3长连接(SSE)2.4WebSocket2.5四种Web.原创 2020-09-01 18:15:41 · 842 阅读 · 0 评论 -
ConcurrentHashMap 1.7和1.8区别
ConcurrentHashMap 与HashMap和Hashtable 最大的不同在于:put和 get 两次Hash到达指定的HashEntry,第一次hash到达Segment,第二次到达Segment里面的Entry,然后在遍历entry链表(1) 从1.7到1.8版本,由于HashEntry从链表 变成了红黑树所以 concurrentHashMap的时间复杂度从O(n)到O(log(n))(2) HashEntry最小的容量为2(3)Segment的初始化容量是16;(4)Ha.转载 2020-08-10 15:20:18 · 514 阅读 · 0 评论 -
Java集合类实现整理及Concurrent并发包整理总结(CAS,AQS)
目录1.集合包1.1 ArrayList1.2 LinkedList1.3 Vector1.4 Stack1.5 HashSet1.6 TreeSet1.7HashMap1.8 TreeMap2.并发包2.1ConcurrentHashMap2.2 ReentrantLock2.3 Condition2.4 CopyOnWriteArrayList2.5 CopyOnWriteArraySet2.6 ArrayBlockingQueu..原创 2020-08-05 16:18:26 · 426 阅读 · 0 评论 -
CAS(乐观锁)与AtomicInteger原理
目录1.什么是锁?2.悲观锁3.乐观锁4.Java实现CAS操作5.实现无阻塞多线程争抢资源的模型实例6.CAS缺点7.java.util.concurrent包介绍1.什么是锁?什么是锁,编程中我们提到锁通常是指并发资源锁。那么啥是资源锁,我们通俗地理解加锁行为,当一个资源被两个程序(进程)争夺时,为了保证资源只能够被其中一方使用,因此在获取资源后给其加锁,使用期间不让其他进程获得的过程。2.悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所.原创 2020-07-31 20:21:26 · 621 阅读 · 1 评论 -
JVM虚拟机-虚拟机栈帧栈结构
1.虚拟机栈(VM Stack)结构图2.虚拟机栈帧栈是什么?虚拟机用来进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。3.栈帧的组成栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。在编译代码的时候,栈帧中需要多大...原创 2020-07-21 14:27:45 · 1102 阅读 · 0 评论 -
多线程并发原子性,可见性,有序性分析
多线程的三个特性:a.原子性是指一个操作是不可中断,即使多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰;简单看几个例子:1)int x=10; 2)int y=x; 3)x++; 4.x=x+1;这上面四个语句,区分哪些是原子操作,哪些非原子操作?1)第一句,直接把10赋值给x的工作内存,这个操作是不可再分的,并且很直接,这就是原子操作;2)第二句,先读取x的值,然后将x的值写入到y的工作内存,这个可分割,并且不直接,这就不是原子操作 ;3)第三句,其实和第.原创 2020-07-14 16:49:02 · 744 阅读 · 0 评论 -
内存分析工具LeakCanary是如何工作的
一旦LeakCanary被安装,它自动检测和报告内存泄漏,分4步:检测保留下来的对象; 导出堆信息; 分析堆信息; 对内存泄漏进行分类;目录1.检测保留下来的对象2.导出堆文件3.分析堆文件4.对内存泄漏进行分类5.其他1.检测保留下来的对象LeakCanary通过Hook(劫持)Android生命周期去自动检测内存泄漏问题,当Activity和Fragment被销毁并且执行垃圾回收的时候;这些被销毁的对象被传递给ObjectWatcher(持有这些销毁的对象的.翻译 2020-06-27 16:33:03 · 2031 阅读 · 0 评论 -
内存分析工具之LeakCanary2.4使用整理
目录1.LeakCanary是什么?2.LeakCanary有什么优点?3.LeakCanary如何引入到项目中?3.1引入leakcanary-android依赖3.2确认LeakCanary是否运行3.3LeakCanary自动检测以下对象的泄漏4.LeakCanary如何分析内存泄漏?4.1测试内存泄漏用例4.2复杂的内存泄漏通过分析hprof文件1.LeakCanary是什么?LeakCanary是一个为了Android使用的内存检测分析工具;2.原创 2020-06-26 21:43:20 · 4118 阅读 · 0 评论 -
Android常见内存泄漏原因和解决办法
推荐阅读(了解Java虚拟机的原理,垃圾回收算法,堆和栈的区别) :Java虚拟机JVM整理https://blog.csdn.net/ahou2468/article/details/105313444Java中的堆和栈的区别https://blog.csdn.net/ahou2468/article/details/106188635Java对象引用的类型(强引用,软引用,弱引用,虚引用)什么是内存泄漏?在Android开发过程中,当一个对象已经不需要再使用了,本该被回收原创 2020-06-26 12:55:33 · 2058 阅读 · 0 评论 -
Android开发自定义Gradle插件
目录1.在自己的module(例如:app)中build.gradle中定义插件2.创建当前项目的插件3.创建通用插件,发布到maven3.1.创建module3.2利用mavenDeployer发布插件3.3定义plugin应用在android studio中gradle作为主要的构建工具,其核心工作任务在于执行一系列的Task,而plugin在gradle构建过程又扮演着举足轻重的角色,有时为了完成相应的构建任务必须通过引入相应的插件来辅助,这些插件中定义了构建Projec.原创 2020-06-11 10:50:50 · 1212 阅读 · 0 评论 -
EditText-Android实现图文混排
目录1.Span样式介绍1.1Span类继承关系1.2StyleSpan1.3AbsoluteSizeSpan1.4ForegroundColorSpan1.5UnderlineSpan1.6StrikethroughSpan1.7Spanned2.实现富文本编辑2.1定义富文本样式类2.2生成选中文字要设置的Span(样式)2.3应用样式到选中文字...原创 2020-04-27 14:32:14 · 1565 阅读 · 1 评论 -
Android冷启动优化及实践
目录1.冷启动1.1冷启动是什么?1.2.冷启动流程分析1.3冷启动优化1.3.1黑白屏问题1.3.2APP启动时间过长问题1.3.3解决APP启动时间过长问题2.温启动2.1从用户体验分析3.热启动通过APP启动时都会有一个Splash过度页面,Splash过度页面会显示广告;a.在第一次点击icon正常启动APP时我们会发现总会有白屏或者黑屏的...原创 2020-04-05 15:23:07 · 736 阅读 · 0 评论 -
Android新特性介绍,ConstraintLayout完全解析
今天给大家带来2017年的第一篇文章,这里先祝大家新年好。本篇文章的主题是ConstraintLayout。其实ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能。我们都知道,在传统的Android开发当中,界面基本都是靠编写XML代码完成的,虽然Android Studio也支持可视化的方式来编写...转载 2020-03-25 14:55:43 · 479 阅读 · 1 评论 -
Activity之Fragment详解和回退
目录1.Fragment是什么?2.Fragment的生命周期?3.Fragment添加方式?3.1在 Activity 的布局文件内声明片段3.2通过编程方式将片段添加到某个现有 ViewGroup4.编程方式动态添加,替换或者修改Fragment5.实现Fragment回退5.1定义Fragment返回监听接口,Fragment需要实现此接口5.2定义...原创 2020-03-23 21:50:18 · 1881 阅读 · 0 评论 -
RxJava线程变换之observeOn与subscribeOn
目录1.observeOn()2.subscribeOn()3.其他在借助Observable实现请求网络接口我们经常会发现会指定subscribeOn()和observeOn()所属线程,那么为什么要指定所属线程呢? apiService.getList("api", "getList", page, model, pageId, createTime, "android"...原创 2020-03-22 21:34:21 · 993 阅读 · 0 评论 -
Android之OkHttp源码分析二请求流程
1.OkHttp主流程分析图2.OkHttp主流程源码分析2.1.OkHttp完整的请求示例public void asyncGet() throws IOException { //1.创建OkHttpClient客户端 OkHttpClient okHttpClient = new OkHttpClient(); //2.创建网络请求 Request reques...原创 2020-03-22 11:30:27 · 222 阅读 · 0 评论