IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android笔记 -> 正文阅读

[移动开发]Android笔记

1.kotlin-android-extensions原理及被废弃可能原因

会自动生成一个findCachedViewById的函数,从这个函数里获取一个HashMap的id资源id所对应的实例缓存,如果没有缓存,就会调用findViewById函数来查找控件实例,并写入HashMap缓存中。问题是每个Activity都需要一个额外的HashMap来存储所有控件的实例,增加了一些内存开支。

2.viewBinding的原理及使用

一旦启动了ViewBinding功能之后,Android Studio会自动为我们所编写的每一个布局文件都生成一个对应的Binding类。比如说,前面我们定义了一个activity_main.xml布局,那么与它对应的Binding类就是ActivityMainBinding。如果有些布局文件你不希望为它生成对应的Binding类,可以在该布局文件的根元素位置加入如下声明:tools:viewBindingIgnore="true”。使用如下:

val binding = ActivityMainBinding.inflate(layoutInflater)

setContentView(binding.root)

binding.textView.text = "Hello"

3.IO操作

SP的写入是基于IO操作的,为了了解IO,需要了解用户空间和内核空间,虚拟内存被操作系统划分为两块(用户空间和内核空间)用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。

?

写入文件流程:

==调用write,告诉内核需要写入数据的开始地址和长度

==内核将数据拷贝到内核缓存

==由操作系统调用,将数据拷贝到磁盘,完成写入

4.MMAP

Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射。

对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系。

实现映射关系后,就可以采用指针的方式读写操作这一段内存,系统会自动回写到对应的磁盘上

MMAP优势:

-MMAP对文件的读写操作只需要从磁盘到用户主存的一次数据拷贝过程,减少了数据的拷贝次数,提高了文件读写效率。

-MMAP使用逻辑内存对磁盘文件进行映射,操作内存就相当于操作文件,不需要开启线程,操作MMAP的速度和操作内存的速度一样快;

-MMAP提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统如内存不足、进程退出等时候负责将内存回写到文件,不必担心 crash 导致数据丢失。

5.mmkv优点

-1.MMKV实现了SharedPreferences接口,可以无缝切换

-2.通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。

-3.MMKV数据序列化方面选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现

-4.SP是全量更新,MMKV是增量更新,有性能优势

6.butterKnife简单实现

-使用注解加反射实现,注解如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface MlBindLayoutId {

? ? int value();

}

-使用反射获取类信息,方法,使用方法调用value

fun injectLayoutId(activity: Activity){

? ? //获取 Activity的对象

? ? val javaClass = activity.javaClass

? ? //判断是否有ML注解

? ? val annotationPresent = javaClass.isAnnotationPresent(MlBindLayoutId::class.java)

? ? if (annotationPresent){

? ? ? ? val layoutId = javaClass.getAnnotation(MlBindLayoutId::class.java)

? ? ? ? val id=layoutId.value

? ? ? ? Timber.d("=====injectLayoutId===$id")

? ? ? ? //拿到setContentView方法

? ? ? ? try {

? ? ? ? ? ? val setContentViewMethod=javaClass.getMethod("setContentView",Int::class.java)

? ? ? ? ? ? setContentViewMethod.invoke(activity,id)

? ? ? ? }catch (e:Exception){

? ? ? ? ? ? e.printStackTrace()

? ? ? ? }

? ? }

}

-如果有接口回调(比如点击事件),需要使用动态代理方式调用

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:49:24  更:2021-11-11 12:50:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:39:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码