मैं कर रहा हूँ एक app हो जाता है, जो (छद्म) विलंबता मूल्यों द्वारा एक अनुरोध बनाने के लिए कुछ यूआरएल और रिकॉर्डिंग कैसे लंबे समय है कि ले जाएगा.
सबसे पहले, मैं का उपयोग पुराना वापस पाने के लिए एक JSON प्रतिक्रिया से एक वेब सर्वर. इस प्रतिक्रिया में शामिल हैं: नाम के मेजबान (जैसे Ebay ब्रिटेन), यूआरएल के मेजबान (उदा. www.ebay.co.uk), और एक छवि का url. मैं नक्शा इस प्रतिक्रिया पर अपने डेटा वर्ग है जो निम्न के जैसा दिखता है:
data class(
val name: String,
var url: String,
val icon: String,
var averagePing: Long = -1
)
यूआरएल की एक किस्म के रूप में संपत्ति बनाने से पहले कॉल प्राप्त करने के लिए विलंबता मूल्यों, मैं जोड़ने के लिए की जरूरत 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) }
}
}
}
पहली पाश के लिए तैयार हो जाओ! के बाद लाइन में पाश के लिए प्रस्तुत करने के लिए डेटा recycler एडाप्टर दिखाने के क्रम में, होस्ट नाम, यूआरएल और आइकन सीधे (यह सब काम करता है यानी मैं काम कर रहे एक पर्यवेक्षक के लिए 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
}
}
}
इस सब के सब में होता है viewModel. वर्तमान में मैं अद्यतन हूँ मेरी सूची प्रस्तुत करने के द्वारा पूरी सूची फिर से, जब मैं बदलने के लिए एक संपत्ति के एक तत्व की सूची है, जो लगता है मेरे लिए भयानक.
मेरा सवाल है: मैं कैसे कर सकते हैं अद्यतन केवल एक ही संपत्ति के मेजबान है और यह ताज़ा यूआई स्वचालित रूप से?
धन्यवाद अग्रिम में
संपादित करें: अपने पर्यवेक्षक इस तरह दिखता है:
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.