Как правильно реализовать конструктор в Android, в частности, в контексте приложения? - PullRequest
3 голосов
/ 18 декабря 2011

Как правильно реализовать конструктор в Android?

Похоже, что в Activity или Сервисе onCreate () - это то, где происходит магия.

Причина, по которой я спрашиваюпотому что я хотел бы быть уверен, что правильно делаю, объявляя атрибуты в верхней части моих классов (в частности, Context), а затем устанавливая значения атрибутов внутри onCreate.

// Activity launched via an Intent, with some 'extras'
public class SomeActivity extends Activity {

    private Context context;
    private String foo;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set the object attribute for later use, good or Bad to do this?
        context = getApplicationContext();
        Intent fooIntent = getIntent();
        foo = fooIntent.getStringExtra("foo");
    }

    private void someMethodThatNeedsContext() {
        // For example:
        Cursor c = this.context.getContentResolver().query(foo, xxx, xxx);
        // Or is it better practice to:
        // A) Pass the context as a local variable to this method
        // B) Use getApplicationContext() locally when needed
    }
}

Может быть, любой из этихварианты в порядке, и я над этим думаю?Любое конкретное чтение и / или предложения, которые у вас могут быть, были бы очень полезны для меня.

Ответы [ 3 ]

2 голосов
/ 18 декабря 2011

Да, вы правы, что инициализация должна происходить в onCreate().На самом деле вам не нужно ни хранить ссылку на контекст, ни вызывать getApplicationContext().Ваша деятельность сама по себе является контекстом, поэтому вы просто используете везде, где вам нужен контекст.Например, сделать тост в упражнении:

Toast.makeToast(this, "Some text", Toast.LENGTH_LONG).show();
1 голос
/ 18 декабря 2011

Опция B - Поскольку вы можете вызывать getApplicationContext() из любых нестатических методов в вашем классе Activity.Фактически, Activity также является производным от Context (где-то в дереве наследования ..), поэтому вы можете просто сделать:

Cursor c = getContentResolver()....

Вам не нужно хранить ссылку на контекст. Особенно не статично, это может вызвать проблемы.

И вы правы - поскольку вы обычно не создаете свой собственный конструктор для Activity, вы помещаете код для конструирования в onCreate.

1 голос
/ 18 декабря 2011

Вы пишете метод внутри своей деятельности, поэтому вы можете вызывать getApplicationContext() в любом месте вашего кода, вам не нужно использовать локальную переменную:

Cursor c = getApplicationContext().getContentResolver().query(foo, xxx, xxx);

Также помните, что само действие является контекстом (класс Activity является производным от Context), поэтому обычно вы можете использовать this всякий раз, когда вам нужно предоставить контекст (например, при создании Intent: new Intent(this, ...)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...