Retrofit 在原来的request对象上添加tag

2024-01-01

我正在尝试解决一个问题,我将进行几个异步调用,并根据原始请求执行一项任务。为了解决这个问题,我尝试为每个请求添加一个标签,然后在成功响应后,我可以获取该标签并根据该标签采取操作。在这里,我仅使用 TAG 来识别原始请求。

Problem

在调用入队方法之​​前,我将标记设置为原始请求。但是当我在成功回调中得到响应时,我得到了我没有设置的不同标签。不知何故,请求对象本身作为标签对象出现。我不太确定,怎么办???

请检查下面的代码 -

GitHubService gitHubService = GitHubService.retrofit.create(GitHubService.class);
                final Call<List<Contributor>> call = gitHubService.repoContributors("square", "retrofit");

                // Set the string tag to the original request object.
                call.request().newBuilder().tag("hello").build();


                call.enqueue(new Callback<List<Contributor>>() {
                    @Override
                    public void onResponse(Call<List<Contributor>> call, Response<List<Contributor>> response) {
                        Log.d("tag", response.raw().request().tag().toString());
                        // I'm getting Request{method=GET, url=https://api.github.com/repos/square/retrofit/contributors, tag=null} as the value of the tag. WHY????
                        final TextView textView = (TextView) findViewById(R.id.textView);
                        textView.setText(response.body().toString());
                    }
                    @Override
                    public void onFailure(Call<List<Contributor>> call, Throwable t) {
                        final TextView textView = (TextView) findViewById(R.id.textView);
                        textView.setText("Something went wrong: " + t.getMessage());
                    }
                });

有人可以指出我在这里到底做错了什么吗?任何帮助,将不胜感激。


对我来说这段代码有效

val CLIENT: OkHttpClient = OkHttpClient.Builder().apply {
    addInterceptor(TagInterceptor())
}.build()

val SERVER_API: ServerApi = Retrofit.Builder()
    .client(CLIENT)
    .baseUrl(BASE_URL)
    .build()
    .create(ServerApi::class.java)

interface ServerApi {

    @GET("api/notifications")
    @Tag("notifications")
    suspend fun getNotifications(): ResponseBody
}

@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@Retention(AnnotationRetention.RUNTIME)
annotation class Tag(val value: String)

internal class TagInterceptor : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val builder = request.newBuilder()
        request.tag(Invocation::class.java)?.let {
            it.method().getAnnotation(Tag::class.java)?.let { tag ->
                builder.tag(tag.value)
            }
        }
        return chain.proceed(builder.build())
    }
}

然后按标签取消

fun OkHttpClient.cancelAll(tag: String) {
    for (call in dispatcher().queuedCalls()) {
        if (tag == call.request().tag()) {
            call.cancel()
        }
    }
    for (call in dispatcher().runningCalls()) {
        if (tag == call.request().tag()) {
            call.cancel()
        }
    }
}

CLIENT.cancelAll("notifications")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Retrofit 在原来的request对象上添加tag 的相关文章

