Android Jetpack组件支持库DataBinding与ViewModel与LiveData及Room详解

目录
  • 一、官方推荐的Jetpack架构
  • 二、添加依赖
  • 三、创建Repository
  • 四、创建ViewModel
  • 五、activity中使用

Android Jetpack之ViewModel、LiveData

Android Jetpack之LifeCycle

一、官方推荐的Jetpack架构

ViewModel是介于View(视图)和Model(数据模型)之间的中间层,能够使视图和数据分离,又能提供视图和数据之间的通信。

LiveData是一个能够在ViewModel中数据发生变化时通知页面刷新UI线程的组件库。

Room是在SQLLite上提供了一层封装。(Android采用SQLLite作为数据库存储)

二、添加依赖

implementation "androidx.activity:activity-ktx:1.2.0"
    implementation "androidx.fragment:fragment-ktx:1.3.0"

下面的案例,只是简洁的代码片段,大致介绍一下,让大家了解这个架构。具体详细代码及深度原理,请大家自行查阅其他深度讲解文章。

三、创建Repository

StudentRepository

class StudentRepository {
    var studentDao: StudentDao? = null
    constructor(context: Context) {
        val database = MyDatabase.getInstance(context)
        studentDao = database!!.getStudentDao()
    }
    //LiveData集合
    fun getAllStudentsLive(): LiveData<List<Student>> {
        return studentDao!!.getAllStudentsLive()
    }
    fun deleteAllStudents() {
        studentDao!!.deleteAllStudents()
    }
    fun queryAll(): List<Student>? {
        return studentDao!!.queryAll()
    }
    fun insertStudent(vararg student: Student?) {
        studentDao!!.insertStudent(*student)
    }
    fun deleteStudent(vararg student: Student) {
        studentDao!!.deleteStudent(*student)
    }
    fun updateStudent(vararg student: Student) {
        studentDao!!.updateStudent(*student)
    }
}

StudentDao

@Dao
interface StudentDao {
    @Insert
    fun insertStudent(vararg students: Student?)
    @Delete
    fun deleteStudent(vararg students: Student?)
    @Update
    fun updateStudent(vararg students: Student?)
    @Query("SELECT * FROM student")
    fun getAllStudent(): List<Student?>?
    @Query("SELECT * FROM student WHERE id = :id")
    fun getStudentById(id: Int): List<Student?>?
}

Repository类中是关于Dao的操作,getAllStudentsLive()方法返回的是一个LiveData集合。

四、创建ViewModel

StudentViewModel

class StudentViewModel(application: Application) : AndroidViewModel(application) {
	//初始化Repository对象
    private val repository by lazy { StudentRepository(application) }
	//定义LiveData集合
    private var liveDataStudent: LiveData<List<Student>>? = null
    init {
        liveDataStudent = repository.getAllStudentsLive()
    }
    fun getAllStudentsLive(): LiveData<List<Student>>? {
        viewModelScope.launch(Dispatchers.Default) {
            liveDataStudent = repository.getAllStudentsLive()
        }
        return liveDataStudent
    }
    private fun insertStudent(vararg student: Student) {
        viewModelScope.launch(Dispatchers.Default) {
            repository.insertStudent(*student)
        }
    }
    private fun deleteStudent(vararg student: Student) {
        viewModelScope.launch(Dispatchers.Default) {
            repository.deleteStudent(*student)
        }
    }
    private fun updateStudent(vararg student: Student) {
        viewModelScope.launch(Dispatchers.Default) {
            repository.updateStudent(*student)
        }
    }
    private fun deleteAllStudents() {
        viewModelScope.launch(Dispatchers.Default) {
            repository.deleteAllStudents()
        }
    }
	//以下为DataBinding布局调用的方法-------------------
    fun mInsert() {
        val s1 = Student("zhangsan", 26)
        val s2 = Student("lisi", 18)
        insertStudent(s1, s2)
    }
    fun mClear() {
        deleteAllStudents()
    }
    fun mDelete() {
        var s1 = Student(3)
        deleteStudent(s1)
    }
    fun mUpdate() {
        val s1 = Student(2, "wanger", 21)
        updateStudent(s1)
    }
}

初始化数据库Repository,创建一个livedata集合的属性,并提供对其操作的方法。

五、activity中使用

mainActivity

