<
  • Главная
Статьи

VK.com як бекенд: підводні камені. Вирішуємо проблеми на вимогу читачів

  1. Зміст статті У попередніх статтях ( раз і два ) Була описана розробка мобільного застосування...
  2. Зберігання записів зі стіни
  3. Завантаження картинок
  4. Продовження доступно тільки учасникам
  5. Варіант 2. Відкрий один матеріал

Зміст статті

У попередніх статтях ( раз і два ) Була описана розробка мобільного застосування зі всіма улюбленим VK в ролі безкоштовного і послужливого сервера. Як це часто трапляється з усякими хітровикрученнимі системами, рано чи пізно вони обростають дрібними, але прикрими проблемами, що ускладнюють їх використання. І як тільки це трапляється, журнал «Хакер» знову приходить на допомогу :).

Версія VK API

При виклику будь-якого методу потрібно спеціально вказувати версію API в параметрі v - наприклад, останню v = 5.53. Інакше за замовчуванням він відповість тобі версією, створеної ще при Дурове, а саме 3.0. Її підтримку залишають через дуже старих програм, написаних давно, але працюють по сей день. Проблема з версією полягає в різних JSON-відповідях сервера. Щоб не зустрітися з новою структурою при роботі з методом wall.get, примусово вказуй версію і ще на всякий пожежний - число записів (count). Так API буде вести себе більш передбачувано.

Так 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»?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью