Эффективна ли передача контекста через статический класс или нет?

#android #android-context

#Android #android-context

Вопрос:

В Android мне нужна ссылка на «контекст» или, скажем, передача «контекста» нескольким классам. Для этой цели я реализовал статический класс, который содержит «context» и весь другой контекст доступа к классу через него.

 //let's say I have a static class DataHolder 
//and my main acitivity i.e. whose context need to be refrenced

 public class DataHolder{
        public static Context context;
    }

public class MainActivity extends Activity{
    public void onCreate(Bundle bundle){
     DataHolder.context = getApplicationContext();
   }
}
  

Итак, можно ли реализовать этот процесс, или это неправильный способ ссылки в приложении Android.

Комментарии:

1. Спасибо Алексу и Висенте за понимание. Я не смотрел на это таким образом. Но я хочу задать один вопрос, если во время какого-либо действия уничтожается или меняется ориентация или что-либо в этом роде, когда действие больше не требуется, то, если я присвою статическому значению refrence null значение, все равно приведет ли это к утечкам памяти. В любом случае, еще раз спасибо за ответ вам обоим

Ответ №1:

Проблема здесь не в эффективности, а в присущих вашему контексту рисках статического хранения.

Контекст может меняться во многих событиях, наиболее вероятным из которых является изменение ориентации устройства, поэтому вам не следует ретранслировать его всегда. Я думаю, вам следует передать контекст в конструкторе каждому классу, который, по вашему мнению, будет его использовать (или, скорее, перепроектировать свой код так, чтобы он вам не был нужен там, где он недоступен, хотя это может быть немного сложно).

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

Ответ №2:

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

Это означает, что представления имеют ссылку на всю активность и, следовательно, на все, к чему привязана ваша активность; обычно на всю иерархию представлений и все ее ресурсы. Следовательно, при утечке контекста («утечка» означает, что вы сохраняете ссылку на него, тем самым не позволяя GC собрать его) происходит утечка большого объема памяти. Утечка всего действия может быть действительно легкой, если вы не будете осторожны