使用LiveData
作为数据传输和分类器的数据时,经常会遇到堆叠的网络请求。为了解决这个问题,可以使用以下代码示例:
首先,创建一个异步任务类来执行网络请求,该任务实现了AsyncTask
。这个类需要接受一个LiveData对象来将结果返回给UI线程。如果有多个请求需要进行,只需创建多个类似的异步任务并将LiveData对象传递给它们。
class NetworkTask(private val liveData: MutableLiveData) : AsyncTask() {
override fun doInBackground(vararg params: Unit?): Result {
// Execute your network call here and return result
}
override fun onPostExecute(result: Result) {
liveData.value = result // Update LiveData with result
}
}
接下来,在你的Repository中调用异步任务,并使用MediatorLiveData
对象来将结果与其他LiveData
对象分离。这将确保只有最新的结果会被分发给UI。
class MyRepository {
private val networkLiveData = MutableLiveData()
private val mediatorLiveData = MediatorLiveData()
fun fetchData() {
val networkTask = NetworkTask(networkLiveData)
networkTask.execute()
mediatorLiveData.addSource(networkLiveData) { result ->
mediatorLiveData.value = result
}
}
fun getLiveData(): LiveData {
return mediatorLiveData
}
}
最后,在Activity或Fragment中,只要观察您的Repository中的LiveData对象即可。
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
viewModel.getLiveData().observe(this, Observer { result ->
// Update UI with result
})
viewModel.fetchData()
}
}