и операція завантаження знімка займає дуже велику кількість часу і при цьому не повинна перериватися, для її виконання сервіс входить в привілейований режим за допомогою виклику start Foreground. Це означає, що користувач може спокійно згорнути програму чекаючи закінчення завантаження, не побоюючись того, що ОС завершить додаток з метою економії ресурсів. По завершенню завантаження, сервіс виходить з привілейованого режиму використовуючи метод stop Foreground. В якості одного з параметрів метод start Foreground приймає спеціальний об'єкт-нотифікацію, що представляє собою повідомлення в рядку стану телефону, яке вказує на те, що в даний момент відбувається деяка тривала високопріоритетного операція. Метод stop Foreground, у свою чергу, приймає як параметр прапор, який вказує на те, чи слід автоматично прибрати нотифікацію, створену при вході в привілейований режим або ж користувач повинен буде зробити це сам.
По-друге, в метод upload Picture можна бачити, що зображення для завантаження передається не як параметр ІНТЕНТ, як це зроблено з логіном та паролем у методі logIn, а через статичне поле в класі Image Store. Це зроблено для того, щоб обійти обмеження, що накладається ІНТЕНТ на розмір своїх параметрів. Зображення найчастіше перевищують певний для параметрів ліміт байт, що призводить до виникнення винятків під час виконання програми.
private void savePicture (Intent intent) throws IOException {metadata=intent.getParcelableExtra (.METADATA_FIELD); result=webClient.sendMetadata (metadata); (! result) {( Save metadata error ) ;
} else {.clean (); (new Intent ());
}
Метод save Picture, аналогічно методу logIn, інкапсулює вилучення даних з ІНТЕНТ, однак якщо логін і пароль передавалися як прості строкові параметри, то тут використовується складна структура Metadata. Для забезпечення пересилання складних структур даних можна скористатися наданої Java бінарної сериализацией об'єктів, проте це не є ефективним способом Конверсія даних. Замість цього, Android SDK надає куди більш гнучкий і швидкий спосіб заснований на інтерфейсі Parcelable. Кожен Parcelable-об'єкт повинен реалізовувати метод void write To Parcel (Parcel parcel, int i), який викликається кожного разу при перетворенні даних для пересилки. Об'єкт parcel являє собою чергу, здатну зберігати рядки, примітивні типи і їх масиви. Крім цього, реалізують Parcelable класи повинні містити статичне поле CREATOR з об'єктом класу спадкоємця типу Parcelable. Creator lt; Т gt ;, де Т - тип, який містить поле CREATOR. Інетрфейс Parcelable. Creator lt; Т gt; визначає метод Т create From Parcel (Parcel in), який викликається на приймаючій стороні. Цей метод витягує з черги in дані і створює з них копію пересилається Parcelable-об'єкта. Приклад реалізації інтерфейсу Parcelable представлений нижче за допомогою фрагментів класу Metadata:
public class Metadata implements Parcelable {
lt; Оголошення властивостей і констант gt;
@ Overridevoid writeToParcel (Parcel parcel, int i) {.writeInt (storeId)
lt; Запис інших властивостей в чергу parcel gt;
parcel.writeString (wasTaken);
} static final Parcelable.Creator lt; Metadata gt; CREATOR=Parcelable.Creator lt; Metadata gt; () {Metadata createFromParcel (Parcel in) {metadata=new Metadata () ;. storeId=in.readInt ();
lt; Витяг інших властивостей з черги in gt;
metadata.wasTaken=in.readString (); metadata;
} Metadata [] newArray (int size) {new Metadata [size];
}
В даному випадку, об'єкт CREATOR представлений анонімні класом, що спрощує ініціалізацію створюваного ним об'єкта класу Metadata.
Реалізацію методів інтерфейсу I Web Client розглянемо на прикладі методу logIn класу Web Client, лістинг якого приведений нижче:
@ OverrideString logIn (String login, String password) IOException {= Basic + Base64.encodeToString (.format (% s:% s raquo ;, login, password). () , Base64.NO_WRAP); response=(API_LOGIN, new JsonHelper (). toStringEntity ()); (response!=null) {status=response. (). getStatusCode (); (status == HttpStatus.SC_UNAUTHORIZED) {AuthorizationHelper. AUTHORIZATION_ERROR;
} else if (status == HttpStatus.SC_OK) {reader=.getReaderForResponse (response); role=null; (reader!=null) {{.beginObject () ;. nextName (); =reader.nextString () ;. close ();
} catch (IOException e) {.printStackTrace ();
} role;
} response.getStatusLine (). toString ();
} Error: Unable to get response raquo ;;...