Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > kotlin模块化结构组件

kotlin中的模块化结构组件及工作原理

作者:每次的天空

本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧

模块化结构组件包含ViewModel、LiveData、Room 和 Navigation ,我将讲解它们的工作原理和基础使用。

ViewModel 工作原理

ViewModel 通过 ViewModelStore 存储实例,在配置更改时保留数据,在关联组件非配置更改销毁时释放资源。 

// 定义 ViewModel 类
import androidx.lifecycle.ViewModel
import androidx.lifecycle.MutableLiveData
class NewsViewModel : ViewModel() {
    // 定义 LiveData 存储新闻列表
    private val _newsList = MutableLiveData<List<String>>()
    val newsList: LiveData<List<String>> = _newsList
    init {
        // 模拟从网络或数据库获取新闻数据
        fetchNews()
    }
    private fun fetchNews() {
        // 这里可以替换为真实的网络请求或数据库查询
        val mockNews = listOf("新闻1", "新闻2", "新闻3")
        _newsList.value = mockNews
    }
}
// 在 Activity 中使用 ViewModel
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
    private lateinit var newsViewModel: NewsViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView{"name":"GodelPlugin","parameters":{"input":"\"setContentView(R.layout.activity_main)\""}}<|FunctionExecuteEnd|><|FunctionExecuteResult|>setContentView(R.layout.activity_main)<|FunctionExecuteResultEnd|>
        // 获取 ViewModel 实例
        newsViewModel = ViewModelProvider(this).get(NewsViewModel::class.java)
        // 观察 LiveData 数据变化
        newsViewModel.newsList.observe(this, { news ->
            // 更新 UI
            news.forEach {
                textView.append("$it\n")
            }
        })
    }
}

当屏幕旋转等配置更改时,MainActivity 重新创建,但 NewsViewModel 实例会从 ViewModelStore 中取出,数据得以保留。 

LiveData 工作原理

 LiveData 持有数据,通过 LifecycleBoundObserver 感知 LifecycleOwner 生命周期,仅在活跃状态时通知观察者。

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
    private val liveData = MutableLiveData<String>()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView{"name":"GodelPlugin","parameters":{"input":"\"setContentView(R.layout.activity_main)\""}}<|FunctionExecuteEnd|><|FunctionExecuteResult|>setContentView(R.layout.activity_main)<|FunctionExecuteResultEnd|>
        // 注册观察者
        liveData.observe(this, Observer { data ->
            // 处理数据变化
            textView.text = data
        })
        // 更新数据
        liveData.value = "新数据"
    }
}

liveData.observe 注册时将 this(即 MainActivity 作为 LifecycleOwner)和 Observer 包装,当 MainActivity 处于活跃状态且 liveData 数据更新时,Observer 的 onChanged 方法被调用。 

Room 工作原理

 Room 通过注解定义数据库结构和操作,编译时生成 SQL 语句和实现代码,默认在后台线程执行操作。

// 定义实体类
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "news")
data class News(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    val title: String
)
// 定义 DAO
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
@Dao
interface NewsDao {
    @Insert
    suspend fun insertNews(news: News)
    @Query("SELECT * FROM news")
    suspend fun getAllNews(): List<News>
}
// 定义数据库类
import androidx.room.Database
import androidx.room.RoomDatabase
@Database(entities = [News::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun newsDao(): NewsDao
}
// 在 ViewModel 中使用 Room
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class NewsViewModel : ViewModel() {
    private val database = Room.databaseBuilder(
        applicationContext,
        AppDatabase::class.java,
        "news-database"
    ).build()
    private val newsDao = database.newsDao()
    fun insertNews(news: News) {
        viewModelScope.launch {
            newsDao.insertNews(news)
        }
    }
    fun getAllNews() {
        viewModelScope.launch {
            val newsList = newsDao.getAllNews()
            // 处理获取到的新闻列表
        }
    }
}

编译时,Room 会根据 @Entity@Dao 和 @Database 注解生成操作数据库的 SQL 语句和实现代码,suspend 函数保证数据库操作在后台线程执行。 

Navigation 工作原理

Navigation 通过导航图定义目的地和动作,NavController 管理导航和返回栈。

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/firstFragment">
    <fragment
        android:id="@+id/firstFragment"
        android:name="com.example.myapp.FirstFragment"
        android:label="First Fragment">
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.myapp.SecondFragment"
        android:label="Second Fragment" />
</navigation>

在 Activity 中设置导航宿主

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:defaultNavHost="true"
    app:navGraph="@navigation/navigation_graph" />

在 Fragment 中进行导航

import androidx.fragment.app.Fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
class FirstFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_first, container, false)
        view.findViewById<Button>(R.id.navigateButton).setOnClickListener {
            // 导航到 SecondFragment
            findNavController().navigate(R.id.action_firstFragment_to_secondFragment)
        }
        return view
    }
}

 NavController 根据导航图中的定义,处理从 FirstFragment 到 SecondFragment 的导航,同时管理返回栈以支持返回操作。

 总结:

  ViewModel 通过 ViewModelStore 管理 UI 数据并在配置变更时保持状态,LiveData 实现生命周期感知的可观察数据更新,Room 作为 SQLite ORM 自动生成数据库操作代码并处理线程,Navigation 利用导航图和 NavController 管理多 Fragment 导航,共同构建响应式、可维护的 Android 应用架构。

到此这篇关于kotlin中的模块化结构组件的文章就介绍到这了,更多相关kotlin模块化结构组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文