2016-05-01 2 views
7

У меня есть этот сетевой модуль. Я хочу добавить модуль сети в статический метод ErrorUtils.Можно ли использовать кинжал в статическом методе?

@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; 
    } 
} 

Как мы можем внедрить модуль в статический метод, любое предложение?

ответ

13

Как можно видеть в Migrating from Dagger 1

Dagger 2 не поддержки статического впрыска.

Статические методы и переменные, как правило, представляют собой плохую идею. В вашем случае вы можете просто сделать свой ErrorUtils объектом, например. с @Singleton scope. Затем вы можете правильно ввести услугу, а также правильно ввести errorUtils без использования статических вызовов.

Если это не вариант, вы можете просто обеспечить поглотитель для компонента

@Component interface MyComponent { 
    Retrofit getRetrofit(); 
} 

И затем использовать этот метод, чтобы установить статическую переменную.

+0

«Статические методы и переменные, как правило, представляют собой плохую идею» ... Что относительно общественного статического намерения getCallingIntent()? –

+0

Я хочу получить доступ к объекту Gson, поэтому мне нужно создать новый экземпляр внутри метода или использовать простой синглтон со статическим методом getInstance() вместо Dagger ...? –

+0

@LeoDroidcoder Проблема со статическими объектами (например, одиночные) называется глобальным состоянием. Это может сделать тестирование практически невозможным и может привести к большей путанице, чем необходимо, если вы можете читать и писать что-то из любого места. Представьте, что вы хотите десериализовать объект 'Date' по-разному в двух разных местах вашего приложения, но поделитесь одним и тем же экземпляром' Gson'. Хотя Gson - безобидный пример с небольшими побочными эффектами. –

Смежные вопросы