![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
文章平均质量分 75
meijing11
这个作者很懒,什么都没留下…
展开
-
LiveData出现的问题
1.LiveData的postvalue()存在数据丢失问题从源码中我们发现,当我们调用postValue()时,内部首先将value值存到mPendingData中,然后向主线程调用一个runnable,在runnable中调用setValue将值设置上去,并通过所有的观察者,那么若是在runnable执行之前多次调用postValue(),也只是将之前的值给覆盖了,并不会多次触发runnable,最总runable会被执行一次,设置最后的那个值,从而导致事件丢失 protected原创 2022-04-16 23:25:12 · 3468 阅读 · 0 评论 -
MediatorLiveData源码解析
作用MediatorLiveData 可以接管普通的 LiveData,使得当 LiveData 有数据更新的时候,MediatorLiveData 也能够 “收到响应”实例 class mainactivity : appcompatactivity{ private val originData = MutableLiveData<String>() private val mediatorLiveData = MediatorLiveData<原创 2022-04-16 21:54:04 · 964 阅读 · 0 评论 -
LiveData源码解析
定义LiveData是一个可观察者的数据存储类,它与其它的观察者不一样的是可以感知activity/fragment的生命周期,确保LiveData仅更新处于活跃状态生命周期的应用组件观察者。特点可以注册与实现lifecycleowner接口的对象配对的观察者。有了这种关系,当对应的lifecycle对象的状态变为destory时,可以动态移除观察者,无需我们手动处理,可以很好的避免内存泄漏问题。优点不会发生内存泄漏,无需手动移除观察者 观察者会绑定到lifecycle对象,并在其关原创 2022-04-16 16:48:39 · 484 阅读 · 0 评论 -
ComponentActivity/Fragment是如何在生命周期方法发生改变时触发了LifecycleObserver中使用OnLifecycleEvent注解的方法?
当使用MVVM框架时,ViewModel会实现LifecycleObserver接口类,使用OnLifecycleEvent注解声明当生命周期发生改变时会回调的方法,从而在ViewModel层也可以监听到生命周期。那么它是如何实现的?首先我们要了解一些基础相关的知识点1.LifecycleObserver:是一个接口,没有声明任何抽象方法,就是为了标识其子类实现是LifecycleObserver这一类型;也是一个观察者,观察Activity/Fragment的生命周期状态改变 public int原创 2021-11-19 15:50:04 · 3248 阅读 · 0 评论 -
LinkedHashMap
1.概述LinkedHashMap继承HashMap,其多种操作都是建立在HashMap操作的基础上。与HashMap不同的是,LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry的顺序,默认是按照插入顺序,另外一种是访问顺序2.LinkedHashMap和HashMap的区别HashMap结构图LinkedHashMap结构图从结构图上看,LinkedHashMap就是在HashMap的基础上,通过双向链表将各个桶中的结点串联起来,这样可以维护元素原创 2021-10-29 21:07:24 · 1172 阅读 · 0 评论 -
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 · 1346 阅读 · 0 评论 -
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 · 204 阅读 · 0 评论 -
final
Q## finaljava中的关键字,可作用于类,方法,属性final修饰属性当属性被用final修饰时,其属性变为只读属性特点1.必须对其赋初始化值,且只能初始化一次2.如果修饰的是基本类型变量,则表示这个变量的值不能改变;如果修饰的是引用类型,则说明这个引用的地址的值不能被修改,但是这个引用所指向的对象里面的内容还是可以改变的final修饰属性当方法...原创 2019-03-21 11:36:13 · 90 阅读 · 0 评论 -
Synchronized
定义Java中的关键字,是一种重量级同步锁修饰的对象 修饰对象 作用对象 方法块 调用该代码块的对象 synchronized(this) {} 修饰方法 调用该方法的对象 静态方法 这个类的所有对象 类 ...原创 2019-03-21 11:35:50 · 89 阅读 · 0 评论 -
线程之wait()/notify()/notifyAll()/sleep()/join()/yield()
wait()/notify()/notifyAll()方法来自object类,必须在synchronized中执行,否则会抛异常wait()调用该方法会使当前线程处于等待唤醒状态,释放对象锁以及占用的资源,交给其它线程使用,该线程会加入等待唤醒队列中,notify()/notifyAll()用于从等待唤醒队列中唤醒线程。notify()是唤醒队列中的头一个;notif...原创 2019-03-22 12:15:54 · 130 阅读 · 0 评论 -
队列和栈的区别
队列(Queue):限定只能在表的一端进行插入和另一端进行删除操作的线性表栈(Stack)限定只能在表的一端进行插入和删除操作的线性表相同点* 它们逻辑结构和线性表相同不同点规则不同队列:先进先出(First In First Out)FIFO栈: 先进后出(First In Last Out)FILO插入和删除操作限定不同队列:只能在...原创 2019-03-26 13:09:54 · 647 阅读 · 0 评论 -
启动页的适配
启动页的适配问题当应用启动的时候,系统会判断当前应用的进程是否已被创建,若没有创建则需要为这个引用创建一个进程,并且初始化Application,那这都需要一定的时间的,而系统为了让用户知道已经点击了应用图标,所以会创建一个白色或黑色窗口(Window),直到Application初始化完成才进入启动页(也就是我们说的冷启动),这样会大大的减少用户的体验感解决方案1* 为了避免在应...原创 2019-08-08 13:45:36 · 481 阅读 · 0 评论 -
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 · 163 阅读 · 0 评论 -
屏幕适配问题
问题刚刚接手项目的时候,发现很多UI布局都是直接写的多少dp,完全没有考虑到适配问题,所以发现app的安装到手机上时,有些手机的ui显示是完全变形了,所以不得不想办法解决屏幕的适配问题,因为android平台碎片化的原因,需要对许多不同的机型进行适配,查了一些资料,整理了一些解决方案解决方案方案1针对不同的机型,我们创建不同的屏幕尺寸的的values文件夹,然后创建dimens...原创 2019-08-09 11:44:27 · 399 阅读 · 0 评论 -
Android Apk在手机上安装失败问题解决
之前在做App版本更新的时候,发现在5.0以上的手机上会出现安装失败崩溃的问题,之前一直好好的,突然出现这个问题,直接是蒙蔽状态,但又必须解决,所以只有对出现的问题进行跟踪,最后解决了,在这里做一下记录问题1APK在7.0以上手机若不设置FileProvider会直接安装崩溃并抛类似下面的异常,刚才是还以为是安装包路径写错了,后来才发现是在7.0中为了提高应用的安全性,引入私有目录被限...原创 2019-08-09 14:59:07 · 7418 阅读 · 1 评论 -
进程优先级
前言在Android系统中每一个App都是独立的,拥有自己的进程,但当系统资源紧张时会杀掉一部分进程释放内存,那么系统是如何选择那些杀掉那些留下呢? 这就涉及到进程优先级问题进程优先级前台进程可与用户交互的进程 可与用户交互的Activity(已调用onResume()) 有广播接受者(BroadcastReceiver)正在接收广播 有服务(Service)正在执...原创 2019-09-08 23:18:38 · 233 阅读 · 0 评论 -
将项目通过Android Studio发布到Jcenter仓库
什么是Jcenter仓库?个人认为Jcenter类似于git/svn,是一个项目管理工具,我们可以用它存储一些公共的组件,类库,插件等实现共享功能,同时我们可以对其版本进行控制。那我们在项目的开发过程,当需要某个组件或类库,直接依赖即可,无需复制代码,或依赖一个module了,基本是一句代码可以搞定。如何将我们的项目发布到JCenter进行共享了?使用Bintray将项目发布到JCen...原创 2019-09-14 12:59:33 · 361 阅读 · 0 评论 -
设计模式之代理模式
设计模式之代理模式定义 为其他对象提供一个代理以控制对这个对象的访问使用场景当被访问的对象不想暴露全部内容时,可以通过代理去掉被访问的内容。当一个对象不能或不想直接访问另一个对象时,可以通过一个代理间接的访问。为保证客户端的使用的透明性,委托对象和代理对象要实现同样的接口。UMLSubject抽象主题接口,定义了真实主题类和代理主原创 2018-01-17 13:00:59 · 93 阅读 · 0 评论 -
CountDownTimer
CountDownTimer源码解析在平时开发过程中我们可能需要一个倒计时来实现某个功能,这时候我们可以使用CountDownTimer来实现该功能作用可用于倒计时操作,内部采用Handler来实现的那我们来看一看它内部到底是如何实现?首先我们使用构造函数创建CountDownTimer对象,需要传递两个参数,并实现两个抽象方法构造函数 public CountDown...原创 2019-01-30 11:37:33 · 208 阅读 · 0 评论 -
Ble蓝牙
蓝牙1.分类 传统蓝牙 低功耗蓝牙(ble)2.API版本 传统蓝牙: 4.3(API<18)以下 低功耗蓝牙:4.3(API>=18)以上3.低功耗蓝牙较传统蓝牙的的特点: 数据传输速度相比传统蓝牙低 覆盖范围更广 延迟更短 耗电低,快速搜索和等4.蓝牙设备中存在着一个mac地...原创 2018-09-09 16:42:18 · 588 阅读 · 0 评论 -
Git总结
这几天跟着大神stormzhang学习了下git的使用,在这里做一些总结。若大家感兴趣也可去stormzhang的博客了解更多:点击打开链接1.什么是Github是一家公司,在2008年成立,位于旧金山,致力于基于git的版本托管服务。现成为最大的开源社区。网址:https://github.com2.什么是Git一款免费,开源的版本控制系统的工具,3.Git与GitHub原创 2018-01-17 13:14:20 · 120 阅读 · 0 评论 -
Rxjava之Schedulers
在rxJava/rxAndroid的使用中我们都会遇到线程控制问题,那么我们来说说它的的几种使用方式。Schedulers.immediate() 默认的scheduler,不指定线程,直接在当前线程运行。Schedulers.newThread() 启动新的线程,并在新的线程执行操作Schedulers.io() I/O操作(读写文件,读写数据库,网络请求等)所使用原创 2018-01-17 13:06:57 · 879 阅读 · 0 评论 -
设计模式之享元模式
设计模式之享元模式定义使用共享对象有效的支持大量的对象复用使用场景系统中有大量相同或相近的对象这些对象存在着相近的外观状态需要缓冲池优缺点优点降低系统对象的创建,降低内存对象的总数量,降低应用内存占用,提高性能缺点将对象分为外部状态和内部状态,导致系统变得复杂,逻辑也变得复杂UMLflyWeight 享元对象的抽象类原创 2018-01-17 13:06:06 · 107 阅读 · 0 评论 -
设计模式之模板模式
设计模式之模板模式定义定义操作中的算法框架,而将一些步骤延迟到子类中,子类可在不改变一个算法结构下重定义该算法的某些特定步骤。作用代码重构,将公共代码提取到父类中,并使用钩子方法约束其行为。重复,复杂的算法,把核心算法设计为模板方法,其他细节由子类实现优缺点优点封装了不变部分,扩展可变部分,符合开闭原则。提取公共代码,提高代码复用率,便于维护。原创 2018-01-17 13:03:23 · 138 阅读 · 0 评论 -
sophix热修复技术使用
Sophix的使用什么是Sophix?它是由阿里云提供的的一种App热修复方案,用于实时修复应用线上问题,基于阿里hotPatch技术。为什需要使用sophix?在app版本发布后,当应用发现有比较大的bug需要紧急修复或则我们要推出新的模块时,传统的方式是将bug修复后,然后重新打包,再上传到应用市场,用户进行版本更新。这种方式带来的问题是成本高,效率底。而采用热修复技术,我们可以打差异补丁,原创 2017-07-26 18:29:44 · 318 阅读 · 0 评论 -
AIDL
AIDL前言在Android中每一个应用都拥有自己独立的jvm(java虚拟机),都有其独立的内存地址空间,用于数据操作,但与其他应用不能直接进行通信,从而保证应用程序的数据安全性以及稳定性。如何解决跨进程间的通信(两个应用之间进行数据通信)?采用AnoirdIPC机制实现进程间通信什么是IPC? (Inter-Process Communication) 跨进程通信,是进程间/跨原创 2017-07-26 17:55:53 · 815 阅读 · 0 评论 -
解决Android中使用webview加载音视频返回后还有声音问题
问题:在开发中我们使用webview加载网页播放音视频后,当我们返回到上一页后继续播放原因:在加载网页播放音频时,html5的audio/video 标签将获取系统播放音频的焦点(类似将系统音频管理的权限给了标签使用),返回后焦点未被改变,网页任将获取音频的使用权限,导致音视频可能继续在后台播放。解决方案:在界面被销毁时,让网页的标签失去焦点,失去对音频的使用权限原创 2017-06-12 15:08:36 · 2994 阅读 · 0 评论 -
Editext的常用属性总结
1.设置光标颜色自定义一个drawable *edit_cursor_color.xml文件 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > 然后在editext中设置原创 2018-01-17 13:15:28 · 163 阅读 · 0 评论 -
设计模式之装饰者模式
设计模式之装饰者模式定义 又名包装者模式,客户端以透明的方式扩展对象的功能,是继承关系的替代方案。作用在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。处理那些可以撤消的职责。当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子原创 2018-02-02 11:34:19 · 136 阅读 · 0 评论 -
App启动后出现白屏或者黑屏解决方式
Android App启动后出现白屏或者黑屏解决方式原因当要打开一个Activity,而这个Activity所属的应用还没有运行,这时候系统将会为这个Activity所属的应用创建一个进程。但是进程的创建和初始化需要时间,而在这个过程中既无法显示程序又不能停止原处不做任何操作。否则用户以为没有点击到,这时候就有StartWindow的概念。StartWindow是一个在应用程序创建并初始化成...原创 2018-04-10 16:04:39 · 2558 阅读 · 0 评论 -
SharedPreference小结
SharedPreference小结特点轻量级的数据存储方式,其内部是以xml的结构保存,以键值对的形式进行存储,文件位于data/data/包名/shared_prefs目录下只支持基本数据类型,不支持自定义数据类型 <?xml version='1.0' encoding='utf-8' standalone='yes' ?><map> &...原创 2018-05-15 23:05:35 · 778 阅读 · 0 评论 -
apk反编译
反编译作用有时候我们发现某个应用的界面的效果很炫或者某个功能很牛x,你很像知道这个是怎么实现的,这时候我们可以通过反编译获取这个应用的布局文件或者代码需要工具apktool下载地址:https://github.com/pxb1988/dex2jar作用资源文件的获取,可以提取图片文件和布局文件进行查看dex2jar下载地址: https://ibotp...原创 2018-05-08 10:42:05 · 940 阅读 · 0 评论 -
多渠道打包之友盟
多渠道打包之友盟打包定义在应用中添加一个标识符,当应用在不同的平台被下载安装时,可以检测到用户是从哪个平台下载安装的。作用统计用户安装app的来源批量修改生成apk的文件名/应用名/应用logo可以更改包名,版本号实现请友盟官网申请开发者账号以及创建应用获取appkey https://www.umeng.com/在清单文件AndroidManf...原创 2018-05-06 21:44:27 · 1191 阅读 · 0 评论 -
多渠道打包之gradle
多渠道打包之gradle打包定义在应用中添加一个标识符,当应用在不同的平台被下载安装时,可以检测到用户是从哪个平台下载安装的。作用统计用户安装app的来源批量修改生成apk的文件名/应用名/应用logo可以更改包名,版本号实现在清单文件AndroidManfest.xml的application标签中添加一个meta-data标签定义MTA-CHA...原创 2018-05-06 21:38:32 · 264 阅读 · 0 评论 -
Gradle常用命令
Gradle命令最近学习了gradle的多渠道打包,在这里对gradle的一些命令进行总结,以便以后可以快速查看。gradlew手册链:https://docs.gradle.org/current/userguide/userguide.html查看gradle的版本号 ./gradlew -v清除app目录下build文件夹 ./gradlew clean...原创 2018-05-06 21:27:26 · 985 阅读 · 2 评论 -
JAVA基础之反射
JAVA基础之反射定义在运行状态下,对于任何一个类,能够获取属性和方法;对于任何一个对象,能够调用其属性和方法。简单来说反射就是解刨一个类,然后获取这个类的属性和方法,前提是获取这个类的class对象。java.lang.class 描述编译后的class文件对象 java.lang.reflect.constructor 描述构造原创 2018-01-28 23:20:38 · 105 阅读 · 0 评论 -
Dagger2初识
Dagger2初识实例地址 https://github.com/meijing779889047/dagger2Project.git注意:以下的实例说明全都是基于实例代码而定使用Dagger2的优势?避免重复的进行对象的初始化创建,使用一种更省力,更自动化的方式进行对象的创建,提高开发效率Dagger2是一种技术手段Dagger2采用ioc的设计模式,在编译的时候采用反射机制进行注入,但原创 2017-03-24 08:56:25 · 295 阅读 · 0 评论