Подтвердить что ты не робот

Необходимый контекст в классах без активности

У меня есть некоторые классы в моем приложении, которые должны вызывать функции Android, которые требуют контекста в качестве параметра. У меня его нет, поскольку класс не является подклассом класса Activity.

Каков правильный способ решения этой проблемы?

  • Передавать его как параметр для каждого вызова?
  • Передайте его при создании экземпляра класса и сохраните его?
4b9b3361

Ответ 1

Это зависит от роли класса. Но в любом случае пройдите ApplicationContext, но не одно действие. Если вы передаете контекст Activity, gc не сможет удалить его из памяти, когда вам больше не понадобится активность. Но контекст приложения используется, когда приложение не было завершено OS.Refer Избегать утечек памяти

Ответ 2

Передайте его как параметр. Или еще лучше, получите контекст приложения, чтобы избежать утечек памяти.

public class Example {
    protected Context context;

    public Example(Context context){
        this.context = context.getApplicationContext();
    }
}

Ответ 3

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

Вы должны подумать об одной важной вещи. Если класс, который вы передаете Context, будет существовать дольше, чем Activity, создавая экземпляр, тогда вы должны использовать контекст приложения. Если этот класс делает материал UI, вам понадобится контекст активности.

Убедитесь, что класс, по которому вы передаете контекст активности, не будет длиться дольше, чем Activity, или вы пропустите всю активность.

Если вы не делаете UI, переходите к контексту приложения.

Ответ 4

Я передаю его как параметр, я думаю, что его лучшая форма для этого

Ответ 5

Передайте его при создании экземпляра класса и сохраните его.

Один типичный пример - когда вы создаете помощника db. См. Ссылку

Ответ 6

Я ответил на этот вопрос здесь.

Вы можете сделать это, используя ContextWrapper, как описано здесь.

Например:

public class MyContextWrapper extends ContextWrapper {

    public MyContextWrapper(Context base) {
      super(base);
   }

}

и использовать этот класс как бы Контекст

Ответ 7

Лучшим способом является подход Bean:

public class Example {
    protected Context getContext() {
        ...
    }

    ...
}

Тогда это зависит от возможностей доступа к контексту. Если класс полностью независим, то параметр конструктора и частного поля лучше всего подходит.

Но этот способ свойства Bean защищает вас от дальнейших изменений кода.