class MainActivity : AppCompatActivity() {
    private var adapter: StudentRecyclerViewAdapter? = null
    private var listStudent: ArrayList<Student> = ArrayList()
    private var viewModel: StudentViewModel? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //databinding
        val binding = DataBindingUtil.
            setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        //viewmodel
        viewModel = ViewModelProvider(this)[StudentViewModel::class.java]
        binding.studentViewModel = viewModel
        binding.lifecycleOwner = this
        binding.recycleView.layoutManager = LinearLayoutManager(this)
        adapter = StudentRecyclerViewAdapter(listStudent)
        binding.recycleView.adapter = adapter
		//livedata、room
        viewModel!!.getAllStudentsLive()!!.
            observe(this,androidx.lifecycle.Observer {
                adapter!!.students = it
                adapter!!.notifyDataSetChanged()
            })
    }
}

上面案例中,通过ActivityMainBinding获取对应控件,添加对应的逻辑,其次使用getAllStudentsLive方法获取到对应的LiveData,并通过observe监听LiveData集合。

到此这篇关于Android Jetpack组件支持库DataBinding与ViewModel与LiveData及Room详解的文章就介绍到这了,更多相关Android Jetpack组件支持库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android Jetpack组件库LiveData源码深入探究

    目录 前言 一.LiveData 二.使用案例 三.LiveData 实现原理 四.LiveData 相关源码 五.LiveData分发问题 Android Jetpack之ViewModel.LiveData Android Jetpack之LifeCycle Android Jetpack之DataBinding+ViewModel+LiveData+Room 前言 Jetpack是一个由多个技术库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种Android版本和设备中一致

  • Android开发中用Kotlin编写LiveData组件教程

    目录 1.简单使用 2.map和switchMap LiveData是Jetpack提供的一种响应式编程组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者.也就是说,我们可以将数据使用LiveData来包装,然后在Activity中去观察它,就可以主动将数据变化通知给Activity了. 1.简单使用 class MainViewModel(countReserved:Int) : ViewModel() { /*当外部调用counter变量时,实际上获得的就是_counter的

  • Android 自定义Livedata使用示例解析

    目录 前言 Livedata分析 自定义Livedata 总结 前言 我们在开发中在使用MVVM的情况下经常会配合livedata来达到快速开发的效果,但是一般都是在activity或者fragment中去使用,我今天想介绍一种自定义的方式,如果你有复杂的自定义View或者某些场景,也可以使用livedata来达到一个很不错的效果. Livedata分析 我们平时使用livedata都会在activity或者fragment中使用,配合 Lifecycle就不用管理生命周期什么的了,所以一般以a

  • Android Jetpack 狠活Lifecycles与LiveData使用详解

    目录 前言 正篇 结语 前言 今天在工作时,测试突然提了一个Bug给我,要求我将APP中某活动页面的UI界面要根据用户在由此页面跳转的下个页面操作,在返回时要实时更新. 在检查代码时,发现我已经对界面可变数据用LiveData去观测,但由于页面变化后并没有重新初始化UI,所以我放在初始化UI的请求根本没有起效,如上图所示例子,在进入下一个页面如若关闭开关,返回时无法及时更新,于是我便想到了安卓科技与狠活Lifecycles,去监听onResume,在resume时用livedata去post数据

  • Android开发Jetpack组件ViewModel与LiveData使用讲解

    目录 一.ViewModel 1.解决的问题 2.注意点事项 3.ViewModel案例 二.LiveData 1.viewmodel+livedata使用案例 2.viewmodel+livedata Android Jetpack之LifeCycle 一.ViewModel ViewModel是介于View(视图)和Model(数据模型)之间的中间层,能够使视图和数据分离,又能提供视图和数据之间的通信.如图所示: 1.解决的问题 屏幕翻转后页面数据的丢失: 异步调用导致的内存泄露: 类膨胀提

  • Android Jetpack组件支持库DataBinding与ViewModel与LiveData及Room详解

    目录 一.官方推荐的Jetpack架构 二.添加依赖 三.创建Repository 四.创建ViewModel 五.activity中使用 Android Jetpack之ViewModel.LiveData Android Jetpack之LifeCycle 一.官方推荐的Jetpack架构 ViewModel是介于View(视图)和Model(数据模型)之间的中间层,能够使视图和数据分离,又能提供视图和数据之间的通信. LiveData是一个能够在ViewModel中数据发生变化时通知页面刷

  • Android JetPack组件的支持库Databinding详解

    目录 简介 启用databinding 布局xml variable (变量标签) data (数据标签) @{}表达式 绑定普通数据 绑定可观察数据 对单个变量的绑定-fields 对集合的绑定-collections 绑定对象-objects 绑定LiveData 双向绑定 简介 DataBinding 是 Google 在 Jetpack 中推出的一款数据绑定的支持库,利用该库可以实现在页面组件中直接绑定应用程序的数据源.使其维护起来更加方便,架构更明确简介. DataBinding 唯一

  • Android Jetpack组件ViewModel基本用法详解

    目录 引言 一.概述与作用 二.基本用法 小结 引言 天道好轮回,终于星期五,但是还是忙碌了一天.在项目中,我遇到了一个问题,起因则是无法实时去获取信息来更新UI界面,因为我需要知道我是否获取到了实时信息,我想到的办法有三,利用Handler收发消息在子线程与主线程切换从而更新信息,其二则是利用在页面重绘的时候(一般是页面变动如跳转下个页面和将应用切至后台),其三就是利用Jetpack中最重要的组件之一ViewModel,最后我还是选择了ViewModel,因为感觉更方便. 其实想到的前面两个方

  • Android Jetpack组件中LifeCycle作用详细介绍

    目录 Jetpack 1.那么Jetpack是什么呢 2.为何使用Jetpack 3.Jetpack与AndroidX LifeCycle 1.LifeCycle的作用 2.LifeCycle应用 1.设计组件 2.使用组件 3.总结LifeCycle的使用 Jetpack Jetpack,我觉得翻译为“飞行器”更好听,因为Google针对编程历史乱象,整理出一套组件库,帮助开发者创造更完美的应用作品.现在市面上,很多公司招聘面试要求渐渐把Jetpack看作必会技能,Google也在疯狂的安利J

  • Android Jetpack 组件LiveData源码解析

    目录 前言 基本使用 疑问 源码分析 Observer ObserverWrapper LifecycleBoundObserver MutableLiveData postValue setValue 问题答疑 LiveData 特性引出的问题 问题解决 最后 前言 本文来分析下 LiveData 的源码,以及其在实际开发中的一些问题. 基本使用 一般来说 LiveData 都会配合 ViewModel 使用,篇幅原因关于 ViewModel 的内容将在后续博客中分析,目前可以将 ViewMo

  • Android Jetpack组件Navigation导航组件的基本使用

    目录 1.Navigation 基本概念 2.Navigation 使用入门 2.1 添加Navigation依赖 2.2 创建导航图 2.3 导航图中添加目的地Fragment 2.4 Activity添加 NavHost 2.5 LoginFragment 代码编写 2.6 welcomeFragment 代码编写 总结 本篇主要介绍一下 Android Jetpack 组件 Navigation 导航组件的 基本使用 当看到 Navigation单词的时候 应该就大概知道 这是一个关于导航

  • Android Studio 3.6中新的视图绑定工具ViewBinding 用法详解

    前言 我们在Android开发的过程中总是需要获取XML布局中的ViewId,以便给其赋值进行显示,早期我们只能使用 findViewById 这个API,会导致很多的模版代码出现.2013年左右Android界大神 Jake Wharton开源了Butter Knife框架,通过Bind("viewid")方式方便开发者获取ViewId.近两年由于谷歌对Kotlin的支持,我们开始使用 Android Kotlin extensions. 在文件中导入布局文件直接引用viewId.无

  • Android mvvm之LiveData原理案例详解

    1. 生命周期感知 1.1 生命周期感知组件 我们知道,Controller(Activity or Fragment) 都是有生命周期的,但是传统的 Controller 实现方式只负责 Controller 本身的生命周期管理,而与业务层的数据之间并没有实现良好解耦的生命周期事件交换.所以业务层都需要自己主动去感知 Controller 生命周期的变化,并在 Controller 的生存期处理数据的保活,而在消亡时刻解除与 Controller 之间的关系,这种处理方式随着业务规模的扩大往往

  • Android启动内置APK和动态发送接收自定义广播实例详解

    Android启动内置APK和动态发送接收自定义广播实例详解 工作中遇到这样一个需求,需要为按键添加一个亲情号,提供一个接口启动内置的APK,思考再三决定更改Framework,利用广播机制去实现. 一.代码动态自主启动内置APK 我们都知道Android系统为我们提供了很多服务管理类,PackageManager主要是管理应用程序包,通过它就可以获取应用程序信息并构建Intent,启动对应的应用.除此之外Android还未我们提供了一些对应的类来管理相关的xml文件,比如说可以通过Packag

随机推荐