Dagger 生成改造拦截器的多个实例

2024-02-22

我是 Dagger 和 Retrofit 的新手。我遇到的问题是,尽管在 dagger 模块中声明了单例,但仍生成了多个改造自定义拦截器实例。我只需要一个实例。

匕首模块

@Module
public class ApiModule
{
    private Config config;

    public ApiModule(Config config) {
        this.config = config;
    }

    @Provides @Singleton
    public OkHttpClient.Builder provideOkHttpClient()
    {
        return new OkHttpClient.Builder();
    }

    @Provides @Singleton
    public AuthenticationRequestInterceptor provideRequestInterceptor()
    {
        return new AuthenticationRequestInterceptor();
    }

    @Provides @Singleton
    public Retrofit provideRetrofitInstance()
    {
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        // set your desired log level
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

        // add session headers interceptor
        httpClient.addInterceptor(provideRequestInterceptor());

        // add logging as last interceptor
        httpClient.addInterceptor(logging);  

        return new Retrofit.Builder()
                .baseUrl(getConfig().getBaseUrl())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(httpClient.build()) //for logging purpose remove later
                .build();
    }
}

改装拦截器

public class AuthenticationRequestInterceptor implements Interceptor
{
    private Map<String, String> defaultHeaders;

    public AuthenticationRequestInterceptor()
    {
        this.defaultHeaders = new HashMap<>();
    }

    public void setDefaultHeaders(Map<String, String> headers)
    {
        this.defaultHeaders = headers;
    }

    @Override
    public Response intercept(Chain chain) throws IOException
    {
        Request request = chain.request();

        Request.Builder requestBuilder = request.newBuilder();

        for (String key: this.defaultHeaders.keySet())
        {
            requestBuilder.addHeader(key, this.defaultHeaders.get(key));
        }

        return chain.proceed(requestBuilder.build());
    }
}

连接器

public class Connect
{
    @Inject Retrofit retrofit;
    @Inject Config config;
    @Inject AuthenticationRequestInterceptor headerInterceptor;

    public Connect(PercentApp application)
    {
        ((PercentApp) application).getComponent().inject(this);

/** 在这里设置拦截器标头,但这会在不同的地方设置 实例比稍后在 postUser **/ 中调用的实例

     headerInterceptor.setDefaultHeaders(generateDefaultAuthHeaders());
    }

    public void postUser(Observer observer, User user)
    {
        if(retrofit != null)
        {
            ApiServices api = retrofit.create(ApiServices.class);
            Observable<HashMap> observable = api.postUser("{post something}");
            observable.
                    subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(observer);
        }
    }

}

在我的应用程序中,我创建了 Dagger 实例,如下所示:

DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(this))
                .apiModule(new ApiModule(new Config(environment)))
                .build();

在我的 MainActivity 中我创建 Connect 实例

Connect connect = new Connect((MyApp) getApplication());
User user = new User();
connect.postUser(new UserObserver(this), user);

现在的问题是 AuthenticationRequestInterceptor 构造函数被调用两次,我不明白为什么,因为我设置的标头设置为拦截器的不同实例。请帮忙。谢谢


你不应该打电话provideRequestInterceptor直接地

