Програмуючи під Android є речі, які ви просто не можете уникати: робота з мережею (networking). Що б це не було: завантаження зображення, робота з API чи просто 1 байт з інтернету - все це робота з мережею.
Враховуючи те на скільки робота з мережею є важливою та фундаментальною в розробці, одне з основних питань з якими стикаються Android розробники це вибір правильного рішення для реалізації конкретної задачі.
Причиною того, що нам доводиться використовувати сторонні бібліотеки є неспроможність android фреймворку реалізувати нормально роботу з мережею, ще з давніх часів, коли панували такі динозаври як Froyo та Gingerbread, доводилося писати раз за разом один і той же код. Враховуючи динаміку з якою розвивався Android було логічно спробувати написати щось своє, чи використати готове рішення від сторонніх розробників, які все розвивались і розвивались.
Для вдалого експерименту припустимо, що для обміну даними з сервером ви використовуєте JSON, працюєте в Android Studio з Gradle.
OkHttp це достатньо новий, швидкий та ефективний Http клієнт, який підтримує HTTP/2 та SPDY і виконує за вас безліч однотипної роботи. Прекрасний спосіб зрозуміти наскільки важко працювати з мережею це поглянути на все те що OkHttp для установки звязку, кешуваання і т.д. OkHttp працює як транспортний рівень.
Враховуючи те на скільки робота з мережею є важливою та фундаментальною в розробці, одне з основних питань з якими стикаються Android розробники це вибір правильного рішення для реалізації конкретної задачі.
Причиною того, що нам доводиться використовувати сторонні бібліотеки є неспроможність android фреймворку реалізувати нормально роботу з мережею, ще з давніх часів, коли панували такі динозаври як Froyo та Gingerbread, доводилося писати раз за разом один і той же код. Враховуючи динаміку з якою розвивався Android було логічно спробувати написати щось своє, чи використати готове рішення від сторонніх розробників, які все розвивались і розвивались.
In the old days networking on Android was a nightmare, nowadays the problem is to find out which solution best fits the project necessities.В цій статті ми поговоримо про конкретні рішення на базі OkHttp, Volley та Gson.
Для вдалого експерименту припустимо, що для обміну даними з сервером ви використовуєте JSON, працюєте в Android Studio з Gradle.
OkHttp це достатньо новий, швидкий та ефективний Http клієнт, який підтримує HTTP/2 та SPDY і виконує за вас безліч однотипної роботи. Прекрасний спосіб зрозуміти наскільки важко працювати з мережею це поглянути на все те що OkHttp для установки звязку, кешуваання і т.д. OkHttp працює як транспортний рівень.
OkHttp використовує Okio, бібліотекою, що доповнює java.io and java.nio та допомагає легше отримати доступ, зберігати та користуватися вашою інформацією.
І OkHttp, і Okio розроблені хлопцями з Square.
Volley це бібліотека, що полегшує роботу з побутовими задачами мережі. Бере на себе запити, завантаження, кешування, поточність, синхронізацію та інші штуки. Легко працювати з JSON, зображеннями, кешем, текстом та дозволяє кастомізованим.
Volley була спроектована для RPC стилю роботи з мережею, що популяризує UI. Являється прекрасною альтернативою для простих, коротких задач.
Volley за замовчуванням використовується на транспортному рівні як Apache Http stack на Froyo та HttpURLConnection stack на Gingerbread і вище. Біда в тому, що є деякі проблеми з http stack на різних версіях Android.
Volley дає можливість простіше налаштувати OkHttp як транспортний рівень.
Volley була розроблений компанією Google.
Gsonце бібліотека серіалізації та десеріалізації JSON, що використовує рефлекцію для попляризації вашої Java моделі об'єктів з об'єктів JSON.
Налаштування
Залежності Gradle в Android Studio
Вам необхідно додати наступні рядки в файл build.gradle вашого додатку.
compile 'com.squareup.okio:okio:1.5.0' compile 'com.squareup.okhttp:okhttp:2.4.0'compile 'com.mcxiaoke.volley:library:1.0.16'compile 'com.google.code.gson:gson:2.3.1'
Версія може відрізнятися з наступними оновленнями.
Volley
Volley створює запит та додає його до черги. Однієї черги достатньо для цілого додатку, тож кожного разу, коли ви робите запит ви отримуєте (лише одну) чергу Volley для всіх ваших запитів.
Я використовую глобальний сінглтон черги для за допомогою наступного методу:
/** * Returns a Volley request queue for creating network requests * * @return {@link com.android.volley.RequestQueue} */public RequestQueue getVolleyRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(this, new OkHttpStack(new OkHttpClient())); } return mRequestQueue; }
Метод, який ми використовуємо для створення нового запиту черги маж HttpStack як параметр. Якщо вив використовуєте метод, який не надає HttpStack Volley створить стек залежності на рівні API. (на основі AndroidHttpClient для API level 9 та HttpURLConnection stack дляAPI level 10 вище)
Як вже було згадано раніше, ми будемо використовувати OkHttp як транспортний рівень, це головна причина використання параметру OkHttpStack. Реалізація OkHttpClient, яку я використовую тут
Наступні методи використовуються для додавання запитів в чергу запитівVolley:
/** * Adds a request to the Volley request queue with a given tag * * @param request is the request to be added * @param tag is the tag identifying the request */public static void addRequest(Request<?> request, String tag) { request.setTag(tag); addRequest(request); }
/** * Adds a request to the Volley request queue * * @param request is the request to add to the Volley queue */public static void addRequest(Request<?> request) { getInstance().getVolleyRequestQueue().add(request); }
And this is the method to cancel requests that should normally used in the onStop lifecycle method.
/** * Cancels all the request in the Volley queue for a given tag * * @param tag associated with the Volley requests to be cancelled */public static void cancelAllRequests(String tag) { if (getInstance().getVolleyRequestQueue() != null) { getInstance().getVolleyRequestQueue().cancelAll(tag); } }
Отже ми налаштували Volley і OkHttp. Тепер ми можемо почати робити запит або String, JsonObject або JsonArray.
Запит JsonObject request виглядатиме так:
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, mUrl, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // Deal with the JSONObject here } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // Deal with the error here } }); App.addRequest(jsonObjectRequest, mTAG);
Ми досі маємо зпарсити об'єкт JSON до нашої Java моделі. Відповідь яку отримуємо від кожного запиту Volley (будь то String, JsonObject чи JsonArray) не така вже насправді й корисна.
Gson
Ми можемо налаштувати запит для отримання відповіді об'єктів Java, які відповідають моделі даних і будуть нам зручнішими. Для цього нам потрібна клас GsonRequest class, що наслідує Volley Request як у цьому прикладі.
В наступному фрагменті коду ми побачимо як буде виглядати виклик GET щоб зпарсити об'єкт Json:
/** * Returns a dummy object parsed from a Json Object to the success listener and a Volley error to the error listener * * @param listener is the listener for the success response * @param errorListener is the listener for the error response * * @return @return {@link com.sottocorp.sotti.okhttpvolleygsonsample.api.GsonGetRequest} */public static GsonRequest<DummyObject> getDummyObject ( Response.Listener<DummyObject> listener, Response.ErrorListener errorListener ) { final String url = "http://www.mocky.io/v2/55973508b0e9e4a71a02f05f"; final Gson gson = new GsonBuilder() .registerTypeAdapter(DummyObject.class, new DummyObjectDeserializer()) .create(); return new GsonRequest<> ( url, new TypeToken<DummyObject>() {}.getType(), gson, listener, errorListener ); }
В цьому прикладі ми можемо бачити як працює GET для масиву Json:
/** * Returns a dummy object's array in the success listener and a Volley error in the error listener * * @param listener is the listener for the success response * @param errorListener is the listener for the error response * * @return @return {@link com.sottocorp.sotti.okhttpvolleygsonsample.api.GsonGetRequest} */public static GsonRequest<ArrayList<DummyObject>> getDummyObjectArray ( Response.Listener<ArrayList<DummyObject>> listener, Response.ErrorListener errorListener ) { final String url = "http://www.mocky.io/v2/5597d86a6344715505576725"; final Gson gson = new GsonBuilder() .registerTypeAdapter(DummyObject.class, new DummyObjectDeserializer()) .create(); return new GsonRequest<> ( url, new TypeToken<ArrayList<DummyObject>>() {}.getType(), gson, listener, errorListener ); }
Парсинг Gson з GsonRequest виконується в фоновому потоці.
В обох попередніх прикладах ми користувалися GET. Якщо цікаво подивитися використання POST це можна зробити за посиланням GsonPostRequest і як користуватися.
OkHttp works as the transport layer for Volley, which on top of OkHttp is a handy way of making network requests that are parsed to Java objects by Gson just before delivering the response to the main thread
Наскільки релевантне дане рішення в 2015 році?
Рішення з бібліотеками Volley/Gson буди популярними в 2013 та 2014 через підтримку Google та наявність на сайті Android Developers. Вони й досі є розумним вибором для використння, оскільки вони легкі в використання, добре працюють та зрозумілі.
source
source
Комментариев нет:
Отправить комментарий