自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 Flutter Widget 生命周期 & key探究

操作符来实现例如,现在有一个展示所有学生信息的ListView列表,每一项itemWidget所对应的学生对象均包含某个唯一的属性,例如学号、身份证号等,那么这个时候就可以使用ValueKey,其值就是对应的学号或者身份证号。

2023-06-12 21:13:46 1620

原创 kotlin协程

kotlin协程

2023-05-30 17:18:46 790

原创 Android Kotlin Gson解析踩坑记录

一、背景一般我们在进行网络请求拿到返回结果之后,我们期望能够转化成对应的Java实体类,在这个转化过程中,可以使用自动解析的方式,也可以使用三方提供的工具类,比如Gson、FastJson等。针对于Gson解析,可能都有遇到某个字段类型不匹配导致整个json解析失败的问题,这不是我们期望的,我们期望的是一个字段解析失败不影响其他字段的解析。那这种情况下怎么办呢?下面就是踩坑记录和解决方案二、问题 & 解决方案1. 绕过Kotlin非空判断问题问题描述data class User(

2021-03-07 11:07:53 2322

原创 Lifecycle全面剖析

一、简介Lifecycle 库是2017年 Google I/O 开发者大会上发布的一个库,目的是让除了 Activity 和 Fragment 外的其他组件也能感知到生命周期。那为什么要用Lifecycle呢?举一下我们最常用的 MVP 例子,没引进 Lifecycle 之前,我们需要在 Activity 或者 Fragment 销毁的时候,即 onDestroy 的时候手动调用 Presenter的onDestroy 方法,这里会带来一些问题,每一次在 Activity 或者 Fragment 销

2021-02-21 16:13:41 783

原创 Android混淆相关

背景写这篇文章的背景是开发过程中对线上apk包进行反编译后发现所有的类名居然都没有被混淆,猜想可能是混淆配置出了问题,但是由于项目的现状是集成了将近600个的aar形成的apk, 混淆规则高达2w行,所以尽管能定位大概方向,但这仍然是一项耗时耗力的工作。于是就此展开了问题排查思路及过程集成工程打包后会在build/outputs目录下会生成总的混淆文件proguard-all-configuration.txt, 这个文件包含了打包过程中各个aar通过consumerProguardFiles配置的混

2021-02-21 13:33:04 494

原创 SharedPreferences源码解析和可能ANR的情况及建议

ANR使用不当可能会造成ANR,为什么这样说呢?下面我们分析源码:一般来说我们是通过Context实例获取SharedPreferences对象的,即: public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);上面是Context类里面的抽象方法,所以我们需...

2020-03-10 21:56:14 356

原创 Handler,Looper,MessageQueue,ThreadLocal的关联

一.前言本以为这些东西是老生常谈,并且作为Android开发的基础入门知识,是必须熟练掌握的,但是发现每每提起Handler及Looper,ThreadLocal的原理,总是要去翻阅资料,或者查看源码再捋一遍,干脆花一点时间整理一下,等下次再忘记拿出来稍稍翻阅一下就ok了。二.原理浅析分析一件事情往往需要带着问题去分析,下面我们将从以下几个问题进行分析:为什么主线程直接new Handl...

2019-11-20 15:21:29 945

原创 Android共享元素动画

Andriod 5.0及之后,开始支持共享元素动画,该动画主要用于两个activity之间,两个Activity可以共享某些控件,Activity A跳转到Activity B的时候,A的某个控件能自动移动到B的相应控件的位置,产生动画。在要共享的控件加上属性transitionName ,ActivityA和ActivityB的布局文件都要加,并且对应做动画的view的属性值要一样。 &...

2019-09-12 14:44:57 2223

原创 Linux命令行与Shell脚本编程

一、bash shell基本命令1、cd destination进入目录,可以是相对路径,也可以是绝对路径,如果后面没有参数,则直接跳回主目录2、pwd显示当前目录3、.表示当前目录4、..表示当前目录的父目录5、ls显示当前目录下的文件和目录,会按照列顺序按字母排序-F参数能区分文件和目录-a参数会显示当前目录下的所有文件,包含隐藏文件-R表示递归选项,能够递归的列出当...

2019-09-06 17:30:22 149

原创 Flutter学习知识点总结

