내가 만드는 응용 프로그램을 얻(의사)지연 시간 값을 요청하여 어떤 url 을 기록 얼마나 오래 걸릴 것입니다.
첫째,내가 사용하는 개조를 얻을 JSON 으로 응답에서 웹 서버에 있습니다. 이 응답이 포함되어:호스트의 이름을(예를 들어 Ebay UK),의 url 에서 호스트(예: www.ebay.co.uk고),이미지 url. 난지도 응답이에 데이터의 클래스는 다음과 같습니다:
data class(
val name: String,
var url: String,
val icon: String,
var averagePing: Long = -1
)
url var 재산으로 하기 전에 호출하여 얻을 지연 값을 추가 할 필요가있 https://하기 위해서 요청을 합니다.
하고 있어요 모두 이렇게:
fun getHostsLiveData() {
viewModelScope.launch(Dispatchers.IO) {
val hostList = repo.getHosts()
for (host in hostList) {
host.url = "https://" + host.url
host.averagePing = -1
}
hostListLiveData.postValue(hostList)//updated the recyclerview with initial values
//with default (-1) value of averagePing
for (host in hostList) {
async { pingHostAndUpdate(host.url, hostList) }
}
}
}
에 대한 첫 번째는 루프를 준비합니다. 후에 라인에 대한 반복 제출하는 데이터를 재활용 어댑터를 보여주기 위해,호스트 이름,url 과 아이콘이다(이 모든 작업,즉 내가 작업을 관찰자에 대한 LiveData),는 동안 난 기다리고 있는 지연 값입니다.
두 번째는 루프를 위한 함수를 호출을 계산하는 지연 값을 각 호스트와 updateHostList()함수 업데이트 LiveData.
이 얼마나 기능보:
suspend fun pingHostAndUpdate(url: String, hostList: MutableList<Host>) {
try {
val before = Calendar.getInstance().timeInMillis
val connection = URL(url).openConnection() as HttpURLConnection //Need error handling
connection.connectTimeout = 5*1000
connection.connect()
val after = Calendar.getInstance().timeInMillis
connection.disconnect()
val diff = after - before
updateHostList(url, diff, hostList)
} catch (e: MalformedURLException) {
Log.e("MalformedURLExceptionTAG", "MalformedURLException")
} catch (e: IOException) {
Log.e("IOExceptionTAG", "IOException")
}
}
fun updateHostList(url: String, pingResult: Long, hostList: MutableList<Host>) {
//All this on mainThread
var foundHost: Host? = null
var index = 0
for (host in hostListLiveData.value!!) {
if (host.url == url) {
foundHost = host
break
}
index++
}
if (foundHost != null) {
viewModelScope.launch(Dispatchers.Main) {
val host = Host(foundHost.name, foundHost.url, foundHost.icon, pingResult)
Log.d("TAAAG", "$host")
hostList[index] = host
hostListLiveData.value = hostList
}
}
}
이 모든 일에서 뷰 모델. 현재 업데이트하고 제 목록을 제출하여 전체 목록을 다시 변경했을 경우,하나의 재산이 하나의 요소의 목록 보이는 끔찍한다.
나의 질문은 어떻게 업데이트할 수 있습니 하나만산의 호스트와 새로 UI 를 자동으로?
사전에 감사합니다
편집:내 관찰자는 다음과 같습니다:
viewModel.hostListLiveData.observe(this, Observer { adapter.updateData(it) })
고 updateData()는 다음과 같습니다:
fun updateData(freshHostList: List<Host>) {
hostList.clear()
hostList.addAll(freshHostList)
notifyDataSetChanged()
}
@ArpitShukla,당신은 제가 2 업데이트 기능은 무엇입니까? 하나 보여주기를 위한 초기의 목록 및 다른 업데이트 항목의 목록입니다. 하는 것 또는 나 그냥 넣어 두 notifyDataSetChanged()및 notifyItemChanged()에 updateData()?
Edit2:된 함수 호출에 그것을 만들 async.