当后端以同步方式在主(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 线程
使用协程解决
每完成一千笔交易后,您就会发布到主线程。我不知道你在回调中做了什么(未发布),但它可能太多了,并且你的协程发送的数据超出了 UI 线程可以处理的数据。创建交易的循环将运行得非常快——它的作用不大。所以其中 1000 个将需要几微秒。在发送消息之前尝试将其提高到 100K,您可能会看到改进。或者甚至同时全部。
另外,你的代码......有点奇怪。我可以获得随机数量的交易,您正在为某些测试或过程创建随机数据。但是为什么在将消息发送到主线程之前等待随机时间呢?如果是的话,为什么金额这么低?平均为 50 毫秒,并不是很长。但你并没有做你认为你正在做的事情(每 20 毫秒没有发送任何内容,而是以立即到 100 毫秒之间的随机时间量发送)。