Android技術分享| 利用Kotlin協程,多工並行,測試RTM SDK效能
阿新 • • 發佈:2022-06-01
建立並登入多個例項並統計登入時間
常規寫法
- Thread.join
- Synchronized
- CountDownLatch
- RxJava
- 等等
上面寫法都過於麻煩,示例程式碼就不貼了,直接看用協程改造後的吧。
//原始
rtmClient1.login("","123",object :ResultCallback<Void>{
override fun onSuccess(var1: Void?) {
}
override fun onFailure(var1: ErrorInfo?) {
}
})
協程寫法
首先是登入,這是一個很常見的非同步介面回撥形式的方法,如果我們要統計每個Client從登入到成功的耗時,平均耗時,用常規方法是非常不容易的。於是我們可以利用協程,第一步將其改造為同步的方式。
suspend fun Login() = suspendCoroutine<Long>{ val startTime = System.currentTimeMillis() rtmClient1.login("","123",object :ResultCallback<Void>{ override fun onSuccess(var1: Void?) { it.resume(System.currentTimeMillis()-startTime) } override fun onFailure(var1: ErrorInfo?) { it.resume(0) } }) }
上面我們已經將一個普通的非同步回撥寫成一個 suspend 掛起方法
lifecycleScope.launch(Dispatchers.IO) {
val result1 = Login() // 第一個登入結果耗時
val result2 = Login() // 第二個登入結果耗時
val result3 = Login() // 第三個登入結果耗時
}
//總耗時302ms
我們將其放在協程中執行,可見改造後的方法變得非常的簡單且符合我們的直覺也是最簡單的流程。利用suspendCoroutine,我們可以將一個非同步任務掛起,再得到結果後返回,這就是協程的一個魅力,以同步的方式寫非同步程式碼。
以上任務,還只是序列。所謂的序列,指的就是任務1完成再執行任務2,按順序執行,如果任務平均耗時100ms,那執行n個就要 n*100ms才能完成,這不是我們想要的,我們要的是多個任務同時執行,也就是所謂的並行,接著改造。
並行執行
val loginNum = 10
lifecycleScope.launch(Dispatchers.IO) {
(0 until loginNum).map { async { Login() }}.awaitAll()
.apply {
Log.d("result","總耗時:${sum()}")
Log.d("result","平均耗時:${average()}")
Log.d("result","最大耗時:${maxOrNull()}")
Log.d("result","最小耗時:${minOrNull()}")
}
}
//總耗時 100ms
這裡我們使用 async 和 await 改善程式碼,整個流程還是非常的簡單,而且多個任務同時執行變得更加高效了。
以上就是使用協程寫法,測試多個Client從登入到成功的案例。按照同樣的思路,我們還可以測試多個Client同時傳送訊息,接收訊息等任務,利用協程,可以寫出簡單高效的程式碼。