
Android
文章平均质量分 63
tinyvampirepudge
这个作者很懒,什么都没留下…
展开
-
RecyclerView学习-RecyclerView#Adapter#notifyDataSetChanged是如何更新数据的?
想研究清楚RecyclerView#Adapter#notifyDataSetChanged是如何更新数据的,我们需要从RecyclerView#setAdapter()方法看起。RecyclerView#setAdapter()方法:主要是调用了RecyclerView#setAdapterInternal方法,然后调用requestLayout进行布局更新。public void setAdapter(@Nullable Adapter adapter) { // bail out if原创 2022-03-12 10:19:08 · 4227 阅读 · 0 评论 -
ViewGroup在调用onMeasure时,会先测量父View,还是会先测量子View?
以常见的FrameLayout、LinearLayout、RelativeLayout、ConstraintLayout为例,进行分析:通过查阅这几个控件的onMeasure、onLayout、onDraw方法,得出结果如下:控件onMeasureonLayoutonDraw备注FrameLayout先子view,然后是自身。先子view,然后是自身。先自身,然后子view。child的顺序是正序LinearLayout先子view,然后是自身先子view,然原创 2022-03-07 19:09:52 · 673 阅读 · 0 评论 -
从源码角度理解ConstraintLayout#onMeasure对child的measure调用次数
通过本次浅显的实验,可以大致得出一个结论,一次测量流程中,ConstraintLayout 中child#onMeasure的调用次数,大部分情况下是一次。原创 2022-03-07 18:49:21 · 4437 阅读 · 0 评论 -
从源码角度理解RelativeLayout#onMeasure对child的measure调用次数
综上所述,在RelativeLayout一次测量流程中,RelativeLayout的child最少会经历一次测量(必须的),最多是两次。如果没有设置对应的依赖关系,那么child大概率会被测量两次。原创 2022-03-04 23:47:09 · 873 阅读 · 0 评论 -
从源码角度理解LinearLayout#onMeasure对child的measure调用次数
总的来说,一次测量流程中,LinearLayout的child最少进行一次测量(必须的),最多进行三次测量。第一次测量基本上针对所有的child(有特例,看上面的解析),第二次测量针对有权重的child,第三次测量针对另一个方向上、尺寸是match_parent的child。原创 2022-03-04 20:02:55 · 1023 阅读 · 0 评论 -
从源码角度理解FrameLayout#onMeasure对child的measure调用次数
综上所述,在FrameLayout一次测量流程中,FrameLayout的child最少会经历一次测量(必须的),最多是两次。原创 2022-03-04 18:32:04 · 1395 阅读 · 0 评论 -
进入Activity时,为何页面布局内View#onMeasure会被调用两次?
在一个简单的Activity中,写一个简单的布局,宽高都是match_parent。当打开Activity时,从RootView开始从上往下,绘制流程(onMeasure方法)最少执行两次。原创 2022-03-04 13:11:53 · 2211 阅读 · 0 评论 -
Android查看UI布局相关工具
1、uiautomatorviewer: android-sdk自带。需要android开发环境。手机上打开对应页面,在终端输入uiautomatorviewer即可。Write automated tests with UI Automator2、Android Studio中的LayoutInspector:IDE带的,可以实时查看布局层级信息。通过adb连接上手机,然后在Android Studio中打开LayoutInspector,即可查看手机上的实时布局信息。如果页面复杂,会卡顿。L原创 2022-03-03 21:54:02 · 2660 阅读 · 0 评论 -
调用View#requestLayout后,哪些View会被影响?
最小化效果:①发起`requestLayout()`调用的View,及其`各级parent(直到ViewRootImpl)`,它们的`requestLayout方法`都会被调用,都会添加`PFLAG_FORCE_LAYOUT`和`PFLAG_INVALIDATED`标记。②下一个刷新时机中,`添加了标记的View`会`从上到下`依次执行`onMeasure`、`onLayout`方法。原创 2022-03-03 19:44:29 · 875 阅读 · 0 评论 -
View#invalidate是如何调用当前View#onDraw方法的?
View#invalidate后,一定会调用当前child的onDraw。这个方法跟 requestLayout 的区别在于,它不一定会触发 View 的 measure 和 layout 的操作,多数情况下只会执行 draw 操作。我们从View#invalidate开始,追一下调用流程。1、View#invalidate:让当前的整个View无效。如果view可见,onDraw方法将在随后的某个节点调用。/** * Invalidate the whole view. If the view i原创 2022-03-03 19:06:02 · 599 阅读 · 0 评论 -
ViewGroup是如何获取到xml中child设置的对应的属性的?
以常规的Activity启动开始,我们追一下详细的调用栈。android sdk版本是30。Activity#setContent方法中的布局如何生成View对象的:--> ActivityThread#handleLaunchActivity--> ActivityThread#performLaunchActivity--> Instrumentation#callActivityOnCreate--> Activity#performCreate(Bundle ic原创 2022-03-03 18:41:24 · 325 阅读 · 0 评论 -
View.AttachInfo的前世今生
View所持有的AttachInfo来自于根布局的ViewRootImpl。同一个window下的view,持有的AttachInfo都是同一份。1、View#AttachInfo:当view 被跟父window关联起来时,被设置给view的一系列信息。A set of information given to a view when it is attached to its parent window.@UnsupportedAppUsagefinal IWindowSession mSes原创 2022-03-03 17:13:23 · 430 阅读 · 0 评论 -
终端中查看某个app的logcat输出,支持关键字筛选,支持输出到文件
文章目录通过adb在终端中输出app的实时log连接设备查看设备的所有logcat输出获取某个app的pid:通过`adb shell dumpsys 包名`通过`adb shell dumpsys activity top | grep "ACTIVITY" -A 0`输出单个app的log:adb logcat -d --pid=xxx删选关键字:grep输出到对应的文件中: xxx命令 > target.txt在只安装了adb环境的情况下,如何查看某个app的日志,同时筛选关键字?如何配置a原创 2021-09-23 13:52:32 · 6931 阅读 · 0 评论 -
mac下安装adb环境的三种方式
文章目录1、通过Android sdk,配置环境变量2、通过homebrew安装3、自行下载platform-tools包,配置环境变量验证是否安装成功常用命令adb全称是Android Debug Bridge,它是一个命令行工具,通过它可以与Android设备进行交互,可以进行常见的安装/卸载app、打开app、查看app的日志等操作。官网请移步Android Debug Bridge (adb)接下来介绍几种mac下安装adb的方式。1、通过Android sdk,配置环境变量Android原创 2021-09-23 13:48:53 · 8685 阅读 · 0 评论 -
adb常用命令
文章目录查看adb版本号重启adb查看当前adb连接的设备安装文件到手机根据包名卸载存在多个设备时,直接install会出错,需要制定设备名称。覆盖安装按组列出权限和状态:查看adb版本号adb --version重启adbadb kill serveradb start server查看当前adb连接的设备adb devices 安装文件到手机adb install <file> 根据包名卸载adb uninstall <pkg-name> 存在多原创 2021-09-23 13:42:47 · 6167 阅读 · 0 评论 -
Animation组合动画踩坑-实现循环播放动画,可控制次数
Animation组合动画踩坑-实现循环播放动画,可控制次数比如说期望如下:如果使用View动画,那么很自然的就想到了通过res/anim下的xml文件来实现,组合动画的话使用set标签即可。直接这样做真的能生效么?且让我们一步一步实践。先提前剧透下,官网的demo也是有问题的。赶时间只想看解决方式的同学,可以直接移步到最后一步的demo。1、使用res/anim下的xml文件,实现组合动画顺序执行的坑。动画的顺序执行是依靠的startOffset属性,它的值等于前面所有动画的duration原创 2021-07-15 21:34:19 · 3023 阅读 · 1 评论 -
Android中对格式控制符的支持
1、String#format代码示例:Log.e("Tag", String.format("name:%s, hashCode:%h", "name", obj.hashCode()));更多细节请查看Formatter。2、Context#getString中支持格式控制符:代码示例:<string name="string_xxx">%1$s猫了个咪啊</string>String content = getContext().getString(R.str原创 2021-07-13 16:23:35 · 109 阅读 · 1 评论 -
ConstraintLayout中使用Guideline限制控件最大宽度
ConstraintLayout中使用Guideline限制控件最大宽度下面的 ll_container 最大宽度被限制了:最大宽度是屏幕宽度 - 88dp。ll_container本身宽度可变,有最大宽度限制。<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <原创 2021-07-13 15:45:55 · 1511 阅读 · 0 评论 -
代码设置ConstraintLayout的layout_constraintDimensionRatio
代码中设置layout_constraintDimensionRatio:ConstraintSet constraintSet = new ConstraintSet();constraintSet.clone(mRlContent);constraintSet.setDimensionRatio(R.id.iv,"h,9:16");constraintSet.applyTo(mRlContent);对应布局:<androidx.constraintlayout.widget.Cons原创 2021-07-13 15:25:45 · 2894 阅读 · 1 评论 -
自定义ViewGroup的知识点总结-持续更新
自定义ViewGroup的知识点总结-持续更新1、child.getMeasuredWidth()中会包含child的padding值child的margin的值需要自行适配。2、在onMeasure方法中:需要先对child进行measure,然后才能获取到measuredWidth和measureHeight。常用的测量方法有两个:①ViewGroup#measureChild(View child, int parentWidthMeasureSpec, int parentHeightM原创 2021-07-13 15:16:38 · 187 阅读 · 0 评论 -
使用特殊字符拼接字符串“+“
使用特殊字符拼接字符串"+"期望:使用"+"拼接多个字符串当做key,在需要时将key根据"+"进行拆分,获取到原来的多个字符串。正确用法:private static final String SPLIT = "+";①使用StringBuilder#append来拼接多个字符串和SPLIT;②解析字符串:String[] splits = key.split(Pattern.quote(SPLIT));有坑的用法一:写入的和读取出来的不一致。private static fin原创 2021-07-13 12:59:29 · 649 阅读 · 0 评论 -
记一次忽略@SuppressLint(“NewApi“)提示引发的血案
记一次忽略@SuppressLint(“NewApi”)提示引发的血案本次开发中用到了Java中的优先级队列,需要根据给定的优先级对元素进行排序,于是我写出了下面这段代码:private Comparator<CustomObject> comparator = new Comparator<CustomObject>() { @Override public int compare(CustomObject o1, CustomObject o2) {原创 2021-07-13 12:52:23 · 382 阅读 · 0 评论 -
避免list的并发修改异常的几种方式
避免list的并发修改异常的几种方式1、使用list的snapshot,遍历它的副本使用如下:com.bumptech.glide.manager.ActivityFragmentLifecycle#onStart()for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) { lifecycleListener.onStart();}具体实现如下:com.bumptech.glide原创 2021-07-13 12:42:57 · 415 阅读 · 0 评论 -
Activity中,View#postDelay会导致内存泄漏,但是不会影响Activity的生命周期执行。
Activity中,View#postDelay会导致内存泄漏,但是不会影响Activity的生命周期执行。测试代码如下:@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e(TAG, "onCreate"); iv = findViewById(R.id.iv); iv.postDelayed(new Runnab原创 2021-07-13 12:38:37 · 943 阅读 · 0 评论 -
通过ComponentCallbacks2来接收onTrimMemory等回调,并mock对应的场景
我们在做app内存不足时,需要做一些内存释放的操作,以避免app卡顿,或者尽可能的延迟app存活时间,减少被系统回收的概率。如何监听ComponentCallbacks那么如何监听这些时机呢?系统的Application、Activity、Service和ContentProvider均实现了ComponentCallbacks2接口,我们可以很方便的获取这些时机。除了这些时机之外,我们还可以通过Context#registerComponentCallbacks来添加自己的监听器。一般而言我们添加C原创 2021-04-30 15:04:54 · 660 阅读 · 1 评论 -
彻底记住ImageView的background和src的区别
彻底记住ImageView的background和src的区别示例代码<ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/ic_launcher" android:src="@drawable/ic_launcher" />区别:①原创 2021-04-18 23:31:56 · 921 阅读 · 0 评论 -
Android复习路径以及复习资料整理
Android面试准备,基本上可以分为如下几部分:jvm,java基础,多线程,Android,三方库源码,设计模式,kotlin、flutter、jetpack组件实战、算法与数据结构、网络等。具体面经请看2020Android面经,历史一个半月,斩获3个大厂offer。具体的学习资料和基础的知识点如下:1、JVM《深入理解Java虚拟机》极客时间-深入拆解Java虚拟机基础知识:GCRoot类型垃圾回收方式运行时数据分区类加载过程,对象创建过程静态分派和动态分派2、Ja原创 2020-12-12 15:12:01 · 354 阅读 · 0 评论 -
android中module间资源文件的覆盖规律
android中module间资源文件的覆盖规律主项目是否会覆盖它依赖的module中的资源文件。类型app是否会覆盖modulecolor中定义的值是string中定义的值是dimen中定义的值是layout文件是drawable中的图片是drawable的shape文件是styles中的style是测试代码地址AndroidStudy中的mylibrary...原创 2020-12-10 11:53:19 · 2138 阅读 · 0 评论 -
Android Studio4.1无法创建自定义模板的坑
我们自定义代码模板时,模板文件的路径一般是在/Applications/Android Studio.app/Contents/plugins/android/lib/templates这个目录下的,但是在4.1版本中是没有这个目录的。具体如下图:4.1的:我们再看下前一个稳定版本4.0.1的:截至目前还没有找到可行的方案,只能选择回退Android Studio版本到4.0.1了。Android Studio稳定版本链接:https://developer.android.com/studi原创 2020-11-26 16:23:46 · 2229 阅读 · 10 评论 -
记一次java命令执行IDE中java类的入口函数的坑
熟悉java的同学都知道,我们可以直接通过java命令执行Java类的入口函数,执行时还可以携带参数,参数是以字符串数组的形式传递给main入口函数的。不过现在已经很少使用这种方式执行java代码了,都是通过IDE来执行。比如下面这个测试类,package com.tinytongtong.androidstudy.java.cachepool;public class JavaMainTest { public static void main(String[] args) {原创 2020-08-08 14:04:12 · 742 阅读 · 0 评论 -
Java中基本类型和包装类的各类比较(==),以及包装类的对象缓存池
Java中的基本类型及其包装类的比较(==)一直是一个比较头疼的问题,不仅有自动装箱和拆箱操作,部分的包装类还有对象缓存池,这就导致了这部分知识容易混淆。对于==操作符来说,如果比较的数据是基本类型,则比较它们的值,如果比较的是对象,则会比较对象的内存地址。另外,如果一个是基本类型、一个是包装类型,在比较前会先把包装类型拆箱成基本类型,然后进行比较。以int为例,这里我们把参与比较的类型分为三种:int、直接new出来的Integer对象和自动装箱出来的Integer对象。这里先不考虑Integer的原创 2020-08-06 23:36:42 · 3807 阅读 · 5 评论 -
Android10上”org.apache.commons.codec.binary.Hex ClassNotFoundException“解决及原因探究
在一次版本迭代后,突然在部分机型上爆出了一些崩溃,查看崩溃原因,原因内容是java.lang.NoClassDefFoundError:Failed resolution of: Lcom/apache/commons/desc/binary/Hex,具体如下图:比较蛋疼的是在这次版本迭代后才出现这个问题,而且是高版本手机有问题,10.0的测试机有问题,6.0的测试却没问题。问题定位及解决基于上述不同机型的表现,用代码验证下,org.apache.commons.codec.binary.Hex这个原创 2020-08-06 11:26:17 · 3338 阅读 · 0 评论 -
一文带你理解Java中自动装箱和拆箱
Java中自动装箱和拆箱装箱(Boxing),也称为包装(Wrapper),是在对象中放置原语类型(primitive type)的过程,以便原语(primitive)可以作为引用对象使用。这里的primitive type就是Java里面的基本类型,所有的基本类型都有一个与之对应的类。例如,Integer类对应基本类型int。通常,这些类称为包装器(wrapper)。这些对象包装器类拥有很明显的名字:Integer、Long、Float、Double、Short、Byte、Character、Voi原创 2020-08-04 23:20:07 · 2281 阅读 · 0 评论 -
Android压缩图片文件大小到限定值以下
开发中会有用户头像上传的需求,为了节省流量,一般上传接口都会现在图片大小,比如1M。但是随着手机像素越来越高,这个限制很容易达到,所以需要客户端在上传图片进行压缩操作。先说一下思路:主要是等比缩小图片文件,辅之使用Bitmap#compress进行压缩。①第一步根据文件路径创建File对象,然后判断File对象的大小,如果大于1M,就开始压缩操作;②接着通过BitmapFactory.Options获取图片文件的宽高,先把图片宽高减半;然后根据缩小后的宽高创建新的Bitmap对象,这里通过Canvas原创 2020-07-23 11:46:20 · 3123 阅读 · 0 评论 -
Bad method handle type 7异常解决
在利用androidx版本写demo时,在添加了一些依赖后,遇到了java.lang.ClassNotFoundExceptionbug,这就很奇怪了,我就添加rxjava3的依赖,就给我报这个错误。添加的依赖如下:implementation 'io.reactivex.rxjava3:rxjava:3.0.0'具体报错如下:第一反应是先看Error部分的提示,这里提示找不到dex文件中找不到自定义的Application类,所以优先排查mutildex相关问题。查了半天毫无头绪,我的配置也没原创 2020-06-13 22:13:49 · 1881 阅读 · 5 评论 -
Activity添加进入和退出动画的两种方式,解决黑色区域问题
Activity添加进入和退出动画的两种方式,解决黑色区域问题给Activity添加进入和退出动画的操作,大家一定不会陌生。常见的有两种方式,一种是通过style文件给Activity设置Theme,另一种是直接代码中调用Activity#overridePendingTransition方法。使用代码和使用style文件是一样的效果,下面举例进行说明,比如说我们的Activity进入动画需要从下往上滑动,退出需要从上往下滑动。通过style文件给Activity设置Theme来实现styles.x原创 2020-06-10 00:37:36 · 5606 阅读 · 0 评论 -
StartActivity主体流程-api26
主体流程基于api26App端:Activity#startActivity(Intent intent)Activity#startActivity(Intent intent, @Nullable Bundle options)Activity#startActivityForResult(Intent intent, int requestCode)Activity#startActivityForResult(Intent intent, int requestCod, Bundle o原创 2020-06-08 18:20:17 · 573 阅读 · 0 评论 -
性能优化:Android中Bitmap内存大小优化的几种常见方式
性能优化:Bitmap内存大小优化的几种常见方式Android中的bitmap是比较占用内存的,bitmap的大小直接影响到了应用占用内存的大小。bitmap占用内存大小的计算方式为:bitmap内存大小 = bitmap宽度(px) * bitmap长度(px) * 一个像素点占用的字节数BitmapFactory给我们提供了多个decode方法,我们可以从不同的数据源中加载bitmap,如下图所示:一个像素点占用的字节数对应的参数是Bitmap.Config,它是一个枚举类,具体取值如下:原创 2020-06-07 16:12:16 · 5488 阅读 · 0 评论 -
Android获取Bitmap网络图片类型
常见的获取图片格式的方式Android中常见的图片格式有png、jpeg(jpg)、gif、webp,不同格式的图片,那么如何获取图片类型呢?常见的有两种方式,一种是在Bitmap加载过程中,通过BitmapFactory.Options#outMimeType来获取图片对应的格式,另一种是通过文件头信息来判断。效果图:具体实现因为我们这里针对的是网络图片,所以第一步是将图片下载到本地。通过[BitmapFactory.Options#outMimeType]获取图片格式接着我们可以通原创 2020-06-05 18:53:43 · 2683 阅读 · 0 评论 -
微信图片分享支持url,缩略图支持url
微信图片分享支持url,缩略图支持url在集成微信分享的过程中,如果缩略图是url形式,或者大图分享的图片是个url,就需要我们先把图片下载下来,然后依据微信的要求对图片做一些压缩操作,最后将图片的数据设置给要分享的对象即可。我们一般需要支持的分享类型主要有文字类型(WXTextObject)、图片类型(WXImageObject)和网页类型(WXWebpageObject),具体请看分享与收藏功能-Android开发手册。缩略图支持url拿我们常见的网页分享举例,msg.thumbData对应的就原创 2020-05-30 10:58:39 · 6366 阅读 · 1 评论