Fragment浅析
基本使用Fragment的使用一般涉及到两个类:FragmentManager和FragmentTransaction。
12val fragmentManager = supportFragmentManagerval fragmentTransaction = fragmentManager.beginTransaction()
可使用 FragmentManager 执行的操作包括:
通过 findFragmentById()或 findFragmentByTag()获取 Activity 中存在的片段。
通过 popBackStack()(模拟用户发出的返回命令)使片段从返回栈中弹出。
通过 addOnBackStackChangedListener() 注册侦听返回栈变化的侦听器。
可以从 FragmentManager 获取一个 FragmentTransaction 实例,然后使用 add()、remove() 和 replace() 等方法,为给定事务设置您想要执行的所有更改。然后,如要将事务应用到 Activity,您必须调用 commit()。
12345va ...
UML类图详解
UML类图详解参考来源:学习并理解 23 种设计模式
在线画UML图的工具
visual-paradigm Online
概览
A class diagram describes the structure of an object-oriented system by showing the classes in that system and the relationships between the classes. A class diagram also shows constraints, and attributes of classes.
类图通过显示该系统中的类以及这些类之间的关系来描述面向对象系统的结构。类图还显示了类的约束和属性。UML类图通常长这样:
关系1.1 Generalization/泛化/继承泛化是一般事物(称为超类)与特定事物(称为子类)之间的关系。泛化有时被称为“是一种”关系,是通过继承过程建立的。在这类结构中,子类实现具体细节,父类提供通用模板。
继承用一条带空心箭头的直接表示。
1.2 实现实现是两件事之间的关系,其中一件事(一个接口)指 ...
Jetpack源码解析(四)之Data Binding
Jetpack源码解析四之Data BindingData Binding(数据绑定库)是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。
所谓声明式UI,就是你在代码中做出的任何改变,都会实时的在界面中展示出来。与之对应的是命令式UI,当你想要改变界面时,必须调用XX.setText()之类的代码,才能使界面做出改变。
声明式/命令式用传统的命令式UI,当要改变数据时,要如下操作:
123findViewById<TextView>(R.id.sample_text).apply { text = viewModel.userName}
而用数据绑定后,只需在xml中声明如下,无需任何逻辑代码,当username变化时,组件自动发生变化。
12<TextView android:text="@{viewmodel.userName}" />
Data Binding并不仅仅是为了取代findViewById()。如果你的主要 ...
Jetpack源码解析(三):ViewModel解析
Jetpack源码解析之ViewModelViewModel 最早是在 2017 年的 Google I/O 大会上被提出,同时间问世的还有 Lifecycle 和 LiveData。
Google开发团队希望我们用ViewModel来管理页面状态相关信息,并建议我们搭配LiveData一起食用。
基本使用依赖(可选),activity-ktx artifact。
1implementation "androidx.fragment:fragment-ktx:1.2.5"//by viewModels()
ViewModel和Activity/Fragment相绑定,被视图持有。ViewModel存在的时间范围是从首次请求ViewModel直到 Activity 完成并销毁,所以ViewModel类让数据可在发生屏幕旋转等配置更改后继续留存。
12345678910111213141516class MyViewModel : ViewModel() { private val users: MutableLiveData<List<U ...
LiveData后续--关于LiveData粘性事件所带来问题的解决方案
关于LiveData粘性事件所带来问题的解决方案参考文章KunMinX:重学安卓:LiveData 数据倒灌 背景缘由全貌 独家解析
Android开发者:[译] 在 SnackBar,Navigation 和其他事件中使用 LiveData(SingleLiveEvent 案例)
美团技术团队:Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus
我们之前研究LiveData时候有讨论到LiveData天生就是支持“粘性”事件传递的,但和EventBus不同,LiveData并没有开关让我们将其配置为”非粘性”状态,这也就造成在我们不需要处理这类事件时,会变得束手无策。这篇文章主要针对这个问题进行探讨。
方法一:反射干涉Version通过上一篇文章的源码解析,我们可以清晰的了解到,LiveData判断这个事件是否分发出去的关键在considerNotify方法中。
123456789101112131415private void considerNotify(ObserverWrapper observer) { if (!ob ...
Jetpack源码解析(二):LiveData解析
JetPack作为Google官方推荐的一套标准化开发套件,很值得去使用和学习。
这篇介绍LiveData。LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
基本使用LiveData本质是一个①遵循生命周期、②可供观察的存储类。
使用姿势1
使用姿势2
乍一看和我们之前学的EventBus、RxBus之类的事件总线很像,不就是个观察者模式嘛。姿势2不就是反映出黏性的状态嘛。
事实也是如此。
不过它具有生命周期感知能力,LiveData 只会将更新通知给活跃的观察者。为观察 LiveData对象而注册的非活跃观察者不会收到更改通知。
Google官方不建议我们这样直接在Activity中使用,而是将LiveData放在ViewModle中,Activity中只负责监听及变化后的处理事件。以构建成MVVM架构。
源码解析
Mutab ...
JetPack源码解析(一):Lifecycle解析
JetPack源码解析(一):Lifecycle解析JetPack作为Google官方推荐的一套标准化开发套件,很值得去使用和学习。
这篇介绍Lifecycle。Lifecycle是这一套控件基石。其他组件都或多或少有用到或者关联到Lifecycle,其作用是构建生命周期感知型组件,对全局的生命周期进行管理。
基本使用0.依赖(可选)12345678//本文以当前稳定版本2.2.0展开def lifecycle_version = "2.2.0"// Lifecycles only (without ViewModel or LiveData)implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" // alternately - if using Java8, use the following instead of lifecycle-compilerimplementation "androidx.lifecycle:lifecycl ...
AsyncTask不完全解析
AsyncTask不完全解析简介AsyncTask是一个专注于UI线程 和 后台线程 之间进行交流的辅助类。 一般用于 由后台线程发起指定计算任务,并将其结果展示在UI线程上 的场景。
目前已被弃用(因为持有context引用,有可 能造成内存泄漏,缺失回调等原因),官方推荐采用 java.util.concurrent 或者 Kotlin协程 代替。但还是值得学习下。
使用AsyncTask是一个抽象类,必须被子类继承使用。 继承后必须要实现doInBackground方法,里面写需要在后台执行的任务;通常还会实现onPostExecute,里面做UI界面想要做的操作。
12345678910111213141516171819202122private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; ...
行为参数化/策略模式 && Lambda表达式
行为参数化/策略模式 && Lambda表达式这篇文章不涉及Lambda表达式的具体使用,只谈谈我对其的一些理解。不一定对,如有偏颇,望指正。
行为参数化/策略模式Java是一门面向对象的语言。
奉行一切皆对象,需要什么就把这个他当作对象传递进来。不过有一个东西Java不能直接将其作为对象——方法。
这里的方法可不是Java反射中的Method类。举个栗子~
有个方法需要传入两个Int,一个计算的方法,最后输出计算的值。我们也不知道这个方法会有哪些可能的行为,所以也不能定义一个类与现实中的+-*/方法一一对应。
这时候我们就会想起设计模式中的策略模式。
定义一个接口,里面一个运算方法。
123456789class CalTest<T>{ public interface Calculation<T> { T onCalculate(int a,int b); } public T calculate(int a,int b,Calculation<T> cal) ...
EventBus的不完全解析
EventBus的不完全解析EventBus的使用
注册
1EventBus.getDefault().register(context);
定义subscriber
1234@Subscribe(sticky = false)public void getSubMsg(MsgEvent msg){ System.out.println("I got msg :"+msg);}
发送消息
1EventBus.getDefault().post(new MsgEvent());
发送黏性消息
1EventBus.getDefault().postSticky(new MsgEvent());
流程图解
EventBus的流程getDefaultgetDefault是一个获取EventBus单例的方法。EventBus内部采用了是双重校验锁的单例模式。
123456789101112public static EventBus getDefault() { EventBus instance = defau ...