Какой класс реализует методы ContextWrapper в Android? - PullRequest
3 голосов
/ 25 января 2012

Во время разработки Android-приложений мне нравится смотреть на внутренние реализации SDK. Это огромный фреймворк, и иногда он очень помогает, если вы знаете, как реализованы внутренние методы.

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

Проблема в том, что я не смог найти некоторые методы, которые меня интересуют. Давайте возьмем getResources в качестве примера. У меня есть ContextObject и вызываю getResources на нем. Этот контекст является экземпляром Activity (который сам по себе не реализует getResources()).

То же самое для ContextThemeWrapper, который является прямым родительским классом Activity. Затем ContextWrapper вызывает getResources() на своем элементе Context. Но кто тогда это реализует?

РЕДАКТИРОВАТЬ: добавлен фрагмент из ContextWrapper

public class ContextWrapper{
    Context mContext

    public ContextWrapper(Context ctx){
        mContext = ctx
    }

    public Resourced getResources(){
        return mContext.getResources()
    }

    //... all other Methods are implementing the same AdapterPattern
}

поэтому вопрос также может быть «какой контекст передается в ContextWrapper, который реализует требуемые методы»

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Я наконец-то узнал сам с помощью полезного совета от nicholas.hausschild, чтобы просто запустить отладчик.

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

Для всех, кто интересуется этими источниками: clickme

2 голосов
/ 25 января 2012

Метод getResources() в классе Context является абстрактным, что означает, что все, что унаследовано от него, необходимо для обеспечения или переопределения его реализации. Реализация getResources() в классе ContextWrapper является конкретной, и именно здесь вы должны найти его код.

Кроме того, ваша цепочка наследования немного задом наперед. Activity - это подкласс ContextThemeWrapper, а не наоборот:

java.lang.Object
  ↳ android.content.Context              // abstract Resources getResources()
    ↳ android.content.ContextWrapper     // Resources getResources()
      ↳ android.view.ContextThemeWrapper // inherits ContextWrapper.getResources()
        ↳ android.app.Activity           // inherits ContextWrapper.getResources()

Справочник разработчика Android 1013 * поможет вам со структурами наследования.

...