一文读懂kotlin协程常用知识点 - 知乎 (zhihu.com)
来之小胡代码
66216d7819f2c527a6be81e5cce191b.png
object AvatarLoader {
@SuppressLint("NewApi")
private val executor = Executors.newWorkStealingPool(50).asCoroutineDispatcher()
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
fun loadAvatar(wxId: List<String>,loader: ClassLoader,db: ContactDataOperator,isGroup: Boolean){
scope.launch {
val avatarList = mutableListOf<UserAvatar>()
//创建了一个存储Pair的列表,每个Pair包含微信ID和一个Deferred<String>对象,后者代表一个异步计算的结果。
val asyncTask = mutableListOf<Pair<String,Deferred<String>>>()
//async(executor):对于wxId列表中的每个ID,使用async函数在executor上启动一个异步任务,该任务调用loadAvatarBySearch函数来加载头像数据。async函数返回一个Deferred<String>对象,表示异步计算的结果。
wxId.forEach {id->
asyncTask.add(id to async(executor) {
loadAvatarBySearch(loader,db,id)
})
}
//await():一旦所有的异步任务都提交完毕,代码会遍历asyncTask列表,对每个Deferred<String>对象调用await()方法来获取结果。这将阻塞当前协程直到结果可用,然后将结果封装到UserAvatar对象中并添加到avatarList。
asyncTask.forEach {
avatarList.add(UserAvatar(it.first,it.second.await()))
}
if (isGroup){
UplodServerService.uploadGroupAvatar(avatarList,WxSPUtil.getDeviceInfo())
}else{
UplodServerService.uploadAvatar(avatarList,WxSPUtil.getDeviceInfo())
}
}
}
private fun loadAvatarBySearch(loader: ClassLoader,db: ContactDataOperator, wxId: String): String {
// y1 = qc0.n3.b().v().get(wxId)
// qc0.u0.Z(com.tencent.mm.storage.y1,true)
var avatar = ""
val startTime = System.currentTimeMillis()
try {
val b = XposedHelpers.callStaticMethod(
XposedHelpers.findClass(
PluginsConfig.confWXs.conf_chatRoom.AccountStorage_Class,
loader
),
PluginsConfig.confWXs.conf_chatRoom.AccountStorage_getEnMicroMsgOpt8037
)
val v = XposedHelpers.callMethod(b, "v")
val y1 = XposedHelpers.callMethod(v, "get", wxId)
XposedHelpers.callStaticMethod(
XposedHelpers.findClass(
PluginsConfig.confWXs.conf_friend.WECHAT_rcontact_remarkOpt_CLASS,
loader
),
"Z", y1, true
)
while (avatar.isEmpty() && System.currentTimeMillis() - startTime < 10000) {
val strHeadSQL = "select reserved1 from img_flag where username=?"
val headCursor = db.InterQuery(strHeadSQL, arrayOf<String>(wxId))
if (headCursor != null && headCursor.moveToNext()) {
avatar = headCursor.getString(headCursor.getColumnIndexOrThrow("reserved1"))
}
Thread.yield()
}
} catch (ignored: Throwable) {
}
MyLog.i("==>syncContact", "loadAvatar[" + (System.currentTimeMillis() - startTime) + "ms]" + ":" + avatar
)
return avatar
}
}
data class UserAvatar(val wxId: String,val avatar: String)
MAD,现代安卓开发技术:Android 领域开发方式的重大变革!MAD,全称 Modern Android Devel - 掘金 (juejin.cn)