自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tinyVampire的博客

不积跬步无以致千里,不积小流无以成江海。

  • 博客(182)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 gradle插件分享-手把手教你写gradle插件

在基础熟练的基础上,完全可以考虑基于Booster、ByteX等框架来开发,效率应该会高一些。修改字节码的插件不止asm一个,还有javaassist等,可以多做一些尝试,按照需求选择适合自己项目的。本次分享的目的旨在展示gradle插件开发的过程、思路、需要的基础、遇到问题后如何分析等,核心在于打好基础。

2023-05-14 11:05:57 557 1

原创 Ubuntu 20.04 通过ifconfig修改静态ip无法联网,重置设置后恢复网络

系统:Ubuntu 20.04操作:1、通过ifconfig将电脑设置为静态ip2、接着发现无法连接网络,且电脑右上角的网络连接图标多了一个问号标识。3、访问浏览器时会报错。

2023-03-12 18:16:15 2107 1

原创 2022Android面经,历时一个半月,斩获大厂offer

今年行情极差,有相当多的同学遇到了给了口头offer,但是最终offer没下来;甚至正式offer给了,但是最终流程也没走完。废话不多说,先是自己总结的面试三件套送给大家1、面经2、算法题Java版本写的《剑指offer第二版》,测试用例、LeetCode上对应地址均有。ps这个后续会更新为最新的,大家先看下2020年的。面试题排名不分先后,大公司的在后面。.........

2022-07-16 17:14:15 1084 1

原创 transform + asm资料

gradle的transform + asm 实现字节码插件

2022-06-28 10:15:05 241

原创 查看Java字节码内容的几种方式

1、javap通过javac和javap查看:先通过javac将.java文件编译成.class字节码文件,然后通过javap -verbose分析字节码。(base) tinytongtongdeMacBook-Pro% javac JVMRunTimeStorageTest.java(base) tinytongtongdeMacBook-Pro% javap -verbose JVMRunTimeStorageTest这样你就能看到你的字节码信息了。示例如下:Classfile /Use

2022-03-16 18:34:11 3160

原创 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 3988

原创 RecyclerView#Adapter#notifyDataSetChanged方法后,为何还会新建ViewHolder?

环境android sdk版本: 30依赖:implementation 'androidx.core:core-ktx:1.3.2'implementation 'androidx.appcompat:appcompat:1.2.0'implementation "androidx.recyclerview:recyclerview:1.2.1"案例分析:RecyclerView宽高固定;LayoutManager是LienarLayoutManager,vertical方向;数据20条,

2022-03-10 14:35:48 3214

原创 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 475

原创 从源码角度理解ConstraintLayout#onMeasure对child的measure调用次数

通过本次浅显的实验,可以大致得出一个结论,一次测量流程中,ConstraintLayout 中child#onMeasure的调用次数,大部分情况下是一次。

2022-03-07 18:49:21 4121

原创 从源码角度理解RelativeLayout#onMeasure对child的measure调用次数

综上所述,在RelativeLayout一次测量流程中,RelativeLayout的child最少会经历一次测量(必须的),最多是两次。如果没有设置对应的依赖关系,那么child大概率会被测量两次。

2022-03-04 23:47:09 697

原创 从源码角度理解LinearLayout#onMeasure对child的measure调用次数

总的来说,一次测量流程中,LinearLayout的child最少进行一次测量(必须的),最多进行三次测量。第一次测量基本上针对所有的child(有特例,看上面的解析),第二次测量针对有权重的child,第三次测量针对另一个方向上、尺寸是match_parent的child。

2022-03-04 20:02:55 818

原创 从源码角度理解FrameLayout#onMeasure对child的measure调用次数

综上所述,在FrameLayout一次测量流程中,FrameLayout的child最少会经历一次测量(必须的),最多是两次。

2022-03-04 18:32:04 1144

原创 进入Activity时,为何页面布局内View#onMeasure会被调用两次?

在一个简单的Activity中,写一个简单的布局,宽高都是match_parent。当打开Activity时,从RootView开始从上往下,绘制流程(onMeasure方法)最少执行两次。

2022-03-04 13:11:53 1673

