Библиотеки для передачи данных (lecture 13 – multithreading, network...

25
Библиотеки для передачи данных Android Денис Клещев

Upload: noveo

Post on 13-Apr-2017

86 views

Category:

Education


5 download

TRANSCRIPT

Page 1: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Библиотеки для передачиданных

Android

Денис Клещев

Page 2: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Список библиотек

Для передачи данных:

VolleyOkHTTPRetro�t 2.0AQueryION

Для загрузки изображений:

VolleyGlideUniversal Image LoaderAQuery

Page 3: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Работа с REST-сервером

Необходимо выполнить ряд рутинных операций:

Сформировать запросURLHTTP-заголовкиHTTP-методЗадать тело (как правило JSON)

Выполнить запросПреобразовать полученные результаты

Page 4: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Volley - общее

Библиотека для передачи данных по сетиЕсть инструкция на developer.android.comПредоставляет отдельные классы для работы с изображениями

Page 5: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Volley - формирование запроса

Запрос на получение строки:

1 StringRequest stringRequest = new StringRequest( 2 Request.Method.GET, url, responseListener, errorListener);

Запрос на получение Json-объекта:

1 JsonObjectRequest jsObjectRequest = new JsonObjectRequest( 2 Request.Method.PUT, url, jsonBody, responseListener, errorListener);

Запрос на получение Json-массива:

1 JsonArrayRequest jsArrayRequest = new JsonArrayRequest( 2 Request.Method.POST, url, jsonBody, responseListener, errorListener);

Так же можно создать свой Request extends Request<T>

Page 6: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Volley - выполнение запроса 1 class NetworkFacade { 2 3 static RequestQueue QUEUE = 4 Volley.newRequestQueue(Application.getContext()); 5 6 static void performRequest(final Object sender, final Request request) { 7 //set request headers 8 request.setTag(sender == null ? null : sender.getClass()); 9 QUEUE.add(request); 10 } 11 12 static void cancelRequests(final Object sender) { 13 QUEUE.cancelAll(sender.getClass()); 14 } 15 16 }

Page 7: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Volley - жизненный цикл

Page 8: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Retro�t - общее

Библиотека - REST-клиентВстроенная интеграция с другими библиотеками:

Разлинчые парсеры (GSON, SimpleXML)OkHTTPРазличные HTTP клиентыRxJava

Page 9: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Retro�t - формирование запроса 1 interface NetworkClient { 2 3 @GET("/entities/{id}") 4 Call<Response> getById( 5 @Path("id") int id, 6 @Query("type") String type 7 ); 8 9 @POST("/entities/complete") 10 Call<Response> send( 11 @Body EntityBody body 12 ); 13 14 @FormUrlEncoded 15 @PUT("/change_password") 16 Call<Response> changePassword( 17 @Query("app_token") String appToken, 18 @Field("old_password") String oldPassword, 19 @Field("password") String newPassword 20 ); 21 22 }

Page 10: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Retro�t - доступные аннотации

Доступны и другие аннотации:

@GET @POST @PUT @DELETE

@Path @Field @Body @Query

@Multipart + @Part@FormUrlEncoded

@Headers

Page 11: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Retro�t - выполнение запроса 1 interface NetworkClient { 2 3 //в `Retrofit 2.0` синхронный и асинхронный запрос выглядят одинаково: 4 @GET("users/list") 5 Call<List<User>> userList(); 6 7 @GET("users/list") 8 Observable<List<User>> userListObserv(); 9 10 }

Page 12: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Retro�t - выполнение запроса 1 class Sample { 2 private NetworkClient rest; 3 4 public Sample() { 5 final RestAdapter restAdapter = new RestAdapter.Builder() 6 .setEndpoint("http://noveogroup.com") 7 .setExecutors( 8 Executors.newFixedThreadPool(3), new MainThreadExecutor()) 9 .setConverter(new GsonConverter(gson)) 10 .build(); 11 rest = restAdapter.create(NetworkClient.class); 12 } 13 14 private void someMethod() { 15 final Call<List<User>> userListCall = rest.userList(); 16 17 //синхронный вызов 18 new Thread(new Runnable() { 19 public void run() { 20 List<User> userList = userListCall.execute(); 21 } 22 }).start(); 23

Page 13: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Работа с изображениями

Так же необходимо выполнять рутинные операции для работы с изображениями:

создать/найти ImageView в кодевыполнить запрос в сетипреобразовать изображение в Drawable/Bitmap

ЗакэшироватьИзменить размерНаложить маску на изображение

Page 14: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Volley - ImageLoader

Еще одна обертка над Request от VolleyЗагружает и кэшируетНе преобразовывает

Page 15: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Volley - ImageLoader создание 1 class NetworkFacade { 2 3 public static final ImageLoader imageLoader = 4 new ImageLoader(QUEUE, new ImageLoader.ImageCache() { 5 private final LruCache<String, Bitmap> 6 cache = new LruCache<String, Bitmap>(20); 7 8 @Override 9 public Bitmap getBitmap(String url) { 10 return cache.get(url); 11 } 12 13 @Override 14 public void putBitmap(String url, Bitmap bitmap) { 15 cache.put(url, bitmap); 16 } 17 }); 18 19 }

Page 16: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Volley - ImageLoader использование 1 class Sample { 2 3 private void someMethod() { 4 ImageListener imageListener = ImageLoader.getImageListener( 5 imageView, 6 R.drawable.def_image, 7 R.drawable.err_image); 8 NetworkFacade.imageLoader.get(URL, imageListener); 9 } 10 11 }

Либо самим реализовывать interface ImageLoader.ImageListener.

Page 17: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Volley - ImageLoader - использование

layout.xml:

1 <com.android.volley.toolbox.NetworkImageView 2 android:id="@+id/networkImageView" 3 android:layout_width="150dp" 4 android:layout_height="170dp" 5 android:layout_centerHorizontal="true" />

Sample.java:

1 class Sample { 2 3 private void someMethod() { 4 NetowrkImageView networkImageView = 5 (NetworkImageView) findViewById(R.id.networkImageView); 6 mNetworkImageView.setImageUrl(IMAGE_URL, NetworkFacade.imageLoader); 7 } 8 9 }

Page 18: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Glide

Библиотека для изображенийЗагружаетКэшируетПреобразовывает + API для трансформации изображений

Интеграция с OkHTTP

Page 19: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Glide - загрузка изображений 1 class Sample { 2 3 private Glide glide; 4 5 public Sample(final Context context) { 6 glide = Glide.with(context); 7 } 8 9 private void someMethod() { 10 glide.load(R.drawable.sample_image).into(imageView1); 11 glide.load("file:///android_asset/image.png").into(imageView2); 12 glide.load(new File("path/to/sample/image.png")).into(imageView3); 13 14 glide.load(url) 15 .placeholder(R.drawable.image_placeholder) 16 .error(R.drawable.image_error) 17 .resize(50, 50) 18 .transform(new CropSquareTransformation()) 19 .fit().centerCrop() 20 .into(imageView); 21 } 22 23 }

Page 20: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Glide - отображение изображений

По умолчанию glide использует формат RGB_565. Это экономит 50% памяти.

Если нужен ARGB_8888:

1 public class GlideConfiguration implements GlideModule { 2 3 @Override 4 public void applyOptions(Context context, GlideBuilder builder) { 5 // Apply options to the builder here. 6 builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); 7 } 8 9 @Override 10 public void registerComponents(Context context, Glide glide) { 11 // register ModelLoaders here. 12 } 13 }

Page 21: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Glide - отображение изображений1 <meta-data 2 android:name="com.noveogroup.glidesample.GlideConfiguration" 3 android:value="GlideModule"/>

Page 22: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Glide - трансформация изображений

Создаем свой класс и используем его, все просто:

1 class CropSquareTransformation implements BitmapTransformation { 2 @Override 3 Bitmap transform(BitmapPool pool, Bitmap toTransform, 4 int outWidth, int outHeight) { 5 int size = Math.min(toTransform.getWidth(), toTransform.getHeight()); 6 int x = (toTransform.getWidth() - size) / 2; 7 int y = (toTransform.getHeight() - size) / 2; 8 Bitmap result = Bitmap.createBitmap(toTransform, x, y, size, size); 9 if (result != toTransform) { toTransform.recycle(); }10 return result; 11 } 12 13 @Override 14 //just for cache options 15 public String getId() { return "square()"; } 16 }

Page 23: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Быстродействие некоторых библиотек

Page 24: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Что еще посмотреть

RxJava + RxAndroidOtto Event Bus

Page 25: Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))

Полезные ссылки

developer.android.com/training/volleysquare.github.io/retro�tsquare.github.io/picassosquare.github.io/okhttpreactivex.iosquare.github.io/otto

Dependency

compile 'com.mcxiaoke.volley:library:1.0.+@aar'

compile 'com.squareup.picasso:picasso:2.5.2'

compile 'com.squareup.retrofit:retrofit:1.9.0'

compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'

compile 'com.squareup.okhttp:okhttp:2.0.0'