随机推荐

  • 以太坊 Solidity 中的划分

    我正在创建一个发行代币的合约 我希望持有代币的账户能够检查他们拥有的所有代币所占的百分比 我知道以太坊还没有实现浮点数 我应该怎么办 在客户端而不是在 Solidity 中执行该计算可能是最好的 最低的 Gas 成本并且实施起来很简单 如果
  • 无法将 ndarray 转换为 Tensor 或 TensorFlow 模型中出现运算错误

    我正在 TensorFlow 中实现 Wasserstein DCGAN 运行此行时会发生错误 train image sess run image batch 处理这个异常会抛出另一个异常 Fetch argument array 0 0
  • 用自身初始化 C++ const 变量

    刚才我遇到了以下类型的错误 include
  • BeagleBone Black 无法识别 USB 蓝牙适配器

    我正在尝试弄清楚如何让 USB 蓝牙适配器与我的 BeagleBone Black 配合使用 我尝试了一些不同的方法但没有成功 但看到其他人的帖子似乎取得了一些成功 我已经尝试过此处记录的过程 http www michaelhleonar
  • JMS:我们可以在 OnMessage() 中从队列中获取多条消息而不提交或回滚吗

    我正在使用 JMS 客户端 它从远程服务器接收 JMS 消息 我正在客户端的 onMessage 方法中监听 JMS 消息 我面临的问题是 即使我定期在客户端消费消息 消息也会在服务器端累积 我根据在客户端进行的处理发送 rollback
  • /usr/bin/ld:搜索 foo 时跳过不兼容的 foo.so

    我使用的是 Ubuntu 13 10 64 位 在编译 vlfeat 库的 python 包装器时遇到以下错误 g o vlfeat so vl aib o vl generic o vl hikmeans o vl ikmeans o v
  • PHP 套接字与流

    我认为 php 套接字和 php 流是相互重叠的 我已经成功地使用套接字或流制作了一个 CLI PHP 聊天客户端和一个服务器 这里有一些说明性的代码行 使用套接字 main socket socket create AF INET SOC
  • PowerShell 通用集合

    我一直在 PowerShell 中推进 NET 框架 但遇到了一些我不明白的问题 这工作正常 foo New Object System Collections Generic Dictionary 2 System String Syst
  • set_form_data POST 中的转义参数

    这是最奇怪的事情 当我添加 in set form data value被解释为value 在服务器端 当我删除 dontescape 的值被解释为file 3a 2f 2f 2fpath 2fto 到底发生了什么 我不希望任何东西被转义
  • Bender.js:“bender server run”命令打开目录中的bender.js配置文件,而不是启动bender.js服务器

    我是bender js 的新手 我正在尝试运行示例项目 https github com benderjs benderjs example project https github com benderjs benderjs exampl
  • 平衡数组子区间中元素数量的算法?

    假设您有一个包含 4 种不同类型元素的数组 1 1 2 3 1 2 2 3 3 4 4 1 我想找到导致每个元素数量相等且元素总数最大的最长子区间 在这种情况下 它将是 1 1 2 3 1 2 2 3 3 因为这会导致 3 个二 3 个三和
  • 打印机通讯捕获

    如果我需要将其发布到其他地方 请告诉我 我们有一些正在重写的旧软件 它使用专有打印机的打印机驱动程序 我需要重写软件绕过打印驱动程序并直接进入打印机 我确实有打印机通信的规格 这很好 但我想做的是监视与打印机的通信以查看其内容 来自我重写的
  • 迭代强类型泛型 List 的最佳方法是什么?

    在 C NET 和 VB NET 中迭代强类型泛型列表的最佳方法是什么 For C foreach ObjectType objectItem in objectTypeList do some stuff VB NET 的答案来自紫蚂蚁
  • 便携式WAMP包?

    无论如何 我可以在 Windows 7 计算机上的 USB 上使用 PHP mySQL apache phpmyadmin 吗 询问的原因是我没有足够的权限在计算机上安装像 XAMPP 这样的软件包 并且我想测试一些 php 代码文件 谢谢
  • 使用网络摄像头跟踪手势

    我想开发一个程序 使用网络摄像头跟踪四种颜色 并将其放在我双手的食指和拇指上 根据我手的手势 计算机将解释这些手势并执行命令 例如 如果我打开一个网站 我所要做的就是用手指捏一下 网页就会缩放 我希望获得 stackoverflow 社区的
  • 如何根据对象以角度选择表格行?

    大家好 我有一个场景 我真的很困惑如何弄清楚 场景是我有 1 垫料台 即角料台 2 以及一个详细信息视图 根据表中特定行的单击显示详细信息 3 对象列表作为数据源 我在行的单击事件上传递对象 并将对象传递到详细信息视图 并且现在显示该特定行
  • iOS 错误“嵌入式二进制文件未使用与父应用程序相同的证书进行签名”

    这是我在 IOS 应用程序开发中的第一步 我面临着一些我无法解决的问题 error Embedded binary is not signed with the same certificate as the parent app Veri
  • 如何防止元素内的分栏?

    考虑以下 HTML div class x ul li Number one li li Number two li li Number three li li Number four is a bit longer li li Numbe
  • 动态生成n维超立方体m面列表的算法

    我正在尝试设计一种算法 给定n m and vertices where n 超立方体的维数 m 我们尝试生成的面的尺寸 以及vertices is an ordered中的顶点列表n维超立方体 返回表示 m 面的顶点数组的数组n维超立方体
  • Retrofit 在原来的request对象上添加tag

    我正在尝试解决一个问题 我将进行几个异步调用 并根据原始请求执行一项任务 为了解决这个问题 我尝试为每个请求添加一个标签 然后在成功响应后 我可以获取该标签并根据该标签采取操作 在这里 我仅使用 TAG 来识别原始请求 Problem 在调