美文网首页
协程多任务同步

协程多任务同步

作者: 牵手生活 | 来源:发表于2023-09-19 16:56 被阅读0次

来之小胡代码

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>()
            val asyncTask = mutableListOf<Pair<String,Deferred<String>>>()
            wxId.forEach {id->
                asyncTask.add(id to async(executor) {
                    loadAvatarBySearch(loader,db,id)
                })
            }
            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)

相关文章

  • 协程

    gevent方法实现多任务(协程) 了解yield和grenlet yield方法创建协程 greenlet方法创建协程

  • 4-7

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式...

  • 协程

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式...

  • 协程——yield

    协程: 协程,又称微线程,纤程。英文名Coroutine。 协程是python个中另外一种实现多任务的方式,只不过...

  • golang中线程和协程的区别

    协程 协程,英文名Coroutine。但在 Go 语言中,协程的英文名是:gorutine。它常常被用于进行多任务...

  • 协程

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是python个中另外一种实现多任务的方式,只不过比...

  • Python多任务-协程

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是python个中另外一种实现多任务的方式,只不过比...

  • 多任务-协程

    一、协程的概念 协程,又称微线程,纤程。英文名Coroutine。协程是python中另外一种实现多任务的方式,只...

  • 协程-yield

    协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式,只不...

  • Python 高级 7

    迭代、迭代器、生成器、协程、yield、greenlet、gevent、进程线程协程对比、gevent多任务图片下...

网友评论

      本文标题:协程多任务同步

      本文链接:https://www.haomeiwen.com/subject/yhanvdtx.html