定期使用Android Architecture:LiveData获取更新的OkHttp响应并更新Map标记



我制作了一个显示总线位置的传输应用程序。我目前正在尝试重构我的代码,这样我就可以顺利地设置标记(总线位置)的动画,并且已经看到LiveData可以用于清理我的代码。我使用OkHttp进行请求,这是一个存储库,用于返回类型为BusInfo的mutableList,然后从BusInfo的mutable列表中创建标记。我真正的问题是,我对ViewModel的第一次调用是有效的,但当尝试创建ViewModel的新实例并获得更新的daya时,我从第一个存储库实例返回完全相同的数据,而没有创建新实例。关于如何定期从我的视图模型中获取业务信息的新的可变列表并更新地图上的标记位置,有什么建议吗。有人能帮我吗?我对Kotlin和Android开发人员来说已经足够陌生了。

class MapsFragment : Fragment(), OnMapReadyCallback {
private var mBusMap = HashMap<String, MarkerOptions>()
private var mBusHashMapUpdated = HashMap<String, MarkerOptions>()
val mBusInfoViewModel: BusInfoViewModel get() =
ViewModelProviders.of(this).get(BusInfoViewModel::class.java)
private fun createBusMarkers(busMap:HashMap<String, MarkerOptions>,buses: MutableList<BusInfo>) {
try {
requireActivity().runOnUiThread {
buses.forEach { bus ->
busMap[bus.licenseNum] = createMarker(
bus.licenseNum,
LatLng(bus.lat, bus.long),
createScaledBitmap(R.drawable.bus_icon_green),
bus.licenseNum,
bus.direction,
bus.speed
)
busMap.forEach { s, marker ->
mMap.addMarker(marker)
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
mBusInfoViewModel.reposResult.observe(this, android.arch.lifecycle.Observer {
if (it != null) {
createBusMarkers(mBusMap, it)
}
})
updateBusesPeriodically()
}
private fun updateBusesPeriodically() {
val timer = Timer()
GlobalScope.launch {
timer.scheduleAtFixedRate(10000, 10000) {                 
updateBusMarkers()
}
}
}
private fun updateBusMarkers() {
busInfoViewModel.reposResult.observe(this, android.arch.lifecycle.Observer {
if (it != null) {
createBusMarkers(mBusHashMapUpdated, it)
}
}
...animate each marker moving from old position to new position
)}
}

我已经创建了一个视图模型,用于在成功响应OkHttp请求时将BusInfo类型的Mutable列表返回到视图。

class BusInfoViewModel : ViewModel() {
val reposResult = MutableLiveData<MutableList<BusInfo>>()
private var busInfoRepository = BusInfoRepository.instance()
init {
loadBusInfoListFromUrl()
}
fun loadBusInfoListFromUrl(): MutableList<BusInfo> {
return busInfoRepository.getBusInfoListFromResponseBody { repos ->
reposResult.postValue(repos)
}
}

我添加了一个存储库类,用于从http请求获取数据并返回总线列表

class BusInfoRepository {
fun getBusInfoListFromResponseBody(completion: (MutableList<BusInfo>) -> Unit): MutableList<BusInfo> {
val request = Request.Builder().url(url).build()
val client = OkHttpClient()
var buses = mutableListOf<BusInfo>()
client.newCall(request).enqueue(object : Callback {
override fun onResponse(call: okhttp3.Call?, response: okhttp3.Response?) {
val stringResponse = response?.body()?.string()
buses = createBusesFromResponseBody(stringResponse)
completion(buses)
}
override fun onFailure(call: okhttp3.Call?, e: IOException?) {
Log.e("Http API call failed", e?.message)
}
})
return buses
}
}

我意识到我做错了什么。视图模型被实例化,loadBusInfoListFromUrl()被调用,填充reposResult。问题是在那之后我再也没有更新reposResult值。在定期更新视图模型的方法中,我应该在updateBusMarkers方法中调用mBusInfoViewModel.loadBusInfoListFromUrl()