2-) retrofitte timeout süresi ayarlama -> ServiceGenerator.java -> son hali bunu kullan
package com.webpos.ramazan.rmos.rmossay.WebServis;
import com.webpos.ramazan.rmos.rmossay.MainActivity;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ServiceGenerator {
public static String baseUrl = MainActivity.MyWebServis;
public static Retrofit retrofit;
private static Retrofit.Builder builder = new Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(GsonConverterFactory.create());
private static OkHttpClient.Builder httpClient = new OkHttpClient().newBuilder();
public static <S> S createService(Class<S> serviceClass) {
httpClient.connectTimeout(30, TimeUnit.SECONDS);
httpClient.readTimeout(30, TimeUnit.SECONDS);
httpClient.writeTimeout(30, TimeUnit.SECONDS);
builder.client(httpClient.build());
retrofit = builder.build();
return retrofit.create(serviceClass);
}
}
1-) Android - retrofit
link aşağıdadır istersen linkten
bakabilirsin
http://abdullahbalta.com/android-retrofit-ve-glide-kutuphaneleri-kullanimi/
Formun Üstü
Formun Altı
Android: Retrofit 2 ve Glide Kütüphaneleri Kullanımı
07 SEPTEMBER 2016 on android, kütüphane, library, recyclerview, kullanımı, retrofit, glide, image, internet 0 Comments
Merhaba arkadaşlar, askerlik
dönüşünden sonra yeni konularımızla tekrar Android derslerine devam ediyorum.
Bu uygulamamızda bir network kütüphanesi olan Retrofit ve
görüntü kütüphanesi olan Glide kütüphanesini kullanacağız. Şimdi
kısaca bu kütüphanelerin özelliklerine bakarak yazımıza devam edelim.
Retrofit 2 Kütüphanesi
İlk başlarda http sorguları için
AsyncTask kullanıyorduk. Bu yöntem nispeten yavaş çalışıyordu ve çoklu
sorgularda ise daha karmaşık bir yapı ortaya çıkarıyordu. Volley kütüphanesi
ile AsyncTask kullanma zorunluluğunu ortadan kaldırmıştık. Çünkü, Volley http
sorgularını varsayılan olarak asekron olarak yapabiliyordu. Bende bu konu
hakkında daha önce bir yazı yazmıştım.
Android Volley Kütüphanesi kullanımı için tıklayınız.
Retrofit kütüphanesi ise kullanım
kolaylığı, performans ve gelişmiş özellikleri bakımından Volley için iyi bir
alternatif sağlar. Retrofit 2 ise Retrofit kütüphanesinin daha gelişmişidir.
Retrofit 2 ile OkHttp, Okio gibi kütüphanelere ihtiyacımız kalmıyor. Ayrıca,
Retrofit 2 ile gelen Call sınıfı sayesinde basitçe
request/response sınıfları oluşturabiliyoruz.
Glide Kütüphanesi
Glide kütüphanesi ise medya yükleme
kütüphanesidir. İnternette bulunan her türlü resim ve video formatlarını
uygulamamızda görüntülemeye yarar. Bu kütüphanenin bazı özelliklerinden
bahsedecek olursak aşağıdaki şekilde bir liste çıkarabiliriz.
·
Video, resim
ve animasyonlu gif formatlarını destekler.
·
Medya
yüklenmeden önce geçici bir resim eklenebilir.
·
Resim
yüklenmeden önce blurlu bir şekilde görüntülenebilir.
·
Çeşitli
resim dönüşümleri yapılabilinir.
·
Hafıza ve
disk cacheleme işlemleri yapılabilinir.
Kütüphanelerin Projeye Eklenmesi
Bu uygulamamızda bir Json
datasından çektiğimiz resim ve textleri, recyclerview
içerisinde göstereceğiz. Daha önce bu konseptte uygulamalar yapmıştık.
Bunun için build.gradle dosyasına
aşağıdaki şekilde dependencileri eklemeniz gerekiyor.
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.google.code.gson:gson:2.7'
compile 'com.android.support:recyclerview-v7:23.4.0'
Buradaki sürümler sizin
bulduklarınızdan eski olabilir. Bu şekilde eklemek yerine File >
Project Structure penceresinden Dependencies tabına
gelerek + butonuna tıklayarak da kütüphaneleri ekleyebilirsiniz.
Android Studio Kütüphane Ekleme
Kütüphaneleri ekledikten sonra
AndroidManifest'ten internet iznini vermeyi unutmayınız.
Android Gson Model
Bu projede kullanacağımız json
verisini incelediğinizde en dışta bir JsonArray olduğunu göreceksiniz.
Bu JsonArray'i içinde ise JsonObject'leri bulunmaktadır. Şimdi bu
json verimizi kullanarak bir model sınıfı oluşturalım. Bu model sınıfı
oluştururken online bir araçkullanacağız. Bu linkteki json
verimizi kopyalayıp, buradaki online araca yapıştırıyoruz.
Ayarları aşağıdaki şekilde girdikten sonra Preview tıklayarak. Movie.java model
sınıfımızı oluşturuyoruz.
Json Verisi ile Gson Sınıfı Oluşturma
package
com.abdullahbalta.retrofitglideexample.model;
import com.google.gson.annotations.Expose;
import
com.google.gson.annotations.SerializedName;
public class Movie {
@SerializedName("name")
@Expose
public String name;
@SerializedName("url")
@Expose
public Url url;
@SerializedName("timestamp")
@Expose
public String timestamp;
public class Url {
@SerializedName("small")
@Expose
public String small;
@SerializedName("medium")
@Expose
public String medium;
@SerializedName("large")
@Expose
public String large;
}
}
Yukarıda bazı GSON annotationları
(kısaltmaları) kullanılmıştır. Kısaca bunları açıklamak gerekirse @SerializedName kısaltması
Json anahtarını parametre alarak bunu serialize olduğunu söyler. Bu kısaltmayı
kullandığımız takdir de değişken isimlerini istediğimiz gibi
değiştirebiliriz. @Expose kısaltması ise bize altından bulunan
değişkenin serialize ya da deserialize yapılabildiğini gösterir. @Expose(deserialize
= false) ya da @Expose(serialize = false, deserialize = false) kullanım
şekilleri ile serialize ya da deserialize özelliklerini kapatabiliriz.
Retrofit Yardımcı Sınıflar
Model sınıfımızı oluşturduktan sonra
bir adet sınıf ve bir adet interface oluşturuyoruz. Öncelikle RetroClient.java sınıfından
bahsedeyim. Burada amacımız static bir retrofit nesnesi oluşturup. Bu nesneye
ana adresimizi tanımlayıp daha sonra kullanmak üzere build ediyoruz.
package
com.abdullahbalta.retrofitglideexample.interfaces;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.Retrofit;
/**
* Created by asus on 6.09.2016.
*/
public class RetroClient {
public static final String BASE_URL = "http://api.androidhive.info";
private static Retrofit retrofit = null;
public static
Retrofit getClient() {
if (retrofit==null) {
retrofit = new
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
Bu kısımdan sonra istediğimiz http
çağrılarını yapabilmemize yardımcı olan bir RetroInterface.java interface'ini
oluşturuyoruz. Aşağıda gördüğünüz üzere bir @GETannotation'ı
ve Call tipinde Movie[] parametresi alan bir
metot görüyorsunuz. Öncelikle @GET annotation'ı içerisine bakacak olursak bir
path görüyoruz. Bu demek oluyor ki, daha önce oluşturduğumuz url'in ilgili
path'ine bir GET çağrısı yapıyoruz demek. Alttaki metot ise bize bir JsonArray
tipinde bir nesne döneceğini gösteriyor. Bu yüzden tanımlamamızda [] köşeli
parantez kullanıyoruz.
package
com.abdullahbalta.retrofitglideexample.interfaces;
import
com.abdullahbalta.retrofitglideexample.model.Movie;
import retrofit2.Call;
import retrofit2.http.GET;
/**
* Created by asus on 6.09.2016.
*/
public interface RetroInterface {
@GET("/json/glide.json")
Call<Movie[]> getJsonValues();
}
Burada Retrofit kullanarak basit bir
GET sorgusu nasıl yapılır bunu görmüş olduk. Tabi tüm http sorguları bu kadar
basit olmak zorunda değil çeşitli parametreler ve header değerleri girerek POST
sorgusu da yapmak mümkündür. Bunun için yazının başında resmi adresini verdiğim
Retrofit sayfasını inceleyebilirsiniz.
Adapter ve Activity Sınıfları
Verilerimizi çekip recyclerview da
göstereceğimiz için bir tane recyclerview adapteri oluşturuyoruz. Bu projede
her bir hücrede bir tane thumbnail resmi ve 2 adet textview kullandığımız
için MovieAdapter.java aşağıdaki gibi oluşturuyorum.
package com.abdullahbalta.retrofitglideexample.adapter;
import
android.content.Context;
import
android.support.v7.widget.RecyclerView;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.ImageView;
import
android.widget.TextView;
import
com.abdullahbalta.retrofitglideexample.R;
import
com.abdullahbalta.retrofitglideexample.model.Movie;
import
com.bumptech.glide.Glide;
import
com.bumptech.glide.load.engine.DiskCacheStrategy;
import java.util.List;
/**
* Created by asus on 7.09.2016.
*/
public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MovieViewHolder> {
private List<Movie> movies;
private int rowLayout;
private Context context;
public static class MovieViewHolder extends RecyclerView.ViewHolder {
ImageView thumbnail;
TextView movieTitle;
TextView date;
public MovieViewHolder(View v) {
super(v);
thumbnail = (ImageView)
v.findViewById(R.id.list_image);
movieTitle = (TextView)
v.findViewById(R.id.title);
date = (TextView)
v.findViewById(R.id.time_text);
}
}
public MovieAdapter(List<Movie> movies, int rowLayout, Context context) {
this.movies = movies;
this.rowLayout = rowLayout;
this.context = context;
}
@Override
public MovieAdapter.MovieViewHolder onCreateViewHolder(ViewGroup parent, int
viewType) {
View view =
LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false);
return new MovieViewHolder(view);
}
@Override
public void onBindViewHolder(MovieAdapter.MovieViewHolder
holder, int position) {
holder.movieTitle.setText(movies.get(position).name);
holder.date.setText(movies.get(position).timestamp);
Glide.with(context).load(movies.get(position).url.medium)
.thumbnail(0.5f)
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(holder.thumbnail);
}
@Override
public int getItemCount() {
return movies.size();
}
}
Bu yazının diğer konusu olan Glide
kütüphanesinin kullanımı ise burada karşımıza çıkıyor. Aşağıdaki şekilde Glide
kütüphanesini kullanarak thumbnail resimlerini hızlı bir şekilde çekip,
imageview'a eklemek mümkündür.
Glide.with(context).load(movies.get(position).url.medium)
.thumbnail(0.5f)
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(holder.thumbnail);
MainActivity.java da ise basit bir Retrofit
sorgusu yapıyoruz. Dönen veriyi ise recyclerview da gösteriyoruz. Aşağıda da
görüldüğü üzere hiçbir şekilde parse işlemi vs ile uğraşmamıza gerek kalmıyor.
Benim burda tek yaptığım dönen JsonArray'i listeye çevirmem bu kısım biraz
performans kaybına sebep olabilir. İsterseniz hiç listeye çevirmeden de düzgün
bir şekilde çalıştırabilirsiniz.
package
com.abdullahbalta.retrofitglideexample;
import
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import
com.abdullahbalta.retrofitglideexample.adapter.MovieAdapter;
import
com.abdullahbalta.retrofitglideexample.interfaces.RetroClient;
import
com.abdullahbalta.retrofitglideexample.interfaces.RetroInterface;
import
com.abdullahbalta.retrofitglideexample.model.Movie;
import
java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import retrofit2.Call;
import
retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity {
private static final String TAG =
MainActivity.class.getSimpleName();
private RecyclerView recyclerView;
private List<Movie> moviesData = new
ArrayList<>();
private MovieAdapter movieAdapter;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView =
(RecyclerView)findViewById(R.id.main_recycler);
recyclerView.setLayoutManager(new
LinearLayoutManager(this));
RetroInterface retroInterface =
RetroClient.getClient().create(RetroInterface.class);
Call<Movie[]> call =
retroInterface.getJsonValues();
call.enqueue(new Callback<Movie[]>()
{
@Override
public void onResponse(Call<Movie[]>
call, Response<Movie[]> response) {
moviesData =
Arrays.asList(response.body());
movieAdapter = new
MovieAdapter(moviesData, R.layout.movie_item, getApplicationContext());
recyclerView.setAdapter(movieAdapter);
}
@Override
public void onFailure(Call<Movie[]>
call, Throwable t) {
Log.e(TAG, "HATA: " + t.toString());
}
});
}
}
Evet, bir yazımın daha sonuna
geliyorum. Her zamanki gibi aşağıdan ekran görüntüsünü inceleyip. Bu yazıdaki
projenin tüm kaynak kodlarına yukarıda GitHub bağlantısından ulaşabilirsiniz.
Faydalı olması dileğiyle..
Daha fazla
yazı için tıklayın.
Türkiye
Share this post
Android: Firebase
Veritabanı Kullanımı
Android:
PercentLayout Kullanımı
Abdullah Balta © 2017Powered by Casperion Ghost
ThemeProudly published with Ghost