自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SharedPreferences的方法分析

SharedPreferences的方法分析查看源码,来定位问题。首先找到SharedPreferences的接口 查找接口的实现 获取实现类被调用的地方 SharedPreferences的创建通过上述步骤,可以找到SharedPreferences的创建是在ContextImpl中实现。 public SharedPreferences getSharedPreferences(String name, int mode) { // At le

2021-03-23 09:16:47 417

原创 Room 初探

RoomRoom持久性库在SQLite的基础上提供了一个抽象层,让用户能够在充分利用SQLite的强大功能的同时,获享更强健的数据库访问机制。使用Room包含Database、Entry和Dao三个部分。这里实现一个记录日志信息的数据库,包含一张 LogInfo的表单。Database首先实现日志信息数据库。/** * @author duode * @des 实现日志数据库 * 参考: https://blog.youkuaiyun.com/u014620028/article/details/90

2021-03-12 11:17:58 270

原创 DataBinding 初探

DataBindingDataBinding是把数据直接绑定到 XML 文件上,并能实现自动刷新。减少了代码的耦合性,一些如 findViewById、setText 之类的操作都可以通过绑定实现。基本用法演示将User数据绑定到 XML 上的实现。build.gradle配置启用DataBinding非常简单,只需要在对应module的build.gradle配置即可。android { .... dataBinding { enabled = true

2021-03-12 11:16:26 217

原创 LiveData 初探

LiveDataLiveData是一种可观察的数据存储器类。与常规的可观察类不同,它具有生命周期感知能力,意指它遵循其他应用组件(如Activity、Fragment或Service等)的生命周期。这种感知能力可确保LiveData仅更新处于活跃生命周期状态的应用组件观察者。特点合理的使用LiveData能具有以下优点:能够保证数据和UI统一。由于LiveData采用了观察者模式有关,LiveData是被观察者,当数据有变化时会通知观察者(UI)。减少内存泄漏。由于LiveData能够感知到组件

2021-03-12 11:15:45 136

原创 ViewModel 初探

ViewModel专门用于存放应用程序页面所需的数据。它将页面所需的数据从页面中剥离出来,页面只需要处理用户交互,以及负责展示数据的工作。生命周期ViewModel是一个抽象类,其中有一个方法onCleared(),当ViewModel不再被需要的时候,也就是与之相关的Activity或其他LifecycleOwner都被销毁时,该方法会被系统调用,我们可以在这个方法里面执行一些资源释放的操作,以免内存泄漏。使用这里直接贴上官方demo的部分代码。 class SharedViewMod

2021-03-12 11:15:02 215

原创 Lifecycle 初探

LifecycleLifecycle是Jetpack架构中的一个组件,用来监听Activity或Fragment或View的生命周期变化。其主要包含LifecycleOwner和LifecycleObserver。实现LifecycleObserver自定义一个CustomLifecycleObserver,用来观察LifeCycleOwner的事件。class CustomLifecycleObserver : LifecycleObserver { @OnLifecycleEvent

2021-03-12 11:12:20 118

原创 Kotlin Coroutine 初探(三)

Kotlin Coroutine 初探(三)和普通方法一样,协程任务执行过程中也会有需要处理异常的情况。Try Catch和普通方法一样,使用try catch进行异常处理。 fun testTryCatch() { runBlocking { val job = GlobalScope.launch { // launch 根协程 try { Log.e("Vi

2021-03-10 13:42:17 102

原创 Kotlin Coroutine 初探(二)

Kotlin Coroutine 初探(二)针对Coroutine的一些常用方法进行说明。切换协程使用withContext来进行协程的切换。 fun testChangeContext() { launch { Log.e("ViewModel", "launch--start:${Thread.currentThread().name};${Thread.currentThread().id};${coroutineContext[Job]}")

2021-03-10 13:40:26 91

原创 Kotlin Coroutine初探(一)

Kotlin Coroutine初探(一)2017年,Google 宣布Kotlin 成为 Android 的官方开发语言,并在1.1版本加入了对 Coroutine(协程,可以简单看作是轻量级线程)的支持。Coroutine是一种并发设计模式,在 Android 平台上使用它可以简化异步执行的代码。下面就让我们一起使用Coroutine进行编码吧!启动协程协程任务的构建需要通过Coroutine Builder来实现。 /** * @param context 默认所创建的 Co

2021-03-10 13:37:08 224

原创 Android进程通信之AIDL的使用

AIDL开发过程中,当我们需要需要和其他进程交互的情况时,就不得不使用到AIDL。在AIDL中我们可以使用基础类型数据、String 、CharSequence、List或Map(注意List和Map 对象的元素必须是AIDL支持的数据类)以及自己定义并申明的数据类型(此数据需要实现parcelable)。这里以自己定义的数据类型进行说明。服务端实现首先我们创建一个项目作为服务端(提供AIDL实现的项目)。创建AIDL文件定义对应的需要在AIDL中使用的数据。package com.du

2020-08-01 11:21:25 181

原创 MVP模式在Android中的规范化

标准化MVP模式不同的人对MVP有不同的层级划分,虽然都做到了数据和业务分离,但没有统一的标准,不利于后续代码的维护和扩展。这里简单对MVP模式在Android中的使用进行一些约定。MVP模式的基本概述既然我们要约定一套标准的MVP模式架构,那么首先我们需要对MVP进行简单的说明。MVP模式由来MVP从MVC演变而来,通过表示器将视图与模型巧妙地分开。MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理

2020-08-01 11:12:29 190

原创 Flutter 中 Widget 的生命周期说明

Widget的生命周期在Flutter中,我们常用的widget有两种:StatelessWidget,用于不需要维护状态的场景,它通常在build方法中通过嵌套其它Widget来构建UI,在构建过程中会递归的构建其嵌套的Widget。StatefulWidget,用于需要随着触发事件改变UI的场景。注意:这里所有的生命周期方法仅仅针对widget层以及以上,讨论render层级的方法。StatelessWidget的生命周期StatefulWidget的生命周期和StatelessWi

2020-07-14 00:33:37 428

原创 Navigation简单使用

Navigation简单使用针对Jitpack 组件中 Navigation的简单使用说明。添加依赖需要在对应模块层级的build.gradle文件中添加依赖://版本指定为当时的最新稳定版本ext.navigationVersion = "2.0.0"dependencies { //... implementation "androidx.navigation:navigation-fragment-ktx:$rootProject.navigationVersion"

2020-07-14 00:26:26 2009

原创 ConstraintLayout简单体验

ConstraintLayoutConstraintLayout(约束布局)的出现是为了在Android应用布局中保持扁平的层次结构,减少布局的嵌套,为应用创建响应快速而灵敏的界面。ConstraintLayout可以替代其他布局。由来Android Studio在3.5.+版本之后创建布局时,默认的布局根节点就是ConstraintLayout,虽然可以通过修改Android Studio的默认配置以及自己手动选择根节点来继续使用LinearLayout、RelativeLayout、GrideLa

2020-07-14 00:22:43 430

原创 为什么在项目中要慎用RxBus

为什么在项目中要慎用RxBusRxBus在之前作为Android组件间通信工具,简单方便十分受欢迎。针对在事件的发送者和订阅者之间进行解耦非常好的运用在Activitys、Fragments和后台线程避开了联系紧密易出错的依赖关系和容易出错生命周期使你的代码更加简洁##在Fragment之间传递数据假设我们需要在AFragment和BFragment之间进行数据传递,如果不使用类似RxBus这样的通信工具,我们需要使用__广播__或者__接口回调__等方式传递数据,这样极其繁琐且无法在其他

2020-07-14 00:15:05 950

原创 浮点类型如何不丢失精度的传递

浮点类型如何不丢失精度的传递用户反馈,Android版本在配件收款中,如果价格是用户输入的价格,当价格为xx.x9时,会出现显示在APP上的价格和收款价格不匹配的情况。用户自己输入的价格,由APP传递配件价格给服务器,这意味着整个配件的价格是以APP的为准。经过查询代码,发现是由于在将店员输入的价格由字符串转化为double类型来计算时,导致精度丢失。那么,这个问题是如何产生并导致,应该怎样修复这个问题呢?浮点型数据精度由于计算机内部以二进制保存,所以十进制的有限位的小数,在计算机内部会是一个无限

2020-07-14 00:12:13 827

空空如也

空空如也

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

TA关注的人

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