android框架应用场景,Android Jetpack架构组件之 Lifecycles(使用篇)

一、概述

最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。

Android Architecture组件是Android Jetpack的一部分,它们是一组库,旨在帮助开发者设计健壮、可测试和可维护的应用程序,包含一下组件:

本片文章简单介绍其中一个组件Lifecycles,只是一个入门使用,后面会陆续介绍每个组件的使用,希望对没接触的同学有点帮助,共同学习新的东西。

二、Lifecycles的作用lifecycles简介:

Lifecycles是一个持有组件生命周期状态(如活动或片段)信息的类,并允许其他对象观察此状态。生命周期使用两个主要枚举来跟踪其关联组件的生命周期状态:Event:从框架和Lifecycle类派发的生命周期事件。 这些事件映射到活动和片段中的回调事件。

State:由Lifecycle对象跟踪的组件的当前状态。

142c0914553741437dcb794396003e19.png

6844903768618696711​lifecycles使用场景

Lifecycles:生命周期感知组件,从名字中就可以知道,这个方法是处理生命周期的相关的操作。在平时的开发过程中,我们难免有些逻辑的执行是和UI的生命周期相结合的,需要在特定的生命周期中执行相应的方法,我们平时做的可能就是在View中的每个周期调用Present中获取数据的方法,然后在调用View的回调接口更新UI,但现在使用Lifecycles可以使用注解和观察的模式自动调用Observe中定义好的方法。

我们看个简单的例子,我们需要在每个周期Toast周期的名字,那我们就要在每个周期方法中调用:

override fun onResume() {

super.onResume()

toast("onResume")

}

override fun onPause() {

super.onPause()

toast("onPause")

}

override fun onDestroy() {

super.onDestroy()

toast("onDestroy")

}复制代码

6844903768618696711

上述情况属于直接调用生命周期方法,当需要调用其他类中的方法并且需要回调时,此时可能会想到使用接口实现,在相应的生命周期中调用方法,在处理完数据后使用接口回调数据:生命数据处理的类MyLocationListener

class MyLocationListener {

public MyLocationListener(Context context, Callback callback) {

// ...

}

void start() {

// connect to system location service

}

void stop() {

// disconnect from system location service

}

}复制代码

6844903768618696711

2、调用类中的方法并设置回调

class MyActivity : AppCompatActivity {

var myLocationListener :MyLocationListener

override fun onCreate(...) {

myLocationListener = new MyLocationListener(this, location -> {

});

}

@Override

override fun onStart() {

super.onStart();

Util.checkUserStatus(result -> {

if (result) {

myLocationListener.start();

}

});

}

@Override

override fun onStop() {

super.onStop();

myLocationListener.stop();

}

}复制代码

6844903768618696711

上述是我们平时开发最常用的接口方法,这样做虽然也很方便,但这种模式导致代码的高度耦合,并且通常我们希望实现重量更轻的代码,这些代码更易于维护,下面我们来看看LifeCycles的使用。

三、Lifecycles的使用gradle的引入(此处已Kotlin语言为例)

// ViewModel and LiveData

implementation "android.arch.lifecycle:extensions:$lifecycle_version"

// alternatively - just ViewModel

implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin

// alternatively - just LiveData

implementation "android.arch.lifecycle:livedata:$lifecycle_version"

// alternatively - Lifecycles only (no ViewModel or LiveData).

// Support library depends on this lightweight import

implementation "android.arch.lifecycle:runtime:$lifecycle_version"

annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"

// alternately - if using Java8, use the following instead of compiler

implementation "android.arch.lifecycle:common-java8:$lifecycle_version"

// optional - ReactiveStreams support for LiveData

implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"复制代码

6844903768618696711创建MyObserver

class MyObserver(var lifecycle: Lifecycle, var callback: CallBack) : LifecycleObserver {

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)

public fun connectOnCreate() {

p("connectOnCreate")

}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

public fun connectOnResume() {

p("connectOnResume")

}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)

public fun disConnectOnDestroy() {

p("disConnectOnDestroy")

}

fun p(string: String) {

callback.update(string)

}

}复制代码

6844903768618696711创建MyObserver 继承 LifecycleObserver

传入Lifecycles和Callback,Lifecycles为绑定Activity的生命周期,CallBack用于处理数据后的回调

使用注解在每个方法上标记相应的生命周期Implementing a custom LifecycleOwner

创建Activity并实现LifecyclesOwner,重写方法:

class LifeCyclerActivity : AppCompatActivity(), LifecycleOwner {

}复制代码

6844903768618696711创建LifecycleRegistry,并返回lifecycleRegistry

lateinit var lifecycleRegistry: LifecycleRegistry

lifecycleRegistry = LifecycleRegistry(this)

override fun getLifecycle(): Lifecycle {

return lifecycleRegistry

}复制代码

6844903768618696711实例化创建MyObserver,绑定Lifecycles

var myObserver = MyObserver(lifecycle, object : CallBack {

override fun update(string: String) {

Toast.makeText(this@LifeCyclerActivity, string, Toast.LENGTH_SHORT).show()

}

})

lifecycle.addObserver(myObserver)复制代码

6844903768618696711在生命周期中设置相应的标记

在OnCreate中配置onCreate的标记

lifecycleRegistry.markState(Lifecycle.State.CREATED)复制代码

6844903768618696711

添加其他生命周期回调

override fun onResume() {

super.onResume()

lifecycleRegistry.markState(Lifecycle.State.RESUMED)

}

override fun onDestroy() {

super.onDestroy()

lifecycleRegistry.markState(Lifecycle.State.DESTROYED)

}复制代码

6844903768618696711如果你点击到SupportActivity中查看的话,会发现SupportActivity本身就实现了LifecycleOwner,LifecyclerActivity中的很多操作都已经在SupportActivity中完成了,那么上述的使用可以直接更简化为:

class LifeCyclerActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_life_cycler)

var myObserver = MyObserver(lifecycle, object : CallBack {

override fun update() {

Toast.makeText(this@LifeCyclerActivity, "Toast", Toast.LENGTH_SHORT).show()

}

})

lifecycle.addObserver(myObserver)

}

}复制代码

6844903768618696711

四、生命周期感知组件的最佳实践保持UI控制器(活动和片段)尽可能,不应该在活动或片段中直接获取数据;相反,使用VIEW模型来做这件事,并观察LiveData 对象,以将更改反映回视图

尝试编写数据驱动的UI,其中UI控制器的职责是在数据更改时更新视图,或将用户操作通知回VIEW模型。

将数据逻辑放在VIEW模型类中。VIEW模型应充当UI控制器和应用程序其余部分之间的连接器。

使用数据绑定来维护视图和UI控制器之间的干净接口。如BufferKnife

避免引用VIEW模型中的视图或活动上下文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值