一、Dart语言简介Dart语言是一种真正面向对象的语言。下面我挑几点比较重要的简单实用的介绍一下,因为文章后面会涉及这些语法。函数式编程说Dart是真正的面向对象的语言就在于它把函数也认为是对象,类型为Function。这意味着函数可以赋值给变量或者作为参数传递给其他函数,这是函数式编程的典型特征。//将函数赋值给变量var say= (str){ print(str);};...

2019-02-22 16:27:59 969

原创 Android sdk适配指南心得

6.0适配权限适配自己封装的库 XstartActivityForResultAndXPermission7.0适配8.0适配1、Android O 适配详细指南主要关注一下透明Activity崩溃问题2、Android 8.0去除“允许未知来源”选项,需手动确认。如果我们的App具备安装App的功能,那么AndroidManifest文件需要包含REQUEST_INSTALL...

2019-02-20 15:35:40 967

原创 Flutter编译模式

一、编译模式的分类编程语言达到可运行的过程需要经过编译,因为机器最终认识的是二进制,所以编译就涉及到编译模式,编译模式分为两类:JIT和AOT。JITJIT全称Just In Time(即时编译),典型的例子就是v8,它可以即时编译并运行JavaScript。JIT模式的优势:可以动态下发和执行代码,不用管用户的机器是什么架构。JIT模式的劣势:JIT编译器会发给很多时间和内存进行编译,...

2019-01-02 18:37:55 446

原创 Flutter打包aar并且集成现有Android项目

一、前言Flutter现在已经很火了,但是如果我们要想使用Flutter开发,在新的Flutter项目上集成以前的所有代码肯定是不现实的,同时又不想将Flutter直接侵入到我们的项目结构中去,于是最优解就是将开发的Flutter项目单独编译成aar,然后以组件的形式被主工程依赖。这样做的好处是显而易见的:对Flutter进行探索开发的同学可以在自己的Flutter工程内编写dart代码,独立...

2018-12-29 16:24:25 7651 12

原创 事件分发机制与NestedScrolling机制

事件分发机制与NestedScrolling机制一、事件分发机制1.理论分析事件分发涉及的是View和ViewGroup,相关事件:dispatchTouchEvent、onInterceptTouchEvent、OnTouchEvent,其中onInterceptTouchEvent只有ViewGroup才有这个方法。当一个Touch事件到来时,它会从Activity向下依次分发,分发的...

2018-12-14 16:03:06 345 2

原创 AOP浅析以及Android对AOP的应用

一、前言大家都知道OOP,即Object-Oriented Programming,面向对象编程。本篇我们要讲的是AOP,即 Aspect-Oriented Programming,面向切面(方面)编程。平常我们开发都是用OOP的编程思想,这种思想的精髓是把问题模块化,每个模块专注处理自己的事情,但是在现实世界中,并不是所有问题都能完美的划分到模块中。比如日志输出,这些可能是每个模块都是需要的功...

2018-12-09 13:07:37 361

原创 Android中Binder浅析(进程间通信)

一、概述因为进程间的资源是不能共享的,所以为了保证进程间能达到通信的目的,每个系统都存在自己的IPC(Inter-Process Communication)机制。Android系统中,涉及到进程间的通信底层都是依赖于Binder机制。二、BinderIPC 原理每个Android进程,只能运行在自己进程所运行的虚拟地址空间,这个虚拟地址空间包含用户空间和内核空间。对于用户空间,不同...

2018-11-29 14:52:04 261

原创 更优雅的使用startActivityForResult及权限请求

一、问题所在Android页面之前的数据回传我们一般使用startActivityForResult来处理,这没什么问题,但问题就在于我们所有的处理结果都放在onActivityResult中,在里面根据不同的requestCode作不同处理,这种方式看起来非常不优雅,因为有时候onActivityResult里面逻辑一大堆,而且跟调用方距离相差甚远,代码对应非常麻烦,找着找着就不知道找到哪里...

2018-11-29 14:02:57 2273 1

原创 Android WebView与javaScript交互

操作前提webview.getSettings().setJavaScriptEnabled(true);通过webView调用JavaScript方法webView.loadUrl("javascript:METHOD")或者 webView.evaluateJavaScript("javascript:METHOD",CallBack) //只能在4.4以上调用,效率高,能拿到返回结...

2018-11-29 12:27:08 211 1

原创 详细整理lanchMode和Intent.flag

##详细整理lanchMode和Intent.flag一说到启动模式,大家都认为这是Android里面最基本的东西,这些东西自己很清楚,但是真正用起来的时候可就懵逼了,我也是在使用的时候才发现自己并不是那么清楚,所以才整理成一篇文章方便自己和大家能更好的理解。一、lanchModeActivity启动模式是指在清单文件中配置lanchMode,比如<activity android:...

2018-11-20 11:24:50 174

原创 Android热修复技术(三)字节码注入

前言首先我们考虑一个问题,为什么需要进行字节码注入代码?那是因为apk在加载外部dex包的时候程序会出现崩溃(5.0以下),那为什么会崩溃呢? java.lang.IllegalAccessError:Class ref in pre-verified class resolved to unexpected implementation1. 崩溃原因—>类预校验问题引起的...

2018-09-11 17:11:58 1927

原创 Android热修复技术(二) Groovy语法及打Patch包

一、前言上篇我们讲到了patch包的打包是通过dex命令来生成classes.dex之类的dex文件,但是实际项目开发中我们不可能每次都把对应的包、类一一拷贝出来然后自己手动去敲dx命令去打包,所我们的目的是编写任务和插件去自动打patch包,在这个过程中我们首先需要学习的是Gradle Task和Plugin的定制 二、Groovy语法我们平时使用的Android studio...

2018-09-11 17:08:18 496

原创 日常小tip记录

Android各种目录的区别context.getDir("test", MODE_PRIVATE).getAbsolutePath() ----> /data/user/0/<packagename>/app_testcontext.getFilesDir().getAbsolutePath()----&g

2018-09-07 18:49:16 223

原创 验证码输入框

整体思路:底部一个透明的EditText,上面放置多个框框,通过组合布局继承RelativeLayout,在输入的过程中不断控制EditText的paddingLeftJava代码public class VerificationCodeView extends RelativeLayout implements TextWatcher, View.OnKeyListener { ...

2018-09-05 13:04:04 797

原创 EditText与父控件点击事件冲突问题

正常情况下点击EditText会弹出软键盘输入内容,但假设说有需求在某种情况下禁止EditText输入内容,并且点击的时候需要toast告诉用户为什么不能输入,这个时候你可能会想到给EditText设置setEnable(false),然后给他的父容器设置点击事件,但是一旦你这样做了,你就会发现给父容器设置点击事件并不会触发,这是为什么呢?原因在于EditText的onTouchEvent始终...

2018-09-05 12:11:17 4007 1

原创 Android自定义View——雷达图

Java代码public class EvaluationView extends View { private int mNormalColor; //默认颜色 private int mHighlightColor; //高亮颜色 private int mLineCount; //n边型 private int mGeometryCount; //...

2018-09-05 11:51:13 273

原创 关于屏幕分辨率问题

1.概念问题屏幕分辨率 :指在手机屏幕上面的像素点数 比如1920*1080、1080*720屏幕像素密度 (dpi):指每英寸上面的像素点的个数,单位是dpi,计算方式为(1280*1280 + 1920*1920)开方 / (x*x + y*y)开方 可根据上面的勾股定理计算屏幕无关像素(dp/dip):Android的一个设计单位,是物理单位,跟屏幕像素密度无关,只不过跟像素存在换...

2018-08-20 11:55:03 1685

原创 Android热修复技术(一) 原理和实现

写在前面: 参考文章 热修复——深入浅出原理与实现一、简述和意义在热修复之前,一个上线的app如果出现了bug,即使非常小,要是想及时更新就必须将app重新打包发布到应用市场,让用户重新下载安装,使得用户体验非常差,而且很多用户不愿意去经常更新app,所以严重的bug还会造成用户流失,甚至带来严重的后果。热修复技术就是能在用户不用下载安装新的app,甚至无感知的情况下修复一些紧急或者...

2018-07-06 09:46:05 627

原创 MarkDown基本语法

#一级标题##二级标题 下面会有下划线###三级标题####四级标题#####五级标题######六级标题##无序列表(使用-或者*)- 第一条 - 子列表,前面加两个空格 - 第二个子列表- 第二条- 第三条##有序列表1. 第一条2. 第二条 1. 有序子列表 2. 有序子列表3. 第三条##代码块(使用 ``` ```)Hello...

2018-06-29 18:14:28 179

原创 Kotlin语法总结

Kotlin语法总结变量、常量 var val 类型自动推断 latinit var val b: String by lazy{} 不支持自动转型 如Int不会自动转为Float new类的时候不需要new关键字函数方法声明 参数 返回值 fun a: Int 写在方法名后面 方法表达式方法参数默认值(name: String...

2018-06-29 18:08:17 246 2

原创 Git提交代码相关

git config --global user.name 'xueshanshan' //git初次配置git config --global user.email '[email protected]'git cherry-pick commitid //在第二个分支中把第一个分支的某次提交拉过来git commit --amend //补充上次提交首先,可以试图用g...

2018-06-29 18:06:19 149

原创 关于屏幕尺寸引起的问题

关于屏幕尺寸引起的问题1.屏幕尺寸获取 WindowManager wm = (WindowManager) sContext.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); Point realSize = new Point(); ...

2018-06-06 18:06:00 652

原创 自定义Toast

主要解决问题: 1:系统toast样式不符合UI需求 2:多次点击弹出多个toastpublic class ToastUtils { private static Toast mToast; private static TextView title; private static Handler mHandler = new Handler(); private

2017-03-28 18:28:49 256

原创 Retrofit封装和使用

关于Retrofit基础知识的学习,请参考这篇文章Retrofit实战技巧代码的封装1.APIService 使用Retrofit要求我们将项目中使用的接口请求定义写在一个接口中,咱们就写在APIService中。2.RetrofitClient类,该类就是retrofit请求管理类,该类使用单例模式,封装了项目使用的Intercepter、baseUrl、connectTimeOut、conver

2017-02-23 17:02:08 909

原创 Android透明状态栏(4.4以上版本)

关键代码:protected void initSystemBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.getDecorView().setSystemUiVisibili

2017-01-22 17:37:09 587

原创 根据字符个数限制文字长短

在android中TextView的maxLength是指定最大的字个数,即中英文都算一个,但很多时候我们想让中文为2个字符,英文和其他符号则认为1个字符,那么就需要自己计算了,下面就是我写的一个工具类:/** * Created by star on 2016/10/17 * 功能:截取指定字符的字符串,中文两个字符,特殊符号为一个字符 */public class TextLimitUt

2016-12-15 16:20:34 408

原创 ClickableSpan

有时候会遇到这样的需求: 一个TextView显示不同的样式,并且分别可点击,那么就需要用到ClickableSpan这个类用法步骤: 1.定义一个类继承ClickableSpanpublic class UserClickSpan extends ClickableSpan{ private Integer userId; private Activity ctx;

2016-11-15 12:58:27 524

原创 基于PorterDuffXfermode或Shader绘制圆角图片

基于PorterDuffXfermode方式 canvas原有的图片可以理解为背景,就是dst; 新画上去的图片可以理解为前景,就是src。/** * Created by star on 2016/6/15 * 功能:基于PorterDuffXfermode的圆角图片 */public class RoundRectImageView extends ImageView {

2016-09-26 16:00:24 293

原创 Android 6.0权限适配

新增API ContextCompat.checkSelfPermission 检测当前app是否拥有某些权限ActivityCompat.requestPermissions() 申请某些权限onRequestPermissionResult回调权限申请结果ActivityCompat.shouldShowRequestPermissionRetional向用户解释权限的作用使用流程

2016-09-25 13:42:14 295

原创 流式标签

先上图片看效果 思路很简单,就是垂直的LinearLayout里面添加水平的LinearLayout,然后再往水平的LinearLayout里面添加tag/** * Created by star on 2016/9/9 * 功能:流式标签 */public class UserTagsView extends LinearLayout { //每一行的LinearLayout

2016-09-22 16:19:51 283

原创 Android Studio Gradle配置

使用Android studio创建的项目会默认生成两个build.gradle文件(一个位于根目录下,一个位于app目录下)和一个setting.gradle文件根目录下的build.gradle一般内容如下buildscript { repositories { //使用jcenter()依赖库 jcenter() } dependen

2016-08-30 17:33:39 254

空空如也

空空如也

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

TA关注的人

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