背景:
我正在尝试将带有进度回调的旧下载代码从 Android 中的 AsyncTask 和 HttpUrlConnection 迁移到使用改造。但是,我注意到 Retrofit/okhttp 默认情况下不提供此类回调。
我做了很多搜索,找到了一些方法,包括官方的solution通过 okhttp,这是由拦截器和自定义 ResponseBody 完成的。然而,它们都没有真正满足我的需求。
我想要什么:
这段代码的问题是回调实际上附加到拦截器,这使得它附加到 okhttp 客户端,而我需要的是为每个请求应用不同回调对象。(不同的android ui元素更改等)
我尝试过的:
据我了解,单个请求由单个改造 Call 接口(interface)实例标记,因此,如果我想实现每个请求回调,则必须将其附加到 Call 实例或 RequestBody 实例。
不幸的是,我没有找到任何方法来获取 okhttp 拦截器内的改造 Call 实例。我也不能将自定义回调对象附加到它。
至于自定义RequestBody的方式,似乎是可行的。但是如果是GET请求,就无法再使用retrofit了,因为无法设置RequestBody。
有什么优雅的方式来实现这一点吗?我所说的“优雅”是指我不喜欢自己以任何形式维护请求 -> 回调映射,如果不非常小心,这甚至可能导致内存泄漏。
最佳答案
您也许可以通过@Tag
和/或调用
找到一些内容。 Tag允许您在 Retrofit 请求中定义一个可在拦截器中使用的参数。 Invocation类似,但不需要额外的参数。
关于java - 如何使 Retrofit 接受每个请求的下载进度回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60548708/