Выбрать главу

   }

   //-------------------------------------------------------------

   //Вызывается, когда встречается конец

   //элемента

   //

   //Мы можем захотеть переключить состояние в зависимости от вида

   //покидаемого узла, чтобы указать на то, что собираемся

   //вернуться назад к его предку

   //-------------------------------------------------------------

   case System.Xml.XmlNodeType.EndElement: {

    bool continueParsing;

    continueParsing = LoadHelper_EndElementEncountered(ref currentReadLocation);

    if (continueParsing ==false) {

     goto finished_reading_wanted_data;

    }

    break;

   }

   default: {

    //He страшно, если имеются XML-узлы других типов, но

    //в нашем примере работы с XML-документом мы должны

    //оповестить об этом факте...

    System.Windows.Forms.MessageBox.Show("Встретился непредвиденный XML-тип " + xmlReader.Name);

    break;

   }

   } //Конец оператора Case, используемого для определения текущего

   //типа XML-элeмeнтa, oбpaбaтывaeмoгo анализатором

   //Перейти к следующему узлу

   readSuccess = xmlReader.Read();

  }

  //Если мы оказались в этом месте программы, не покинув

  //XML-дескриптора UserInfo, то с XML-данными, которые

  //мы считываем, что-то не так

  throw new Exception("He найден элемент UserInfo в XML-документе!");

finished_reading_wanted_data:

  //Закрыть файл, поскольку работа с ним закончена!

  xmlReader.Close();

 }

 //--------------------------------------------------------

 //Вспомогательный код, ответственный за принятие решения

 //относительно того, в какое состояние необходимо перейти,

 //когда встречается закрывающий дескриптор

 //--------------------------------------------------------

 private static bool LoadHelper_EndElementEncountered(ref ReadLocation currentReadLocation) {

  switch (currentReadLocation) {

  //Если мы покидаем узел Name, то должны вернуться

  //обратно в узел UserInfo

  case ReadLocation.inName: {

   currentReadLocation = ReadLocation.inUserInfo;

   break;

  }

  //Если мы покидаем узел FirstName, то должны вернуться

  //обратно в узел Name

  case ReadLocation.inFirstName: {

   currentReadLocation = ReadLocation.inName;

   break;

  }

  //Если мы покидаем узел LastName, то должны вернуться

  //обратно в узел Name

  case ReadLocation.inLastName: {

   currentReadLocation = ReadLocation.inName;

   break;

  }

  //Если мы покидаем узел UserID, то должны вернуться

  //обратно в узел UserInfo

  case ReadLocation.inUserID: {

   currentReadLocation = ReadLocation.inUserInfo;

   break;

  }

  //Если мы покидаем узел UserInfo, то мы только что

  //закончили чтение данных в узлах UserID, FirstName

  //и LastName.

  //

  //Можно выйти из цикла, поскольку у нас уже есть вся

  //информация, которую мы хотели получить!

  case ReadLocation.inUserInfo: {

   return false; //Анализ должен быть прекращен

  }

  }

  return true; //Продолжить анализ

 }

 private static void LoadHelper_NewElementEncountered(string nodeName,ref ReadLocation currentReadLocation) {

  //------------------------------------------------------

  //Мы вошли в новый элемент!

  //

  //B какое состояние переход возможен, зависит от того, в

  //каком состоянии мы находимся в данный момент

  //------------------------------------------------------

  switch (currentReadLocation) {

  //Если мы находимся в узле AllMyData, то переход возможен

  //в узлы, которые указаны ниже

  case (ReadLocation.inAllMyData): {

   if (nodeName == XMI_USERINFO_TAG) {

    currentReadLocation = ReadLocation.inUserInfo;

   }

   break;

  }

  //Если мы находимся в узле UserInfo, то переход возможен

  //в узлы, которые указаны ниже

  case (ReadLocation.inUserInfo): {

   if (nodeName == XML_USERID_TAG) {

    currentReadLocation = ReadLocation.inUserID;

   } else if (nodeName == XML_NAMEINFO_TAG) {

    currentReadLocation = ReadLocation.inName;

   }

   break;

  }

  //Если мы находимся в узле Name, то переход возможен

  //в узлы, которые указаны ниже

  case (ReadLocation.inName): {

   if (nodeName == XML_FIRSTNAME_TAG) {

    currentReadLocation = ReadLocation.inFirstName;

   } else if (nodeName == XML_LASTNAME_TAG) {

    currentReadLocation = ReadLocation.inLastName;

   }

   break;

  }

  }

 } //Конец функции

} //Конец класса

Повышение производительности приложения перекладыванием работы на другие программы

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