自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 资源 (1)
  • 收藏
  • 关注

原创 LiveData出现的问题

1.LiveData的postvalue()存在数据丢失问题从源码中我们发现,当我们调用postValue()时,内部首先将value值存到mPendingData中,然后向主线程调用一个runnable,在runnable中调用setValue将值设置上去,并通过所有的观察者,那么若是在runnable执行之前多次调用postValue(),也只是将之前的值给覆盖了,并不会多次触发runnable,最总runable会被执行一次,设置最后的那个值,从而导致事件丢失 protected

2022-04-16 23:25:12 3481

原创 MediatorLiveData源码解析

作用MediatorLiveData 可以接管普通的 LiveData,使得当 LiveData 有数据更新的时候,MediatorLiveData 也能够 “收到响应”实例 class mainactivity : appcompatactivity{ private val originData = MutableLiveData<String>() private val mediatorLiveData = MediatorLiveData&lt

2022-04-16 21:54:04 968

原创 LiveData源码解析

定义LiveData是一个可观察者的数据存储类,它与其它的观察者不一样的是可以感知activity/fragment的生命周期,确保LiveData仅更新处于活跃状态生命周期的应用组件观察者。特点可以注册与实现lifecycleowner接口的对象配对的观察者。有了这种关系,当对应的lifecycle对象的状态变为destory时,可以动态移除观察者,无需我们手动处理,可以很好的避免内存泄漏问题。优点不会发生内存泄漏,无需手动移除观察者 观察者会绑定到lifecycle对象,并在其关

2022-04-16 16:48:39 486

原创 设计模式之构建者模式

定义将一个复杂对象的构造与它的表示分离,使相同的构建过程可以创建不同的表示。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成优缺点优点封装性好,构建和表示分离扩展性好,各个具体的建造者相互独立,有利于系统的解耦客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其他模块产生任何影响缺点产品的组成部分必须相同,这限制了其使用范围若产品内部发生变化,则建造者也需同步修改,提高了维护成本模式的结构产品角色(Product):它是包含多

2021-12-08 14:14:29 150 1

原创 设计模式之工厂模式

工厂模式定义一个创建产品对象的工厂接口,将产品对象的实例创建工作推迟到具体子类工厂类中,满足了"创建和使用相分离"的特性分类简单工厂工厂方法抽象工厂产品:客户端需要创建的对象工厂:创建产品的类产品族:同一具体工厂所生产的位于不同等级的一组产品简单工厂模式定义 又称静态工厂模式,在Java中定义了一个类来负责创建其他类的实例,被创建的实体通常具有共同的父类优缺点优点工厂类包含必要的逻辑判断,可以决定创建哪一个产品的实例;客户端无需关心

2021-12-07 17:39:24 336

原创 设计模式之适配器模式

1.定义 * 将一个接口转换为客户端希望的另外一个接口,属于结构化模型,适用于原本因接口不兼容而不能一起工作的那些类可以一起工作2.使用场景系统需要现有的类,而此类接口不符合系统需要通过接口转换,将一个类插入另一个类系中3.实现方式类适配器(继承)对象适配器(对象组合)4.优缺点优点 可以让任何两个没有关联的类一起运行 提高子类的复用 增加子类的透明度 灵活性好缺点 过多的使用适配器,会让系统变得复杂5.实现之对象适配器实现思路有一

2021-12-03 15:59:21 599

原创 ComponentActivity/Fragment是如何在生命周期方法发生改变时触发了LifecycleObserver中使用OnLifecycleEvent注解的方法?

当使用MVVM框架时,ViewModel会实现LifecycleObserver接口类,使用OnLifecycleEvent注解声明当生命周期发生改变时会回调的方法,从而在ViewModel层也可以监听到生命周期。那么它是如何实现的?首先我们要了解一些基础相关的知识点1.LifecycleObserver:是一个接口,没有声明任何抽象方法,就是为了标识其子类实现是LifecycleObserver这一类型;也是一个观察者,观察Activity/Fragment的生命周期状态改变 public int

2021-11-19 15:50:04 3265

原创 LinkedHashMap

1.概述LinkedHashMap继承HashMap,其多种操作都是建立在HashMap操作的基础上。与HashMap不同的是,LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry的顺序,默认是按照插入顺序,另外一种是访问顺序2.LinkedHashMap和HashMap的区别HashMap结构图LinkedHashMap结构图从结构图上看,LinkedHashMap就是在HashMap的基础上,通过双向链表将各个桶中的结点串联起来,这样可以维护元素

2021-10-29 21:07:24 1174

原创 HashMap和HashTable的区别

产生时间不同HashTable是在Java发布时就提供了键值映射的数据结构,现在已被弃用HashMap在JDK1.2才发布,线程不安全继承父类不同HashMap继承AbstratMap类,同时实现了map,Cloneable,Serializable三个接口HashTable继承Dictionary类,同时实现了map,Cloneable,Serializable三个接口对Null Key和Null Value的支持不同HashTable不支持null key/null va

2021-10-27 20:46:15 1349

原创 HashMap

什么是HashMap?HashMap是一个散列表,它是通过键值对(key-value)的形式来存储数据继承关系位于java.util包中,继承AbstractMap抽象类,实现了map、Cloneable、java.io.Serializable 接口优缺点优点可快速进行访问可允许空key/空value无序,不会记录插入的顺序缺点线程不安全。在多线程环境下哈希桶中的链表容易形成环,导致cpu占用率变高(https://coolshell.cn/articles/9

2021-10-27 16:31:30 207

原创 设计模式之观察者模式

定义 发布订阅模式。在对象之间定义了一对多的依赖,当一个对象发生改变,依赖它的对象都会收到通知并自动更新构成部分抽象被观察角色一个抽象主题,它把所有对观察者对象的引用保存到一个集合中,每一个主题都可以包含任意数量的观察者。抽象主题提供了一个接口,可以增加和删除观察者角色具体被观察者角色 具体的主题,当内部状态改变时,会向所有的观察者发出通知抽象观察者角色为具体观察者提供接口,在接收到被观察者的通知后更新自己具体观察者角色实现观察者角色的接口使用场景微信

2021-08-23 16:22:39 67

原创 Json

什么是Json?Json(Java Script Object Notation)是一种轻量级的数据交换格式作用数据标记,传输,存储Json解释示意图 序列化/反序列化 Json <---------------> Java Object i i

2021-08-21 09:58:09 61

原创 Json解析方式之org.json的使用

解析原理基于文件驱动,需要把全部文件读入到内存中,然后遍历所有数据,根据需要检索想要的数据代码实例 public class OrgJson { static class Student{ private String name; private String sex; private int age; public List<Course> getList() {

2021-08-21 09:55:07 959

原创 json解析之FastJson的使用

实例导入依赖包 implementation'com.alibaba:fastjson:1.2.57'实例代码 import com.alibaba.fastjson.JSONObject;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;public class

2021-08-21 09:53:53 462

原创 Json解析之Jackson的使用

解析原理基于事件驱动解析过程类似Gson,先创建一个与json字符串相对应的java bean,再通过简单的操作即可解析。但与Gson不同的时,Gson可以按需解析,JavaBean中字段不需要全部覆盖Json字符串中字段;而Jackson解析对应时JavaBean必须要全部覆盖json中的字段实例导入依赖包 //如何配置jackson https://mvnrepository.com/search?q=jackson implementation 'com.faster

2021-08-21 09:52:56 121

原创 Gson源码解析之GsonBuilder

当Json序列化和反序列化操作时需要创建Gson对象来帮助完成,而创建Gson的方式有两种方式方式1:直接创建Gson对象,然后对json字符串进行序列化和反序列化操作 public static class ExposeBean { public String firstName; public String lastName; public String emailAddress; public String pa

2021-08-20 23:45:32 2852

原创 Gson源码之反序列化(json 字符串转换为 Java Array)

1.将一个json 字符串转换为 Java 集合的例子public class GsonDeserializer { static class AuthorsBean{ private String id; private String name; public String getId() { return id; } public void setId(String id) {

2021-08-19 22:09:35 1095

原创 Gson源码之反序列化(json 字符串转换为 Java Object)

1.将一个json 字符串转换为 Java Bean的例子public class GsonDeserializer { private String name; private List<AuthorsBean> authors; public String getName() { return name; } public void setName(String name) { this.name = name

2021-08-19 10:56:27 873

原创 Json解析之Gson的使用

1.实现原理 基于事件驱动2.JsonElement 抽象类,代表json中的某一个元素(jsonObject/jsonArray/null/基本类型)3.Gson解析流程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XSd1FFAg-1629212570892)(https://note.youdao.com/s/C9gFApQa)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nL8eoUeF

2021-08-17 23:23:30 463

原创 Gson源码之序列化(Java Array转String)

通过Gson将Java Array(数组)转换为String的入口是toJson(),那它到底做了什么?1.Gson的构造函数主要是初始化factories (TypeAdapterFactory 集合),便于在getAapter()根据数据类型返回对应的TypeAdapterFactory,从而获取对应的TypeAdapter进行序列化和反序列化。 toJson()是序列化入口,首先会判断传入的数据是不是空,如为空则调用参数为JsonElement的toJson()方法;若不为空则调用传入Object和

2021-08-17 22:53:17 923

原创 Gson源码之序列化(Java Object转String)

通过Gson将Java Bean转换为String的入口是toJson(),那它到底做了什么?1.Gson的构造函数主要是初始化factories (TypeAdapterFactory 集合),便于在getAapter()根据数据类型返回对应的TypeAdapterFactory,从而获取对应的TypeAdapter进行序列化和反序列化。 toJson()是序列化入口,首先会判断传入的数据是不是空,如为空则调用参数为JsonElement的toJson()方法;若不为空则调用传入Object和Class

2021-08-17 22:35:57 1603

原创 Gson源码解析之JsonReader/JsonWriter

JsonWriter1.包装了Writer, 进行数据的写入,用于序列化操作 beginObject:通过open()写入json是object的起始符号{,在写入数据之前需要调用该方法 endObject:通过clase()写入json是object的结束符号} 在写入数据结束后需要调用该方法 beginArray:通过open()写入json是array的起始符号[,在写入数据之前需要调用该方法 endArray:通过close()写入json是array的结

2021-08-17 21:48:59 678

原创 Gson源码之TypeAdapterFactory

TypeAdapterFactory1.接口类,主要是用来创建TypeAdapter对象的2.若Json中的数据结构相同,可以进行共享3.其实现类分别是JsonAdapterAnnotationTypeAdapterFactory/ReflectiveTypeAdapterFactory/以及TypeAdapters中各种已经数据类型对应的factory源码 public interface TypeAdapterFactory { /** * 创建一个类型

2021-08-17 21:44:25 700

原创 Gson源码之TypeAdapter

TypeAdapter1.抽象泛型类 抽象方法为write/read方法2.该类主要用于进行读写操作,用于Json字符串和java object之间进行转换方法说明 write(JsonWriter out, T value) 抽象方法 参数是JsonWrite以及java object。客户端用于进行写入操作 toJson(T value) 创建JsonWriter对象,然后将其和value一起传入write方法中 用于将Java Object转换为Js

2021-08-17 21:27:40 727

原创 Gson源码解析之JsonElement

Gson组成之JsonElement抽象类。抽象方法是deepCopy()是Gson数据类型的基础类,其子类有对象(JsonObject),数组(JsonArray),空数据(JsonNull), JsonPrimitive(基本数据类型 byte/short/char/boolean/int/long/double/float/number/string) 用于标识各种数据类型通过isJsonObject()/isJsonArray()/isJsonNull()/isJsonPrimitive()

2021-08-17 21:09:13 2122

原创 Gson源码之Type和TypeToken

Type1.定义 是Java中所有类型的公共高级接口,代表了Java中的所有类型 2.类型体系 数组类型(GenericArrayType) 例如泛型数组 T[] 参数化类型(ParamterizedType) 例如list/map 类型变量(TypeVariable) 通配符类型(WildcardType) 例如 <?>. <? extend T> 原

2021-08-17 20:42:47 1367

原创 Gson源码解析之注解

在Gson中有五种注解Gson注解之Expose1.该注解作用于属性,在运行时有效2.主要设置属性是否参与序列化和反序列化3.默认有两个方法 serialize() 是否参与序列化 true:参与序列化 false:不参与序列化。默认为true deserialize() 是否参与反序列化。true:参与反序列化 false:不参与反序列化 默认为true4.源码 @Documented @Retention(RetentionPolicy.RUNTIM.

2021-08-17 18:31:57 2000

原创 Java之拷贝

定义通过原型实例指定创建对象的类型,并通过对象的拷贝原型,来实现对象的创建。它是一种创建型设计模式,能够复制已有对象,而代码不会过度依赖他所属的类原理将一个原型实例对象传递给药发送创建的对象,要发送创建的对象通过请求原型实例对象拷贝来实现对象的创建使用场景1.需要复制一些对象,同时又希望代码独立于这些对象所属的具体类2.当创建给定类型的实例过程很复杂时作用更简单的获取相同或相似的对象实例,在java中就是拷贝,克隆优点简化了对象的创建对于创建对象,和new 对象相比在

2021-07-24 22:53:10 179 2

原创 将项目通过Android Studio发布到Jcenter仓库

什么是Jcenter仓库?个人认为Jcenter类似于git/svn,是一个项目管理工具,我们可以用它存储一些公共的组件,类库,插件等实现共享功能,同时我们可以对其版本进行控制。那我们在项目的开发过程,当需要某个组件或类库,直接依赖即可,无需复制代码,或依赖一个module了,基本是一句代码可以搞定。如何将我们的项目发布到JCenter进行共享了?使用Bintray将项目发布到JCen...

2019-09-14 12:59:33 363

原创 进程优先级

前言在Android系统中每一个App都是独立的,拥有自己的进程,但当系统资源紧张时会杀掉一部分进程释放内存,那么系统是如何选择那些杀掉那些留下呢? 这就涉及到进程优先级问题进程优先级前台进程可与用户交互的进程 可与用户交互的Activity(已调用onResume()) 有广播接受者(BroadcastReceiver)正在接收广播 有服务(Service)正在执...

2019-09-08 23:18:38 235

原创 Android Apk在手机上安装失败问题解决

之前在做App版本更新的时候,发现在5.0以上的手机上会出现安装失败崩溃的问题,之前一直好好的,突然出现这个问题,直接是蒙蔽状态,但又必须解决,所以只有对出现的问题进行跟踪,最后解决了,在这里做一下记录问题1APK在7.0以上手机若不设置FileProvider会直接安装崩溃并抛类似下面的异常,刚才是还以为是安装包路径写错了,后来才发现是在7.0中为了提高应用的安全性,引入私有目录被限...

2019-08-09 14:59:07 7440 1

原创 屏幕适配问题

问题刚刚接手项目的时候,发现很多UI布局都是直接写的多少dp,完全没有考虑到适配问题,所以发现app的安装到手机上时,有些手机的ui显示是完全变形了,所以不得不想办法解决屏幕的适配问题,因为android平台碎片化的原因,需要对许多不同的机型进行适配,查了一些资料,整理了一些解决方案解决方案方案1针对不同的机型,我们创建不同的屏幕尺寸的的values文件夹,然后创建dimens...

2019-08-09 11:44:27 404

原创 Activity相关知识点总结

1.Activity的生命周期方法有哪些onCreate()onStart()onRestart()onResume()onPause()onStop()onDestory()[外链图片转存失败(img-iVfZFMOl-1565250970044)(https://i.imgur.com/4YLHcjB.png)]2.当Activity A 被创建时,会走什么样的...

2019-08-08 15:56:25 165

原创 启动页的适配

启动页的适配问题当应用启动的时候,系统会判断当前应用的进程是否已被创建,若没有创建则需要为这个引用创建一个进程,并且初始化Application,那这都需要一定的时间的,而系统为了让用户知道已经点击了应用图标,所以会创建一个白色或黑色窗口(Window),直到Application初始化完成才进入启动页(也就是我们说的冷启动),这样会大大的减少用户的体验感解决方案1* 为了避免在应...

2019-08-08 13:45:36 483

原创 构建者模式

构建者模式1.定义将一个复杂对象的构建与它的表示分离,使得相同的构建过程可以创建不同的表示2.实现方式方式1:通过Client、Director、Builder和Product形成的建造者模式角色Product(产品类) 描述由一系列部件组成较为复杂的对象Builder(抽象构建者) 描述具体构建者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创...

2019-07-18 22:02:42 245

原创 invalidate与postinvalidate的区别

invalidate用于进行View的刷新,在UI线程调用postinvalidate用于进行View的刷新,在非UI线程调用,将非UI线程切换到UI线程,最后也是调用invalidatepostinvalidate源码解析 public class View implements Drawable.Callback, KeyEvent.Callback,Accessibi...

2019-03-27 21:59:28 1103

原创 队列和栈的区别

队列(Queue):限定只能在表的一端进行插入和另一端进行删除操作的线性表栈(Stack)限定只能在表的一端进行插入和删除操作的线性表相同点* 它们逻辑结构和线性表相同不同点规则不同队列:先进先出(First In First Out)FIFO栈: 先进后出(First In Last Out)FILO插入和删除操作限定不同队列:只能在...

2019-03-26 13:09:54 649

原创 线程之wait()/notify()/notifyAll()/sleep()/join()/yield()

wait()/notify()/notifyAll()方法来自object类,必须在synchronized中执行,否则会抛异常wait()调用该方法会使当前线程处于等待唤醒状态,释放对象锁以及占用的资源,交给其它线程使用,该线程会加入等待唤醒队列中,notify()/notifyAll()用于从等待唤醒队列中唤醒线程。notify()是唤醒队列中的头一个;notif...

2019-03-22 12:15:54 133

原创 final

Q## finaljava中的关键字,可作用于类,方法,属性final修饰属性当属性被用final修饰时,其属性变为只读属性特点1.必须对其赋初始化值,且只能初始化一次2.如果修饰的是基本类型变量,则表示这个变量的值不能改变;如果修饰的是引用类型,则说明这个引用的地址的值不能被修改,但是这个引用所指向的对象里面的内容还是可以改变的final修饰属性当方法...

2019-03-21 11:36:13 91

原创 Synchronized

定义Java中的关键字,是一种重量级同步锁修饰的对象 修饰对象 作用对象 方法块 调用该代码块的对象 synchronized(this) {} 修饰方法 调用该方法的对象 静态方法 这个类的所有对象 类 ...

2019-03-21 11:35:50 90

markman文件

里面有markman的zip包以及AdobeAIRInstaller.exe文件,先安装AdobeAIRInstaller.exe,再打开markman文件即可

2017-04-08

空空如也

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

TA关注的人

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