ViewModel.md
ViewModel
可以提供和管理UI界面数据。(将加载数据与数据恢复从 Activity or Fragment中解耦)
可感知生命周期的组件。
不会因配置改变(Configuration change)而销毁。
可以配合 LiveData 使用。
多个 Fragment 可以共享同一 ViewModel。
Configuration change的情况:
屏幕旋转
Activity重建:
屏幕旋转
用户手动切换系统语言
系统内存不足,应用在后台被系统杀掉,然后用户再进入应用
系统杀后台跟屏幕旋转最大的不同是:杀后台Activity不会走onDestory()和onRetainCustomNonConfigurationInstance()方法。
对于我个人而言,ViewModel是数据与View层还有Model层分离的手段,为什么要分离呢?第一,层次化。使得数据、视图的分层更加合理,方便管理和扩张。第二,脱离声明周期。以往数据没有分离,数据是与视图绑定的,众所周知,视图的声明周期极其复杂,数据的管理也会受到影响,所以分离就极其重要了。
管理数据,把VIEW中的数据独 ...
ViewModel.md
ViewModel
可以提供和管理UI界面数据。(将加载数据与数据恢复从 Activity or Fragment中解耦)
可感知生命周期的组件。
不会因配置改变(Configuration change)而销毁。
可以配合 LiveData 使用。
多个 Fragment 可以共享同一 ViewModel。
Configuration change的情况:
屏幕旋转
Activity重建:
屏幕旋转
用户手动切换系统语言
系统内存不足,应用在后台被系统杀掉,然后用户再进入应用
系统杀后台跟屏幕旋转最大的不同是:杀后台Activity不会走onDestory()和onRetainCustomNonConfigurationInstance()方法。
对于我个人而言,ViewModel是数据与View层还有Model层分离的手段,为什么要分离呢?第一,层次化。使得数据、视图的分层更加合理,方便管理和扩张。第二,脱离声明周期。以往数据没有分离,数据是与视图绑定的,众所周知,视图的声明周期极其复杂,数据的管理也会受到影响,所以分离就极其重要了。
管理数据,把VIEW中的数据独 ...
Android 插件化.md
插件化Android 插件化技术,可以实现功能模块的按需加载和动态更新,其本质是动态加载未安装的 apk 。Android 程序每次更新都要下载一个完整的 apk,而很多时候软件只是更新了一 个小功能而已,这样的话,就显得很麻烦。如果把 android 程序做成主程序+插 件化的形式呢,这样才利于小功能的扩展(比如一般 App 的皮肤样式就可以看 成一个插件)。
主要原理插件化要解决的三个核心问题:类加载、资源加载、组件生命周期管理。
类加载主要利用 Java ClassLoader 的原理,如 Android 的 DexClassLoader,可动态加载的内容包括 apk、dex、jar 等。在Android中,常用的两种类加载器:PathClassLoader 和 DexClassLoader,它们都继承于 BaseDexClassLoader 。
123456789public class PathClassLoader extends BaseDexClassLoader { public PathClassLoader(String dexPath, C ...
Android 消息机制 Handler.md
前置知识:
ThreadLocal
Android系统是由消息机制驱动的。
在主线程不能做耗时操作,而子线程不能更新UI,所以我们需要把号是工作放到子线程,再把有关UI的操作切换到主线程中执行。这时候我们就需要一个工具。
Handler的作用就是跨线程通信,其主要由四大部分构成:
Handler(消息处理器):负责Message的发送及处理。主要向消息池发送各种消息事件(Handler.sendMessage())和处理相应消息事件(Handler.handleMessage()),按照先进先出执行,内部使用的是单链表的结构。
Message(消息):需要被传递的消息,消息分为硬件产生的消息(如按钮、触摸)和软件生成的消息。
MessageQueen(消息队列):负责消息的存储与管理,负责管理由 Handler发送过来的Message。读取会自动删除消息,单链表维护,插入和删除上有优势。在其next()方法中会无限循环,不断判断是否有消息,有就返回这条消息并移除。
Looper(消息池):负责关联线程以及消息的分发,在该线程下从 MessageQueue获取 Message,分发 ...
Context详解.md
Contextt源码简单分析:
属性
方法
Context最主要的功能是加载和访问资源:
Context的实现类:
Activity
Service
Application
其它实现
选择Activity还是getApplicationContext?
Context.runOnUiThread方法
App和页面的注册以及生命周期-app和页面的注册以及生命周期.md
globalData。
3.注册页面注册页面
对于小程序中的每个页面,都需要在页面对应的 js 文件中进行注册,指定页面的初始数据、生命周期回调、事件处理函数等。
简单的页面使用Page构造器进行构造。
复杂的页面使用Component构造器进行构造。
小程序的一个页面是怎么写的呢?
前面已经介绍了,一个页面可能包括4种文件,微信客户端会先根据 页面json 配置生成一个界面,顶部的颜色和文字你都可以在这个 页面json 文件里边定义好。紧接着客户端就会装载这个页面的 WXML 结构和 WXSS 样式。最后客户端会装载 JS。
然后Page这个构造器就会生成一个页面。在生成页面的时候,小程序框架会把 data 数据和 .wxml 一起渲染出最终的结构。
注册页面时一般做什么?
在生命周期函数中发送网络请求,从服务器获取数据。
初始化一些数据,以方便被wxml引用展示。
监听wxml中的事件,绑定对应的事件函数。
其他一些监听(比如页面滚动、上拉刷新、下拉加载更多等)。
4.页面生命周期
页面生命周期
Android 富文本.md
**Android富文本的实现的几种方式**在Android开发过程中,最常见的富文本场景一般都是变色,点击跳转,或者局部变大,而我们实现的方式通常分为两种。一种是Html的方式定义在string中,通过html标签变色,变大,通过占位符填充数据。一般常用于有国际化的需求。另一种是CharSequence的setSpan设置自定义Span。功能更强大,细读也更细,便于精准操作。一般用于没有国际化需求的地方。为什么有国际化相关的要求,是因为一般setSpan的方式都是添加或者根据索引替换对应的文本,如果国际化之后中英马等语言的顺序都变了,自然效果就不同了。当然也可以通过判断语言进行不同的操作。这是后话了。
一,Html的方式实现1.1 占位符的处理先看看string xml中如何处理占位符 %N代表第N个参数,如%3代表的是第三个参数; $是结束符;
1<string name="string_test_1">学号:%1$d ;姓名:%2$s ;成绩:%3$.2f</string>
使用的时候:
1234String testStr = get ...
Retrofit
CallAdapter