Android Volley:如何小批量解析NetworkResponse大响应?

Android Volley: How to parseNetworkResponse large response in small batches?

我正在使用 Volley 发出网络请求并解析它们以在我的 android 应用程序中显示数据。

目前,我正在使用 Volley's 函数:

override fun parseNetworkResponse(response: NetworkResponse?): Response<Any> {....return Response.success(sectionData, null)}

override fun deliverResponse(response: Any?) {....}

实现这一目标。

不幸的是,我在 parseNetworkResponse 中进行的解析需要几秒钟才能完成。我正在解析的数据包含数百行,我无法控制服务器。理想情况下,我希望能够解析 50 行并将其显示在我的回收视图中,以便用户在我解析其余数据并将其添加到回收视图适配器时可以查看一些内容。

有没有办法实现这种小批量解析?

编辑: 我找到了适合我的解决方法。我在添加每个已解析的行后立即将以下内容放在 parseNetworkResponse 中:

if (sectionData.size >= 50) {
    val toSend = SectionData(sectionHeaderTitle,ArrayList())
    toSend.data.addAll(sectionData)
    sectionData.clear()

    lifecycleScope.launch {
        deliverResponse(toSend)
    }
}

不确定这是否是最好的方法,但到目前为止对我来说效果很好。

我认为没有。 Volley只负责将您向服务器请求的数据移交。解析以多种方式完成,主要使用 GSON 库。如果你愿意,你可以使用worker在后台解析数据并将其作为一小部分存储在DataStore中,然后访问数据。

这实际上取决于您实际想要什么。如果您想避免在运行时在内存中存储大量数据,您可以考虑一次性解析,然后将其分成您喜欢的大小的小块,并将其作为 JsonString 存储在 DataStore 中,或者像 Room,然后从那里访问它。如果您的系统有大量数据,您可以考虑为此使用本地数据库。由于解析器一般不了解数据结构,因此在解析数据之前不可能知道行数。

我找到了适合我的解决方案。我在添加每个已解析的行后立即将以下内容放在 parseNetworkResponse 中:

if (sectionData.size >= 50) {
    val toSend = SectionData(sectionHeaderTitle,ArrayList())
    toSend.data.addAll(sectionData)
    sectionData.clear()

    lifecycleScope.launch {
        deliverResponse(toSend)
    }
}

不确定这是否是最好的方法,但到目前为止对我来说效果很好。