Где внедрить AndroidInjection в пользовательских / утилитных классах, используя dagger2 в java android - PullRequest
0 голосов
/ 19 декабря 2018

Я использую кинжал 2. И внедряю свою зависимость в действиях и фрагментах, которая работает нормально.

AndroidInjection.inject(this) для действий внутри onCreate.

// for the activity
override fun onCreate(savedInstanceState: Bundle?) {
    AndroidInjection.inject(this)
    super.onCreate(savedInstanceState)
}

AndroidSupportInjection.inject(this)для фрагментов внутри onAttach.

// for fragments
override fun onAttach(context: Context?) {
    AndroidSupportInjection.inject(this)
    super.onAttach(context)
}

Теперь я хочу внедрить свою зависимость в пользовательский или утилитарный класс с именем AsyncTaskHandler.Я не могу получить доступ к этой зависимости.

Полагаю, мне нужно где-то добавить строку AndroidInjection.inject(this).но у него нет функции onCreate или onAttach.Итак, как сделать зависимость доступной в моем классе утилит или как вызвать эту зависимость.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

AndroidInjection не предназначено для помощи с классами, которые не являются подклассами платформы Android.Вместо этого ожидается, что вы выполните одно из следующих действий:

  • В своем классе с поддержкой DI (активность, фрагмент и т. Д. Или все, что они вводят), введите AsyncTaskHandler или Provider<AsyncTaskHandler> через@Inject -аннотированный конструктор или поле.Это даст вам полностью введенный AsyncTaskHandler, а поставщик предоставит вам столько, сколько вам может понадобиться (включая ноль).Это также позволяет вам заменить AsyncTaskHandler или его фабрику в разных конфигурациях или заменить экземпляр AsyncTaskHandler в тестах.

  • Если AsyncTaskHandler - это деталь реализации, которую вам не нужно заменять,даже в тестах вы можете позвонить new AsyncTaskHandler.Использование DI не означает, что вводится каждый отдельный класс.Конечно, если AsyncTaskHandler имеет много зависимостей, вы можете использовать инъекцию для удобства и настраиваемости, даже если вы не собираетесь заменять сам AsyncTaskHandler в любой конфигурации.

  • Есливы должны сделать так, чтобы AsyncTaskHandler внедрял сам себя, даже когда нет окружающего DI-окружения, вы можете создать свое собственное решение: убедитесь, что AsyncTaskHandler имеет доступ к экземпляру приложения, приведите его к интерфейсу, который допускает инъекцию, изатем введите его, используя метод инъекции членов .Вы также можете сохранить свой Компонент или MembersInjector<AsyncTaskHandler> где-нибудь в статическом поле и получить к нему доступ, чтобы можно было внедрить AsyncTaskHandler, потенциально сохраняя статическое поле в самом AsyncTaskHandler.Вы захотите сделать это на Application#onCreate или в любом месте, где вы создаете свой экземпляр Component.

    Сложность получения экземпляра Application из произвольного экземпляра класса, не полагаясь на недружественный к тесту статический инжектор или гарантируято, что статическое поле заполняется Component или MembersInjector всякий раз, когда это требуется вашему AsyncTaskHandler, является одной из причин того, что AndroidInjection ограничено в своей области, чтобы исключить этот тип сценария использования.Вам нужно убедиться, что остальная часть вашего кода структурирована таким образом, чтобы это было безопасно.

0 голосов
/ 19 декабря 2018

Попробуйте что-то вроде этого: Вы можете добавить в базовое приложение или AppModule

@Provides
MyUtilClass provideMyUtilClass(Context context) {
    return new MyUtilClass(context)
}

Ниже приведен фиктивный класс утилит, который вы пытаетесь внедрить:

public class MyUtilClass  {
    private Context context;

    public MyUtilsClass (Context context) {
        this.context = context
   }
   // more code
}

Позвольте мнезнаю, поможет ли это

...