Лучшая практика для передачи контекста в неактивные классы? - PullRequest
48 голосов
/ 24 октября 2011

Итак, мое первое крупное приложение почти закодировано, и я делаю оптимизации для своего кода.Приложение работает нормально, но я не уверен в своем способе передачи контекста другим классам.Я не хочу делать это неправильно.Я наткнулся на статьи и вопросы здесь, в Stackoverflow, о контекстах и ​​о том, как правильно передать его неактивным классам.Я также читаю документацию, но из-за того, что я финн, сложные технические слова еще сложнее понять.

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

Например: MainActivity.java

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle sis){
        super(sis);
        new Helper(MyActivity.this).makeMyAppAwesome();
    }
}

Helper.java

public class Helper {
    Context context;
    Helper(Context ctx){
        this.context = ctx;
    }

    public void makeMyAppAwesome(){
        makeBaconAndEggsWithMeltedCheese(context);
    }
}

ЭтоОК?Было бы неплохо, если бы кто-то мог предоставить легкую для чтения статью с примерами на эту тему.

Ответы [ 3 ]

37 голосов
/ 26 июля 2014

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

Например:

public class MyContextWrapper extends ContextWrapper {

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

    public void makeMyAppAwesome(){
        makeBaconAndEggsWithMeltedCheese(this);
    }
}

И вызовите неактивный класс, как это из Activity

new MyContextWrapper(this);
1 голос
/ 14 января 2018

Обычно в ваших интересах просто передать текущий контекст в тот момент, когда он необходим.Хранение его в переменной-члене, скорее всего, приведет к утечке памяти и возникновению проблем при создании дополнительных операций и служб в приложении.

public void iNeedContext(Context context) {...

Кроме того, в любом классе, имеющем контекст, я бырекомендуем сделать переменную-член для удобства чтения и поиска, а не для прямой передачи или (ClassName.)this.Например, в MainActivity.java:

Context mContext = MainActivity.this;
Activity mActivity = MainActivity.this;
0 голосов
/ 30 мая 2017

Вы также можете создать статическую ссылку на экземпляр вашего MainActivity, инициализированного в методе onCreate()

public class MainActivity extends AppCompatActivity {

    public static MainActivity mMainActivity;

    @Override
    private onCreate(Bundle savedInstanceState){

    //...

    mMainActivity = this;

    }
}

, и вызвать контекст следующим образом:

MainActivity.mMainActivity;

или написатьметод getInstanceOf(), если он более понятен и / или вы предпочитаете использовать метод доступа

MainActivity.getInstanceOf();

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

MainActivity.mMainActivity.myInstanceMethod();

Просто предложение.Критика приветствуется и поощряется.

...