@Provides @Singleton
public Retrofit provideRetrofitInstance(AuthenticationRequestInterceptor authInterceptor)
{
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    // set your desired log level
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    // add session headers interceptor
    httpClient.addInterceptor(authInterceptor);

    // add logging as last interceptor
    httpClient.addInterceptor(logging);  

    return new Retrofit.Builder()
            .baseUrl(getConfig().getBaseUrl())
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(httpClient.build()) //for logging purpose remove later
            .build();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dagger 生成改造拦截器的多个实例 的相关文章

随机推荐

  • docker 中的特权模式以集群形式组成

    我在用docker compose yml在具有树莓派集群的 docker swarm 中部署服务 我的服务需要访问树莓派 GPIO 并且需要特权模式 我使用 docker 版本 18 02 和 docker compose 版本 3 6
  • 返回流而不是列表[重复]

    这个问题在这里已经有答案了 在 Java 8 中我越来越多地替换Collection返回值与Stream 所以我曾经拥有过 public List
  • 我可以使用 Google Chrome 扩展程序阻止alert()吗

    我可以创建一个 Google Chrome 扩展来阻止该页面执行alert 正如 MrGlass 所说 目前 Chrome 扩展程序在单独的环境中运行 限制了对实际应用程序的访问 window对象并提供仅对扩展有效的副本 为了解决这个问题
  • Django - 区分不同类型的 IntegrityError

    我正在使用 django MySQL 有时 我将重复的数据插入数据库 这会导致 django 引发错误IntegrityErrror 问题是 django python 对几个不同的版本使用相同的错误MySQL 错误 http dev my
  • write_some 与 write - boost asio

    为什么有人想使用write some什么时候它可能无法将所有数据传输给对等方 从升压write some文档 write some 操作可能不会将所有数据传输到对等方 如果需要确保所有数据都被写入 请考虑使用 write 函数 在阻塞操作完
  • is_numeric、intval、ctype__digit..您可以信赖它们吗?

    is numeric intval ctype digit 您可以信赖它们吗 或者我必须使用正则表达式 function isNum str return preg match 0 9 str 你们有什么感想 我是傻子吗 之间的一个重要区别
  • 如何使用 OpenSSL 提取公钥?

    以下命令生成一个包含公钥和私钥的文件 openssl genrsa des3 out privkey pem 2048 Source here http www openssl org docs HOWTO keys txt 使用OpenS
  • make:安装:找不到命令

    当我尝试安装时git从它的源头开始qnx 我收到以下错误 请注意 pound 是 sudo 的提示qnx configure without iconv with perl usr pkg bin perl with python usr
  • 在哪里可以找到使用 boto3 编写自定义 AWS 凭证提供程序的文档?

    我希望创建一个 python 进程来在运行时刷新临时 AWS 凭证 有效期为 30 分钟 以确保我的代码可以连续运行超过 30 分钟 什么是 RefreshableCredentials 以及如何使用它 经过大量研究后 我终于得出结论 bo
  • 使用jest 模拟react-router-dom 钩子不起作用

    我正在使用 Enzyme 的浅层方法来测试使用useParams钩子从 URL 参数中获取 ID 我试图嘲笑useParams挂钩 这样它就不会调用实际的方法 但它不起作用 我还在得到TypeError Cannot read proper
  • 从 Windows 进行 Linux 开发的最佳设置? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从 Windows 工作站开发 Linux 应用程序的最佳设置是什么 现在 我通过 SSH 连接到我们的 Linux 开发服务器 并使用 Ecl
  • 结构图 - 构造函数中依赖项的集合

    我的注册表中有以下代码 Scan x gt x Assembly Assembly GetExecutingAssembly x AddAllTypesOf
  • 如何使用构建中注入的密码作为 Active Choices 参数中的环境变量

    我在标题为 将密码作为环境变量注入到构建中 的构建配置部分中定义了密码 我想在我的 Active Choices 中使用 MYVAR 未加密值 不幸的是 它不起作用 对 MYVAR 的引用失败 在下面的示例中 为了测试 我只是尝试显示 MY
  • 通过参数推导多参数模板中的第一个模板参数

    首先是我的问题 然后解释我正在尝试做什么 因为我可能会错误地处理问题 是否可以在指定其他参数的同时从参数中推导出多参数模板中的第一个模板参数 例子 template
  • 在自定义模块中使用时,Import-Pssession 不会导入 cmdlet

    我有一个 PowerShell 脚本 函数 当我在 PowerShell 配置文件中使用它或在 PowerShell 窗口中手动复制 粘贴该函数时 效果非常好 我正在尝试使该功能作为模块可供团队的其他成员访问 我希望将模块存储在一个中心位置
  • 对 C# 中 UDP 协议的套接字感到困惑

    我刚刚开始通过各种 Google 搜索学习套接字 但在弄清楚如何在 C 中正确使用套接字时遇到一些问题 我需要一些帮助 我有一个测试应用程序 Windows 窗体 和一个不同的类 实际上在它自己的 dll 中 但这无关紧要 我有我的套接字代
  • 从深度缓冲区读取深度值的有效方法

    对于我的算法 我需要能够访问深度缓冲区 我使用 glReadPixels 执行此操作完全没有问题 但读取 800x600 窗口的速度非常慢 从 300 fps 到 20 fps 我读了很多关于这方面的内容 我认为将深度缓冲区转储到纹理会更快
  • 在 Jenkins 上构建 Android Studio 项目? android.compileSdkVersion 丢失

    我正在尝试建立我的第一个 Android 项目来构建在 Jenkins 上 我正在运行 Jenkins 1 6 2 和 Gradle 插件版本 1 24 在 Windows 7 Professional SP1 上运行 我已经在我的构建机器
  • C# 中的 Base64 对象反序列化

    我有这样的课程 Serializable public class ExternalAccount public string Name get set 我已将其转换为 JSON 如下所示 Name XYZ 然后我对 JSON 字符串进行了
  • Dagger 生成改造拦截器的多个实例

    我是 Dagger 和 Retrofit 的新手 我遇到的问题是 尽管在 dagger 模块中声明了单例 但仍生成了多个改造自定义拦截器实例 我只需要一个实例 匕首模块 Module public class ApiModule priva