android中 jetpack组件使用
·
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
Android 开发中,Jetpack 组件库极大地提升了开发效率和代码质量。以下为最常用的一些 Jetpack 组件:
| 组件类别 | 组件名称 | 主要功能 |
|---|---|---|
| 架构组件 | ViewModel | 管理界面相关的数据,屏幕旋转时数据不丢失。 |
| LiveData | 可观察的数据持有者,能感知生命周期,在数据变化时安全地更新UI。 | |
| Lifecycle | 管理 Activity 和 Fragment 的生命周期,方便其他组件进行感知。 | |
| Room | 一个强大的 SQLite 对象映射(ORM)库,简化数据库操作。 | |
| 后台任务 | WorkManager | 管理延迟性且需要可靠运行的后台任务,即使应用退出或设备重启。 |
| 界面导航 | Navigation | 简化应用内页面导航和跳转逻辑,提供可视化导航图。 |
| 异步处理 | Kotlin 协程与 Flow | Kotlin 官方的异步编程解决方案,用同步的方式写异步代码 |
组件使用
1. ViewModel & LiveData
用途:通常将两者结合,用于在配置变更(如屏幕旋转)后依然能保存和管理UI数据,并以生命周期安全的方式通知UI更新。
使用:
-
添加依赖:在
app/build.gradle文件中添加依赖。
dependencies {
def lifecycle_version = "2.6.2"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}
2. 创建 ViewModel:继承 ViewModel 类,并在内部使用 LiveData(通常为 MutableLiveData)持有数据。
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// 私有数据,仅在ViewModel内修改
private val _userName = MutableLiveData<String>()
// 对外暴露不可变的LiveData,供UI观察
val userName: LiveData<String> = _userName
fun updateUserName(newName: String) {
_userName.value = newName
}
}
3. 在 Activity/Fragment 中使用:
class MyActivity : AppCompatActivity() {
// 方式1:使用委托初始化ViewModel
private val viewModel: MyViewModel by viewModels()
// 方式2:传统方式(了解即可)
private lateinit var viewModel2: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 传统方式初始化
viewModel2 = ViewModelProvider(this).get(MyViewModel::class.java)
// 观察LiveData,当数据变化时更新UI
viewModel.userName.observe(this) { name ->
// 更新TextView等UI组件
findViewById<TextView>(R.id.text_view).text = name
}
// 触发数据更新
findViewById<Button>(R.id.button).setOnClickListener {
viewModel.updateUserName("Hello, Jetpack!")
}
}
}
by viewModels() 的原理
// 这是简写形式
private val viewModel: MyViewModel by viewModels()
// 相当于完整的委托写法
private val viewModel: MyViewModel by lazy {
ViewModelProvider(this).get(MyViewModel::class.java)
}
为什么用委托?
-
懒加载:只有在第一次访问时才创建ViewModel
-
生命周期感知:自动处理配置变化(如屏幕旋转)
-
代码简洁:避免重复的ViewModelProvider代码
ViewModel的生命周期
class MyViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
init {
println("ViewModel被创建")
loadData()
}
override fun onCleared() {
super.onCleared()
println("ViewModel被销毁 - 在这里清理资源")
}
private fun loadData() {
// 模拟数据加载
_data.value = "加载的数据"
}
}
2. Room 持久化库
用途:在 SQLite 上提供一个抽象层,更方便、更安全地进行本地数据库操作。
使用:
Room 包含三个主要部分:
-
Entity(实体):定义数据库表结构。
-
DAO(数据访问对象):包含用于访问数据库的方法。
-
Database(数据库):持有数据库,并作为访问 DAO 的主要入口。
-
添加依赖:
dependencies {
def room_version = "2.5.0"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version" // 如果使用Kotlin,使用kapt
// 可选 - Kotlin 扩展和协程支持
implementation "androidx.room:room-ktx:$room_version"
}
2. 定义实体(Entity):
@Entity(tableName = "user")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
@ColumnInfo(name = "name") val name: String,
@ColumnInfo(name = "age") val age: Int
)
3. 定义 DAO:
@Dao
interface UserDao {
@Insert
suspend fun insert(user: User)
@Query("SELECT * FROM user")
fun getAllUsers(): LiveData<List<User>> // 直接返回LiveData,Room支持
}
4. 定义 Database:
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
5. 使用:
// 创建数据库实例(通常放在Application类或依赖注入中)
val db = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java, "database-name"
).build()
// 获取Dao并操作数据
lifecycleScope.launch {
db.userDao().insert(User(name = "Tom", age = 20))
// 观察用户列表
db.userDao().getAllUsers().observe(this@MyActivity) { users ->
// 更新UI
}
}
3. WorkManager
用途:处理需要可靠运行的后台任务,例如日志上传、数据同步等,即使应用退出或设备重启。
使用:
-
添加依赖:
dependencies {
def work_version = "2.8.1"
implementation "androidx.work:work-runtime-ktx:$work_version"
}
2. 定义后台任务:继承 Worker 类。
class UploadWorker(appContext: Context, params: WorkerParameters)
: Worker(appContext, params) {
override fun doWork(): Result {
// 在这里执行后台任务
return Result.success() // 返回执行结果
}
}
3. 配置并执行任务:
val uploadRequest = OneTimeWorkRequestBuilder<UploadWorker>()
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // 设置执行条件,例如在连接网络时执行
.build()
)
.build()
WorkManager.getInstance(this).enqueue(uploadRequest)
更多推荐



所有评论(0)