Метод getContext () возвращает ноль во фрагменте.Это хорошая идея, чтобы сохранить контекст в переменной?Хочу понять плюсы и минусы - PullRequest
1 голос
/ 28 марта 2019

Что я делаю, это

Подход 1:

public View onCreateView(.....){
     context = getContext();
}

Я использую этот контекстный объект везде, где мне нужно. Это правильный подход, или я должен использовать getContext != null и использовать значение, возвращаемое getContext(). Также я понимаю, что могу получить контекст из getActivity(), но он также возвратит ноль, если getContext () возвращает ноль.

В качестве альтернативы я могу делать это каждый раз, когда мне нужен контекст.

Подход 2:

if(getActivity() != null){
      //use getActivity() here
}

Я хочу понять, какой из них лучше и почему?

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

getActivity() и getContext() оба вернут ноль, если ваш фрагмент не привязан к деятельности / контексту. Если они возвращают значение NULL, я не буду предлагать использовать какое-либо ранее сохраненное значение, так как сохраненный контекст может быть отсоединен и может привести к утечкам памяти.

Как правило, вы получаете контекст после прикрепления фрагмента. Вы можете сохранить контекст в обратном вызове onAttach(Context).

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context = context;
}

Тем не менее, обязательно устанавливайте его на ноль, когда фрагмент отсоединяется, чтобы избежать утечек памяти.

@Override
public void onDetach() {
    this.activity = null;
    super.onDetach();
}

Нет никаких минусов сохранения контекста в переменной, о которой я могу думать, за исключением того, что вы должны быть осторожны с изменениями состояния фрагмента. Об этом позаботится onDetach().

2 голосов
/ 28 марта 2019

В вашем фрагменте переопределите функцию

private Context mContext;

@override
void onAttach(Context context) {
    mContext = context;
}

Вот так вы получите контекст во фрагменте, так как никогда не рекомендуется передавать контекст фрагментам и адаптерам из действий.

0 голосов
/ 28 марта 2019

Что ж, если вам нужно получить контекст и сохранить его, я рекомендую создать статическую переменную для вашей текущей активности (если вы используете только одну активность)

//if use only one Activity
private static Context context;
public static Context getRunningContext() {
    return context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    this.context=getApplicationContext();
}

или используйте вместо него getActivity ().

    Context context;
   public View onCreateView(.....){
   context = getActivity();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...