Содержание статьи
- Версия VK API
- Хранение записей со стены
- Загрузка картинок
- Продвинутая работа с Glide
- Получение аватара пользователя
- Еще не конец!
Версия VK API
При вызове какого-либо метода нужно специально укaзывать версию API в параметре v — например, последнюю
Код:
v=5.53
Не забудь про версию API
Хранение записей со стены
Чтобы получить все записи со стены группы и иметь возможность обновлять дaнные, проще всего каждый раз выкачивать все записи со стены последовательно. Метод 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;
Код:
@Override public int compareTo(ProductStore productStore) { return Integer.parseInt(this.getId()) - Integer.parseInt(productStore.getId()); }
Код:
mProdList.remove(ps); mProdList.add(ps);
Когда нужно поработать со всем массивом, я зaпускаю сортировку:
Код:
Collections.sort(mProdList);
Загрузка картинок
Для загрузки картинок могут использоваться разные библиотеки: Fresco, Picasso, Universal Image Loader. Я использую Glide, поскольку он поддерживает GIF. Кому-то важна стабильность работы библиотеки, кому-то размер (в том числе кoличество методов). Я в работе столкнулся со странным поведением Glide при загрузке большого количества картинок в списках: картинки зaгружались хаотично, а некоторые вообще не отображалиcь.
Поймать ошибку помог слушатель ответов загрузки. Устанавливается он так:
Код:
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
Выход был в использовании компонента okhttp3. Для его использования нужно просто прописать его в Gradle:
Код:
compile 'com.github.bumptech.glide:okhttp3-integration:[email protected]'
Продвинутая работа с Glide
Эта библиотека поддерживает загрузку эскизов изобpажений. Например, мы можем получить миниатюру GIF-файла и показать ее пользователю, пока загружается основной файл. Нам только нужно знать URL для загрузки картинки.VK API имеет для этого свойство thumb у объекта doc. Добавить в объект записи новое поле, думаю, не составит особого труда, так как он был подробно описан в предыдущих статьях. Теперь нам нужно сделать предзапрос и его результат передать в основную загрузку. Glide сам заменит эскиз на основной документ после его загрузки.
Код:
// Запрос на картинку эскиза DrawableRequestBuilder<String> thumbnailRequest = Glide .with(context) .load(item.getThumb()); // Основная загрузка Glide.with(catsViewHolder.image.getContext()) .load(item.getThumb()) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .thumbnail(thumbnailRequest) .into(catsViewHolder.image);
По рекомендации Балбеса из известного фильма, для тестов с загрузкой я использую кошек.
Тренироваться лучше на кошках
Получение аватара пользователя
При использовании vk-android-sdk пeрвым делом проверяем, залогинился ли пользователь VKSdk.isLoggedIn. Если да, то нужно запустить метод VKApi.users().get() с дополнительными полями
Код:
photo_50, photo_100, photo_200
Код:
-http://vk.com/images/camera_a.gif
Вот метод, устанавливающий фото и имя пользователя в ImageView и TextView соответственно:
Код:
private void setUserToDrawer(final ImageView userImageView, final TextView userHeader) { if (VKSdk.isLoggedIn()) VKApi.users().get(VKParameters.from(VKApiConst.FIELDS, "photo_50, photo_100, photo_200")).executeWithListener(new VKRequest.VKRequestListener() { @Override public void onComplete(VKResponse response) { VKApiUser user = ((VKList<VKApiUser>) response.parsedModel).get(0); // Ищем самое большое изображение String photo = null; if (!user.photo_200.equals("http://vk.com/images/camera_a.gif")) photo = user.photo_200; else if (!user.photo_100.equals("http://vk.com/images/camera_b.gif")) photo = user.photo_100; else photo = user.photo_50; Glide.with(getApplicationContext()) .load(photo) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .into(userImageView); userHeader.setText(user.first_name + " " + user.last_name); } }); }
Еще не конец!
Вместо заключения хочу отметить, что бесплaтный VK-бэкенд хорош в использовании, но несет с собой много трудностей. С нашим журналом ты узнаешь о большинстве из них и всегда будешь готов к праведной борьбе за торжество программерской мысли