В прошлых статьях (раз и два) была описана разработка мобильного приложения со всеми любимым 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. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


1 комментарий

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

А ты знал? 10 фактов о Python

Python — язык программирования с достаточно низким порогом вхождения, поэтому его часто вы…