VK.com як бекенд: підводні камені. Вирішуємо проблеми на вимогу читачів
- Зміст статті У попередніх статтях ( раз і два ) Була описана розробка мобільного застосування...
- Зберігання записів зі стіни
- Завантаження картинок
- Продовження доступно тільки учасникам
- Варіант 2. Відкрий один матеріал
Зміст статті
У попередніх статтях ( раз і два ) Була описана розробка мобільного застосування зі всіма улюбленим VK в ролі безкоштовного і послужливого сервера. Як це часто трапляється з усякими хітровикрученнимі системами, рано чи пізно вони обростають дрібними, але прикрими проблемами, що ускладнюють їх використання. І як тільки це трапляється, журнал «Хакер» знову приходить на допомогу :).
Версія VK API
При виклику будь-якого методу потрібно спеціально вказувати версію API в параметрі v - наприклад, останню v = 5.53. Інакше за замовчуванням він відповість тобі версією, створеної ще при Дурове, а саме 3.0. Її підтримку залишають через дуже старих програм, написаних давно, але працюють по сей день. Проблема з версією полягає в різних JSON-відповідях сервера. Щоб не зустрітися з новою структурою при роботі з методом wall.get, примусово вказуй версію і ще на всякий пожежний - число записів (count). Так API буде вести себе більш передбачувано.
Не забудь про версію API
Зберігання записів зі стіни
Щоб отримати всі записи зі стіни групи і мати можливість оновлювати дані, найпростіше кожен раз викачувати всі записи зі стіни послідовно. Метод wall.get віддає дані з кінця стіни; використовуючи зміщення (offset), можна дістатися до кінця. Загальна кількість записів відомо з змінної count відповіді.
Кожну запис простіше зберігати в класі. Ось приклад:
public class ProductStore implements Serializable, Comparable <ProductStore> {private String id; private String category; private String subcategory; private String name; private String price; private String annotation; private String storeName; private String address; private String photo; private boolean selected; private Date startDate, endDate;
Він реалізує два інтерфейси: Serializable і Comparable. Перший використовується для можливості збереження всієї його структури цілком як рядки в SharedPreferences, а другий - для упорядкування списку по id. Його реалізація:
@Override public int compareTo (ProductStore productStore) {return Integer.parseInt (this.getId ()) - Integer.parseInt (productStore.getId ()); }
Для поновлення записів я кожен раз видаляю стару запис зі списку (List) і додаю нову:
mProdList.remove (ps); mProdList.add (ps);
Так у нас з'являється можливість побачити оновлення в запису. Правда, VK дає редагувати нові записи приблизно добу. Пізніше редагування відключається і оновлення стає недоступно, можна тільки публікувати заново.
Коли потрібно попрацювати з усім масивом, я запускаю сортування:
Collections.sort (mProdList);
Завантаження картинок
Для завантаження картинок можуть використовуватися різні бібліотеки: Fresco, Picasso, Universal Image Loader. Я використовую Glide, оскільки він підтримує GIF. Кому-то важлива стабільність роботи бібліотеки, кому-то розмір (в тому числі кількість методів). Я в роботі зіткнувся з дивною поведінкою Glide при завантаженні великої кількості картинок в списках: картинки завантажувалися хаотично, а деякі взагалі не відображалися.
Спіймати помилку допоміг слухач відповідей завантаження. Встановлюється він так:
Glide.with (context) .load (item.getPhoto ()) .diskCacheStrategy (DiskCacheStrategy.SOURCE) .listener (new RequestListener <String, GlideDrawable> () {@Override public boolean onException (Exception e, String model, Target <GlideDrawable > target, boolean isFirstResource) {if (BuildConfig.DEBUG) Log.e ( "IMAGE_EXCEPTION", "Exception" + e.toString ()); return false;} @Override public boolean onResourceReady (GlideDrawable resource, String model, Target < GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {return false;}}) .into (viewHolder.imageView);
В лог тут же звалилося
Exception java.net.SocketTimeoutException: timeout
Діагноз зрозумілий: мобільна мережа погано отримує дані з VK за допомогою стандартного компонента роботи з мережею.
Вихід був у використанні компонента okhttp3. Для його використання потрібно просто прописати його в Gradle:
compile 'com.github.bumptech.glide: okhttp3-integration: 1.4.0@aar'
Glide сам його підхопить при компіляції і буде використовувати. Так стали завантажуватися всі картинки, навіть на найгіршою мобільної мережі.
Продовження доступно тільки учасникам
Варіант 1. Приєднайся до товариства «Xakep.ru», щоб читати всі матеріали на сайті
Членство в співтоваристві протягом зазначеного терміну відкриє тобі доступ до ВСІХ матеріалами «Хакера», збільшить особисту накопичувальну знижку і дозволить накопичувати професійний рейтинг Xakep Score! Детальніше
Варіант 2. Відкрий один матеріал
Зацікавила стаття, але немає можливості стати членом клубу «Xakep.ru»? Тоді цей варіант для тебе! Зверни увагу: цей спосіб підходить тільки для статей, опублікованих більше двох місяців тому.
Ru»?