原创 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 1820

原创 调用View#requestLayout后,哪些View会被影响?

最小化效果:①发起`requestLayout()`调用的View,及其`各级parent(直到ViewRootImpl)`,它们的`requestLayout方法`都会被调用,都会添加`PFLAG_FORCE_LAYOUT`和`PFLAG_INVALIDATED`标记。②下一个刷新时机中,`添加了标记的View`会`从上到下`依次执行`onMeasure`、`onLayout`方法。

2022-03-03 19:44:29 612

原创 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 421

原创 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 268

原创 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 339

原创 ACK的累加规则-wireshark抓包分析-不包含tcp头部、ip头部、数据链路层头部等。

`确认号`字段(也简称ACK号或ACK字段)包含的值是该确认号的发送方期待接收的下一个序列号。即最后被成功接收的数据字节的序列号加1。总结一下,`当前报文对应的ACK = 当前报文的第一个字节的序列号 + 报文长度(http层)`。

2022-03-03 13:24:09 3898

原创 http报文在各层的长度分析-wireshark报文实战

我们先来看张图,从上往下对应的是OSI七层模型。可以看出,传输层给上层数据添加了TCP头部,IP层给TCP层的数据添加了IP头部,数据链路层给数据添加了MAC头部。接下来,我们通过分析wireshark抓到的http报文,实地分解下http原始报文的长度,以及最终在物理层传递的Frame的长度,中间经过了多少变动。我们实战探究下。我拿出一个祖传的wireshark报文,如下图所示,我们http层的数据和头部的总长度是931bytes,但是最终到了数据链路层后,传递的包长度变成了了985bytes。这

2022-03-02 16:42:17 5984

原创 mac下vscode调试c的环境配置

文章目录mac下vscode调试c的环境配置1、安装对应的插件2、配置launch.json和task.json生成launch.json文件:生成tasks.json文件3、运行参考mac下vscode调试c的环境配置想在vscode上调试c代码,找了一圈配置,发现都是c++的教程。这里给出一篇可行的配置c的教程,希望对大家有帮助。基本的环境,比如xcode、vscode的安装,这里就不提了,默认你是可以在vscode中可以运行c代码的。主要是两步,第一步安装对应的插件,第二步配置对应的launc

2021-12-31 14:47:29 1753 2

原创 服务器支持访问静态文件的几种方式:Spring、Tomcat、Vue

如何在搭建的服务器中添加一个静态文件,然后在浏览器中访问呢?Spring-Thymeleaf:前置条件,Spring-Thymeleaf项目已经搭建好了。在static目录下新建abc.txt文件,如下图:然后在浏览器中打开http://localhost:8201/abc.txt即可。项目地址:https://gitee.com/tinytongtong/spring-thymeleafTomcat:前提条件,Tomcat服务搭建好了。找到Tomcat的安装目录,将abc.txt文件赋

2021-09-24 13:17:37 805 2

原创 SpringBoot & Thymeleaf项目实战

文章目录web模板语言-thymeleaf项目启动,及各个页面入口项目地址第一步项目运行:访问接口-浏览器直接访问访问web页面访问静态页面:访问动态页面:1、访问index页面2、访问basic-usage页面3、访问request-methods页面项目架构应用入口类-EurekaServerApplicationweb页面对应WebControllerapi接口对应ApiControllerWeb静态页面Web动态页面web动态页面配置如何新建页面新建html文件在WebController增加对应的

2021-09-24 11:34:51 1369

原创 mac下Tomcat的安装,启动和关闭脚本配置,端口号更改

1、安装:在Mac环境下配置tomcat安装后的默认路径是~/Library/Tomcat.2、进入到Tomcat/bin目录下,./startup.sh3、进入到Tomcat/bin目录下,./shutdown.sh4、权限问题:①$ ~/Library/Tomcat/bin $ ./startup.shzsh: permission denied: ./startup.sh解决:sudo chmod 777 startup.sh②$ ~/Library/Tomcat/

2021-09-24 11:05:44 609

原创 终端中查看某个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 4136

原创 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 6744

原创 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 4774

原创 thymeleaf发送post请求的两种方式

