【问题标题】:Can dagger injection done in static method?匕首注入可以在静态方法中完成吗?
【发布时间】:2016-05-01 07:42:44
【问题描述】:

我有这个网络模块。我想在 ErrorUtils 的静态方法中注入 Network 模块。

@Module
public class NetworkModule {
    private final String END_POINT = "https://www.myurl.com/";

    @Provides
    @Singleton
    public OkHttpClient getOkHttpClient() {
            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
       }

    @Provides
    @Singleton
    public GsonConverterFactory getGsonConverterFactory() {
        return GsonConverterFactory.create();
    }

    @Provides
    @Singleton
    public Retrofit getRetrofit(OkHttpClient okHttpClient, GsonConverterFactory gsonConverterFactory) {
        return new Retrofit.Builder()
                .baseUrl(END_POINT)
                .client(okHttpClient)
                .addConverterFactory(gsonConverterFactory)
                .build();
    }

    @Provides
    @Singleton
    public RetrofitService getRetrofitService(Retrofit retrofit) {
        return retrofit.create(RetrofitService.class);
    }

我想以静态方法注入这个模块:

public class ErrorUtils {
    @Inject
    static Retrofit retrofit;

    public static RestError parseError(Response<?> response) {

        **//showing error while writing this line**

        MyApplication.getComponent().inject(ErrorUtils.class);
        Converter<ResponseBody, RestError> converter = retrofit.responseBodyConverter(RestError.class, new Annotation[0]);

        RestError error;

        try {
            error = converter.convert(response.errorBody());
        } catch (IOException e) {
            return new RestError();
        }

        return error;
    }
}

我们如何在静态方法中注入模块,有什么建议吗?

【问题讨论】:

    标签: android dagger-2


    【解决方案1】:

    可以在Migrating from Dagger 1中看到

    Dagger 2 支持静态注入。

    静态方法和变量通常是个坏主意。在你的情况下,你可以让你的 ErrorUtils 一个对象,例如与@Singleton 范围。然后,您可以正确注入服务并正确注入您的errorUtils,而无需使用静态调用。

    如果这不是一个选项,你可以为你的组件提供一个 getter

    @Component interface MyComponent {
        Retrofit getRetrofit();
    }
    

    然后使用该方法设置您的静态变量。

    【讨论】:

    • “静态方法和变量通常是个坏主意”... public static Intent getCallingIntent() 怎么样?
    • 我想在那里访问一个 Gson 对象,所以我必须在方法内部创建一个新实例,或者使用简单的单例和静态方法 getInstance() 而不是 Dagger...?
    • @LeoDroidcoder 静态对象(例如单例)的问题称为全局状态。如果您可以从任何地方读写某些东西,它可能会使测试几乎不可能,并且可能会导致不必要的混乱。假设您想在应用程序的 2 个不同位置以不同方式反序列化 Date 对象,但共享相同的 Gson 实例。虽然 Gson 是一个无害的例子,副作用很小。
    • @DavidMedenjak 当需要初始化完成时你会做什么(即在整个应用生命周期中只发生一次),例如Crashlytics.init()
    • @Bhargav 我会把它放到应用程序的onCreate
    猜你喜欢
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多