2012-04-24 2 views
2

Давайте использовать пользовательский или расширенный вид в качестве примера.Получение контекста из getContext() или из конструктора в качестве поля

Насколько эффективен сэкономить Context параметр от конструктора в качестве поля, чем вызов getContext() везде (предположим, есть, допустим, 10 или более мест, где это необходимо)?

ответ

1

View#getContext() является

class View { 
    protected Context mContext; 
    public final Context getContext() { 
     return mContext; 
    } 
} 

и локально кэшированные реализации:

class X { 
    private final Context mLocalContext; 
    public X(Context ctx) { 
     mLocalContext = ctx; 
    } 
} 

Сейчас есть очень небольшая разница, когда вы используете mLocalContext вместо getContext(). JVM может получить требуемую ссылку объекта контекста, не выполняя метод (который занимает крошечный бит дополнительного времени). Этот вызов нельзя оптимизировать, так как View#mContext изменен (может измениться). В локальном примере можно предположить, что mLocalContext не может изменить и оптимизировать код немного лучше. [Примечание: я не уверен на 100% о том, какие оптимизации/могут быть сделаны)

Разница может быть измеримой, если вы используете контекст много, но в этом случае это не имеет большого значения. По-прежнему рекомендуется кэшировать объекты локально, если они вам понадобятся часто. Особенно, когда их (ре) конструкция требует времени (например, когда getContext() создаст new Context() или около того).

4

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

+3

Я согласен с Agarwal. Хранение значения локально - это самый быстрый подход; даже для быстрых, легких функций, таких как 'getContext()'. Вот руководство Dev в [Designing for Performance] (http://developer.android.com/guide/practices/design/performance.html), ознакомьтесь с разделом «Избегайте внутренних Getters/Setters». – Sam

1

Похоже, из исходного кода, конструктор View запоминает параметр контекста, и это то, что getContext() возвращает:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/view/View.java#View.getContext%28%29

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

Смежные вопросы