Доступ к классу приложения из класса, отличного от Activity

1

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

public class MyApplication extends Application {

  private String str;

  public String getStr(){
    return str;
  }
  public void setStr(String s){
    str = s;
  }
}

и я могу получить доступ к этой переменной из такой активности:

MyApplication appState = ((MyApplication)getApplicationContext());
String str = appState.getStr();

Это нормально, но у меня также есть класс парсера xml:

public class MyXMLHandler extends DefaultHandler {

и если я попытаюсь сделать то же самое здесь

    MyApplication app = ((MyApplication)getApplicationContext());
    String str = app.getStr();

Я получаю The method getApplicationContext() is undefined for the type MyXMLHandler

Как мне получить доступ к моей переменной?

Теги:

2 ответа

4
Лучший ответ

Ну, обычно класс парсера XML должен быть независимым от какого-либо специального контекста. Это означает, что разработчик должен иметь возможность использовать его независимо от того, разрабатывает ли он приложение или службу или библиотеку или что бы то ни было.

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

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

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

В приведенном выше примере:

MyApplication app = ((MyApplication)getApplicationContext());
MyXmlHandler handler = new MyXmlHandler(app.getStr());

Вы должны действительно следить за тем, чтобы "материал инструмента" был отделен от всего, что помешало бы вам использовать его повсеместно. Что произойдет, если вы захотите использовать свой класс XML Parser в другом проекте, где ваш параметр не указан контекстом приложения, а какой-то другой класс?

Я уверен, что вы можете провести недельную дискуссию об объектно-ориентированном дизайне и о том, как все должно быть сделано, - но это в основном, как я это сделаю...

  • 0
    Хорошо, спасибо, я думаю, что вы правы. Я не хотел передавать какие-либо параметры из контекста в парсер, я просто хотел, чтобы парсер записывал результаты синтаксического анализа в класс Application, так как мне нужны эти результаты в нескольких действиях. Я сделаю это по-другому, я верну результаты из анализатора в активность вызывающего и затем запишу их в приложение. Это правильный подход? Спасибо
  • 0
    Ну, звучит хорошо для меня :-)
Показать ещё 1 комментарий
0

Thorsten прав, но если вы все еще решите использовать свое приложение, вы можете использовать Singleton.

public class MyApplication extends Application {

private static MyApplication instance;

public static MyApplication getInstance() {
   if(instance == null){
      instance = new MyApplication();
   }
   return instance;
 }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню