大量数据发送到主线程android应用程序

问题描述 投票:0回答:1

当后端以同步方式在主(UI)线程中发布大量数据(每20毫秒1000个元素的列表)并且您无法更改后端代码时,我不知道如何解决问题。帖子是这样进行的:

class Server {
    private val mainThreadHandler = Handler(Looper.getMainLooper())
    private val processScope = CoroutineScope(Dispatchers.Default)

    private val instrumentNames = listOf(
        "EUR/USD_TOD",
        "GBP/USD_SPOT",
        "USD/JPY_TOM",
        "USD/CHF_SPOT",
        "USD/GBP_SPOT",
        "USD/CAD_TOM",
        "USD/RUB_TOM",
        "EUR/RUB_TOD",
        "CHF/RUB_TOM",
        "USD/AMD_SPOT",
        "EUR/GEL_SPOT",
        "UAH/RUB_SPOT",
        "USD/RUB_ON",
        "EUR/USD_TN",
    )

    fun subscribeToDeals(callback: (List<Deal>) -> Unit) {
        val currentTimeStamp = Date()

        processScope.launch {
            var deals = mutableListOf<Deal>()
            val dealsCount = (1_000_000L..1_001_000L).random()
            val dealsCountInPacket = 1_000
            var j = 0

            for (i in 0..dealsCount) {
                val deal = Deal(
                    id = i,
                    timeStamp = Date(currentTimeStamp.time + i),
                    instrumentName = instrumentNames.shuffled().first(),
                    price = getRandom(min = 60, max = 70),
                    amount = getRandom(min = 1_000_000, max = 50_000_000),
                    side = Deal.Side.values().toList().shuffled().first(),
                )
                deals.add(deal)

                j += 1

                if (j == dealsCountInPacket || i == dealsCount) {
                    j = 0
                    val delayValue = (0L..100L).random()
                    delay(delayValue)
                    val newDeals = deals

                    mainThreadHandler.post {
                        callback(newDeals)
                    }

                    deals = mutableListOf()
                }
            }
        }
    }

    private fun getRandom(min: Int, max: Int): Double {
        return min + Random.nextDouble() * (max - min)
    }

    data class Deal(
        val id: Long,
        val timeStamp: Date,
        val instrumentName: String,
        val price: Double,
        val amount: Double,
        val side: Side,
    ) {
        enum class Side {
            SELL, BUY
        }
    }
}

UI 星星滞后

可能有人知道如何解决这样的检查象牙。如何正确实现存储库回调方法 subscribeToDeals(callback) 中的调用以不重载 UI 线程

使用协程解决

android ui-thread
1个回答
0
投票

每完成一千笔交易后,您就会发布到主线程。我不知道你在回调中做了什么(未发布),但它可能太多了,并且你的协程发送的数据超出了 UI 线程可以处理的数据。创建交易的循环将运行得非常快——它的作用不大。所以其中 1000 个将需要几微秒。在发送消息之前尝试将其提高到 100K,您可能会看到改进。或者甚至同时全部。

另外,你的代码......有点奇怪。我可以获得随机数量的交易,您正在为某些测试或过程创建随机数据。但是为什么在将消息发送到主线程之前等待随机时间呢?如果是的话,为什么金额这么低?平均为 50 毫秒,并不是很长。但你并没有做你认为你正在做的事情(每 20 毫秒没有发送任何内容,而是以立即到 100 毫秒之间的随机时间量发送)。

© www.soinside.com 2019 - 2024. All rights reserved.