Библиотеки для передачи данных (lecture 13 – multithreading, network...
TRANSCRIPT
Библиотеки для передачиданных
Android
Денис Клещев
Список библиотек
Для передачи данных:
VolleyOkHTTPRetro�t 2.0AQueryION
Для загрузки изображений:
VolleyGlideUniversal Image LoaderAQuery
Работа с REST-сервером
Необходимо выполнить ряд рутинных операций:
Сформировать запросURLHTTP-заголовкиHTTP-методЗадать тело (как правило JSON)
Выполнить запросПреобразовать полученные результаты
Volley - общее
Библиотека для передачи данных по сетиЕсть инструкция на developer.android.comПредоставляет отдельные классы для работы с изображениями
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>
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 }
Volley - жизненный цикл
Retro�t - общее
Библиотека - REST-клиентВстроенная интеграция с другими библиотеками:
Разлинчые парсеры (GSON, SimpleXML)OkHTTPРазличные HTTP клиентыRxJava
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 }
Retro�t - доступные аннотации
Доступны и другие аннотации:
@GET @POST @PUT @DELETE
@Path @Field @Body @Query
@Multipart + @Part@FormUrlEncoded
@Headers
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 }
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
Работа с изображениями
Так же необходимо выполнять рутинные операции для работы с изображениями:
создать/найти ImageView в кодевыполнить запрос в сетипреобразовать изображение в Drawable/Bitmap
ЗакэшироватьИзменить размерНаложить маску на изображение
Volley - ImageLoader
Еще одна обертка над Request от VolleyЗагружает и кэшируетНе преобразовывает
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 }
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.
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 }
Glide
Библиотека для изображенийЗагружаетКэшируетПреобразовывает + API для трансформации изображений
Интеграция с OkHTTP
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 }
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 }
Glide - отображение изображений1 <meta-data 2 android:name="com.noveogroup.glidesample.GlideConfiguration" 3 android:value="GlideModule"/>
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 }
Быстродействие некоторых библиотек
Что еще посмотреть
RxJava + RxAndroidOtto Event Bus
Полезные ссылки
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'