文章目录场景分析form表单方式发送post请求通过`方言(Dialect)、自定义tag处理器(AbstractProcessorDialect)`的方法来发送post请求项目地址参考:这里简述下thymeleaf发送post请求的两种方式。场景分析我们知道,html不支持通过链接发送post请求,默认只能通过表单方式发送。不过这里我们使用的是thymeleaf,它还提供了一种通过方言(Dialect)、自定义tag处理器(AbstractProcessorDialect)的方式,我们可以通过就可以

2021-09-18 23:34:37 5030 1

原创 thymeleaf实现ajax请求的两种方式

文章目录使用fragment1、布局中定义fragment和id,定义ajax请求2、WebController中定义对应的ajax请求方法使用ModelAndView项目地址注意,对应的Controller类不能使用@RestController注解。使用fragment1、布局中定义fragment和id,定义ajax请求<body>...<div> <h3>get请求</h3> <p> <bu

2021-09-18 23:31:25 2526

原创 新建Spring Thymeleaf项目

文章目录新建Spring Thymeleaf项目通过IDE新建项目添加maven依赖添加thymeleaf的html页面。创建静态页面-static创建动态页面-templates新建Controller配置端口号-默认8080执行代码在浏览器中访问项目地址参考新建Spring Thymeleaf项目如果你想快速的搭建一个前后端一体的项目用于学习http(最好有点Java基础),那么你可以通过IDE(非社区版)来创建Spring项目,并通过项目中自带的Tomcat搭建服务,再通过自带的Thymeleaf

2021-09-18 23:25:50 520

原创 mac下,依赖于Charles代理,wireshark抓取Android设备报文

这里提供一些可行的方式,作者推荐第二种。一、电脑是非wifi连接时,开热点让移动设备连接,然后在电脑端抓取报文。如果你的mac本身是通过wifi来连接上网的,那就不能用这个mac做wifi热点了,因为wifi端口已经被占用,在使用了。况且已经有了wifi,再用mac做热点意义也不大。1、在操作系统上打开wifi热点2、手机链接WiFi热点3、用Wireshark打开捕获–>选项面板,选择wifi热点对应的接口设备抓包Mac怎么设置wifi热点,Mac做wifi热点二、如果电脑本身是wif

2021-08-27 11:41:07 847

原创 Animation组合动画踩坑-实现循环播放动画,可控制次数

Animation组合动画踩坑-实现循环播放动画,可控制次数比如说期望如下:如果使用View动画,那么很自然的就想到了通过res/anim下的xml文件来实现,组合动画的话使用set标签即可。直接这样做真的能生效么?且让我们一步一步实践。先提前剧透下,官网的demo也是有问题的。赶时间只想看解决方式的同学,可以直接移步到最后一步的demo。1、使用res/anim下的xml文件,实现组合动画顺序执行的坑。动画的顺序执行是依靠的startOffset属性,它的值等于前面所有动画的duration

2021-07-15 21:34:19 2679 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 72 1

原创 ConstraintLayout中使用Guideline限制控件最大宽度

ConstraintLayout中使用Guideline限制控件最大宽度下面的 ll_container 最大宽度被限制了:最大宽度是屏幕宽度 - 88dp。ll_container本身宽度可变,有最大宽度限制。<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content"> &lt

2021-07-13 15:45:55 1310

原创 代码设置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 2589 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 125

原创 使用特殊字符拼接字符串“+“

使用特殊字符拼接字符串"+"期望:使用"+"拼接多个字符串当做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 563

原创 记一次忽略@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 301

原创 shell脚本中执行python脚本,处理字符串,同时复制到剪贴板

shell脚本中执行python脚本,处理字符串,同时复制到剪贴板需求:给字符串中的&之前添加转义字符1、使用python脚本处理字符串,需要在main方法中接受入参:convert.py#!/usr/bin/env python3# -*- coding: utf-8 -*-import sysdef convert_chars( chars ): return chars.replace('&','\&')if __name__=="__main__":

2021-07-13 12:49:30 510

原创 避免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 333

LinkLineDemo.zip

具体效果请看: https://blog.csdn.net/qq_26287435/article/details/105082424

2020-03-24

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除