你有多忽视Jet Pack,使用的时候你就会觉得有多香
什么是JetPack
先附上官网:https://developer.android.com/jetpack
期待解决的问题:
遵循最佳做法:Android Jetpack 组件采用最新的设计方法构建,具有向后兼容性,可以减少崩溃和内存泄露。
消除样板代码:Android Jetpack 可以管理各种繁琐的 Activity(如后台任务、导航和生命周期管理),以便您可以专注于打造出色的应用。
减少不一致:这些库可在各种 Android 版本和设备中以一致的方式运作,助您降低复杂性。
JetPack常用工具
使用:
https://developer.android.com/jetpack/androidx/releases/lifecycle(英文)
https://developer.android.com/topic/libraries/architecture(中文)
架构组件
这个模块的组件就是专门为MVVM框架服务的,但是每个库都是可以单独使用的,也是jetpack中比较重要的一大模块。
MVVM:Model—View—ViewModel。
Model层主要指数据,比如服务器数据,本地数据库数据,所以网络操作和数据库读取就是这一层,只保存数据。
View层主要指UI相关,比如xml布局文件,Activity界面显示
ViewModel层是MVVM的核心,连接view和model,需要将model的数据展示到view上,以及view上的操作数据反映转化到model层,所以就相当于一个双向绑定。
所以就需要,databinding进行数据的绑定,单向或者双向。viewmodel进行数据管理,绑定view和数据。lifecycle进行生命周期管理。LiveData进行数据的及时反馈。
DataBinding:数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。
//布局 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<EditText android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={user.name}"/>
</layout>
LifeCycle:
生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
myLocationListener = MyLocationListener(this) { location ->
// update UI
}
lifecycle.addObserver(myLocationListener)
}
internal class MyLocationListener (
private val context: Context,
private val callback: (Location) -> Unit
): LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun start() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stop() {
// disconnect if connected
}
LiveData:具有生命周期感知能力,可以感知到Activity等的生命周期。这样有什么好处呢?很常见的一点就是可以减少内存泄漏和崩溃情况了呀,想想以前你的项目中针对网络接口返回数据的时候都要判断当前界面是否销毁,现在LiveData就帮你解决了这个问题。
//导入库:
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
private val stockManager = StockManager(symbol)
private val listener = { price: BigDecimal ->
value = price
}
override fun onActive() {
stockManager.requestPriceUpdates(listener)
}
override fun onInactive() {
stockManager.removeUpdates(listener)
}
}
public class MyFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val myPriceListener: LiveData<BigDecimal> = StockLiveData("")
myPriceListener.observe(this, Observer<BigDecimal> { price: BigDecimal? ->
// 监听livedata的数据变化,如果调用了setValue或者postValue会调用该onChanged方法
//更新UI数据或者其他处理
})
}
}
这是一个股票数据对象,StockManager为股票管理器,如果该对象有活跃观察者时,就去监听股票市场的情况,如果没有活跃观察者时,就可以断开监听。
当监听到股票信息变化,该股票数据对象就会通过setValue方法进行数据更新,反应到观察者的onChanged方法。这里要注意的是setValue方法只能在主线程调用,而postValue则是在其他线程调用。
当Fragment这个观察者生命周期发生变化时,LiveData就会移除这个观察者,不再发送消息,所以也就避免崩溃问题。
行为组件
CameraX:
可以更轻松地向应用添加相机功能。该库提供了很多兼容性修复程序和解决方法,有助于在多台设备上打造一致的开发者体验
该方法具有生命周期感知能力。它还解决了设备兼容性问题,因此您无需在代码库中添加设备
使用感受:代码逻辑清晰,使用方便
实践案例
JetCompose又是什么(暂时作为了解,kotlin用不熟伤不起)?
Compose 将 Kotlin 的强大功能与响应式编程模型相结合。
Compose 提供了一种现代的方法来定义您的 UI,这使您可以有效地实现关注点分离。由于 Composable 函数与普通 Kotlin 函数很相似,因此您使用 Compose 编写和重构 UI 所使用的工具与您进行 Android 开发的知识储备和所使用的工具将会无缝衔接。
组合VS继承
封装
重组
这里有一个相似的 Composable 函数—— Messages。它接收了 LiveData 作为参数并调用了 Compose 的 observeAsState 方法。observeAsState 方法会把 LiveData 映射为 State,这意味着您可以在函数体的范围使用其值。State 实例订阅了 LiveData 实例,这意味着 State 会在 LiveData 发生改变的任何地方更新,也意味着,无论在何处读取 State 实例,包裹它的、已被读取的 Composable 函数将会自动订阅这些改变。结果就是,这里不再需要指定 LifecycleOwner 或者更新回调,Composable 可以隐式地实现这两者的功能。
本文地址:https://blog.csdn.net/china_2014/article/details/109621078