Android Retrofit Kullanımı

Java Kotlin Eğitimi

Merhaba arkadaşlar, Bugün dersimizde sizlere Square şirketi tarafından geliştirilen Retrofit kütüphanesinin kullanımı hakkında bilgi vereceğim. Retrofit açık kaynak kodlu REST İstemcisidir. Bu kütüphane biz geliştiricilerin işini gerçekten kolaylaştırıyor.

Sunucudan veri çekmek için kullandığımız diğer yöntemlere bakacak olursak:

AsyncTask yapısı ile yaptığımız isteklerde aşırı bir yavaş çalışma problemi ortaya çıkmıştı. Ayrıca çoklu asynchronous işlemlerinde , ön plandaki kontroller komplike bir hale dönüşmüştü.

Daha sonra ortaya Volley kütüphanesi çıktı o da bir network kütüphanesi olup , network bağlantılarını çok daha hızlı bir şekilde yapabilmemizi sağladığı gibi , bizi bir sürü kod yazmaktan kurtarmıştır. Ayrıca, Volley gösterilen URL adresine bağlanıp , orada sağlanan verileri bize sunuyor. Default olarak da Volley, sunucudan veri çekme gibi işlemleri asenkron olarak gerçekleştirebiliyor. Bunlardan dolayı da , AsyncTask yapısını kullanma gibi bir zorunluluk ortadan kalmış oluyordu.

Veri çekme ve network işlemleri , Retrofit kütüphanesi ile farklı bir boyut kazanmıştır.

Retrofit de ana kısmın url sini bütün API çağrıları için set edebilir , daha sonra static interfaceleri Java’nın annotation larını kullanarak oluşturabiliriz.

Sunucudan istek yapabilmek için , interface methodunu çağırmak yeterlidir ve sonucunda bize dönüş objesi dönmektedir.

AsyncTask, Volley ve Retrofit arasında genel bir karşılaştırma yapacak olursak da;

Volley ve Retrofit’in kullanımı AsyncTask dan daha kolaydır. 

Volley ve Retrofit hız olarak AsyncTask a göre daha performanslıdır. 

Retrofit ile JSON Parsing işlemleri otomatik olarak GSON ile gerçekleşmektedir.

Performans ile ilgili karşılaştırma verileri aşağıda yer almaktadır. Aşağıdaki verilere baktığımızda Retrofit ile istek yapıldığı zaman ; AsyncTask ve Volley e göre daha kısa bir sürede işlemin gerçekleştirildiğini göreceksiniz bu yüzden aralarında en hızlısı ve performanslısı Retrofit kütüphanesidir.

retrofit_performance

Retrofit kütüphanesinde kullandığımız Callback Interface yapısı ile otomatik olarak hataları ve cachelemeyi kontrol edebiliyoruz.

Şimdi gelelim bu dersimizin kodlamasına. Öncelikle retrofit kütüphanesini uygulamamızda kullanabilmemiz için build.gradle kısmına bunu ekliyoruz.

sunucuya giden istekleri ya GET ile yada POST ile göndeririz bunu kontrol edebilmek içinde yine build.gradle kısmına aşağıdaki kodu ekliyoruz.

Şimdi nasıl bir json verisi çekeceğimize bakalım :

Verileri bu adresten çekiyoruz. Tıkladığınız zaman aşağıdaki yapıyı göreceksiniz.

Şimdi ise yapmamız gereken bu linke tıklayarak karşımıza gelen ekrana json formatımızı yapıştırıyoruz. Yapıştırdıktan sonra belirli ayarları yapıyoruz aşağıdaki ekran görüntüsündeki gibi işaretli olan kısımlar seçili olmalıdır.

Source Type: JSON   Annotation style: Gson

Screen Shot 2015-11-18 at 01.30.44

 

 

 

 

 

Ayarları yaptıktan sonra Preview tuşuna basıyoruz ve bize uygulamamızda kullanacağımız pojo model yapısını otomatik olarak oluşturmuş oluyoruz. buda aşağıdaki gibi olacaktır.

pojo

 

 

 

 

 

 

Yukarıda oluşturduğumuz yapıyı uygulamamıza ekleyelim.

RetrofitModel.java

Retrofit için kullanacağımız interface yapısıda aşağıdaki gibidir. Burada POST ile mi GET ile mi istek yapacağımıza annotation ları kullanarak karar veriyoruz. Bu derste GET ile istek yapacağım için o şekilde yapıyı oluşturdum. /servejson yazmamın nedeni ise base url den ( https://mobilhanem.com/test/retrofitJson.php ) sonra gelen parametreleri o şekilde ekleyerek sunucuya istekde bulunabiliyoruz.

RetrofitModel[ ] adını verdiğimiz bu yapı json array i döneceği için [ ] kullandık eğer dönen cevabımız json arrayı olarak dönmeyecekse aşağıdaki yapıda RetrofitModel yazmamız yeterli olacaktı.

RestInterfaceController.java ( Interface )

MainActivity sınıfımız da aşağıdaki gibi olacaktır. Aşağıdaki yapıda Retrofit ile istekde bulunuyoruz oluşturulan Model den dönen cevaplarıda ListView de gösteriyoruz. Ayrıca ListView de hangi item e tıklandıysa yeni bir Activity e sunucudan gelen resmin adını gönderiyoruz ve o sayfada resmi gösteriyoruz. ListView i doldurmak için oluşturduğumuz Adapter sınıfını tekrar tekrar anlatmayacağım. Tek fark Adapter sınıfında Picasso kütüphanesi ile sunucudan dönen resimleri ListView de göstermek. Sizlere tavsiyem kaynak kodlarını indirip çalıştırmanızdır.

MainActivity.java

Items.java

Yukarıda bahsetmiş olduğum Listview için yarattığımız Adapter sınıfıda aşağıdadır.

CustomAdapter.java

Evet arkadaşlar işte bu kadar kolay ve hızlı bir şekilde sunucudan gelen verileri çekmiş olduk. Dediğim gibi kaynak kodlarını indirirseniz önemli yerlerine yorum olarak açıklamalarda ekledim ,bu kütüphanenin çalışma mantığını daha iyi anlayacaksınız. Json Parsing işlemini de otomatik olarak kendi içinde halletmeside bu kütüphanenin önemli özelliklerinden biridir.  Umarım faydalı bir ders olmuştur , Retrofit kütüphanesi ile ilgili izlenimlerinizi söylerseniz hem kullanımı açısından hem de bilgi birikimi açısından önemli olacaktır.

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

Ders hakkında soru ve önerilerinizi çekinmeden yorum bırakabilirsiniz. Bol Android’li günler sizin olsun 🙂

Sizlerden ricamız facebook.com/mobilhanem sayfamızı beğenmenizdir. Diğer dersimde görüşmek üzere kendinize iyi bakın..

Alper Beyler

Yüksek Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği
Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği (4/3.30) (2010-2014)
Lisans : Viyana Teknik Üniversitesi / Bilgisayar Bilimleri (2013)

53 Yorum

  • Başarılı bir paylaşım olmuş elinize sağlık.. Retrofit de Post işlemi ile ilgili de bilgi verirseniz sevinirim

    • saolun düşünceleriniz için.. get ve post işlemlerini yukarıda belirttiğim gibi interface yapısında oluşturmanız gerekmektedir.

  • Kaynak kodları indirdim ama MainActivity class içerisnde import fertrofit kütüphaneleri hata veriyor kodu çalıştıramadım.Çözümü nedir acaba

  • Konuyla pek alakası yok ama bir sorum olucaktı.Android ile Google Chrome tarayıcısında bir Web Sayfasını(Face Twitter ve kötü amaçlı sayfaları) nasıl filtreleyebilrim .Öneriniz varsa çok sevinirim

  • Konuyla pek alakası yok ama bir sorum olucaktı. Aile Güvenliği ile ilgili proje aldım. Android Tarayıcıda Web Geçmişini Listeleyip Veritabanıma atabiliyorum.Bu Web geçmişinden Seçtiğim uygulamaları Filtrelemek istiyorum.Android ile Google Chrome tarayıcısında bir Web Sayfasını(Face Twitter ve kötü amaçlı sayfaları) nasıl filtreleyebilrim .Öneriniz varsa çok sevinirim

  • Merhaba hocam, sitenizi severek takip ediyorum bazı derslerde de video konulduğunu gördüm bundan sonra olacak derslerde video anlatımlı yapma şansınız var mı?

    • malesef o şekilde ilerleme şansımız şuanlık yok.. ancak siteye konulan kaynak kodları çalıştırıp video üzerinden gösterebiliyoruz.

    • tam olarak anlamadım sorunuzu , array için ayrı bir yapı oluşturursunuz jsoupda normal veri için ayrı jsoup element lerini kullanarak

      • evet yazdığım biraz havada kaldı galiba, şöyle bi örnek verecek olursam;

        {
        “firsatlar_liste”:[
        {
        “firsatId”:”212″,
        “firsatYazi”:”fsdfsdfsdf”,
        “firsatArti”:”0″,
        “firsatZaman”:”2 hafta”
        },
        {
        “firsatId”:”211″,
        “firsatYazi”:”fsdfsdfsdf”,
        “firsatArti”:”0″,
        “firsatZaman”:”2 hafta”
        }
        ],
        “firsatSayi”:40,
        “uyeSehir”:”İstanbul”
        }

        Bu tarz bi json sonucunu nasıl alabilirim, yani neticede array olmayan firsatSayı ve uyeSehir değişkenlerim de bulunmakta..

        • Merhaba, jsoup ile alakalı değil fakat bu sorduğunuz soru json parsing işlemi yapacaksınız objenin içinde bir array var zaten gördüğünüz gibi onun içindeki verilere ulaşabilirsiniz kolayca.. ( doInBackground methodu içinde yapılacak işlemler ile ) diğer belirttiğiniz veriler ise zaten json objesinin elemanları

          json çıktısını buraya yapıştırıp görebilirsin ne demek istediğimi ( http://www.jsoneditoronline.org )

          yourJsonObject.getString(“firsatSayi”); // firsatSayi verisine ulaşma
          yourJsonObject.getString(“uyeSehir”); // uyeSehir verisine ulaşma

          • Aynen hocam benim json dosyam [ ile başlamıyor şöyle başlıyor
            { bu yüzden begin array hatası veriyor. Benim Dosya şu şekilde

            {
            “status”: “ok”,
            “count”: 1,
            “count_total”: 28,
            “pages”: 28,
            “posts”: [
            {
            “id”: 502,
            “type”: “post”,
            “slug”: “android-navigation-drawer-kullanimi”,
            “url”: “http://www.bilgidostu.com/android-navigation-drawer-kullanimi/”,
            “status”: “publish”,
            “title”: “Android Navigation Drawer Kullanu0131mu0131”,
            “title_plain”: “Android Navigation Drawer Kullanu0131mu0131”,
            “content:”deneme”,
            “date”: “2016-01-18 04:00:48”,
            “modified”: “2016-06-13 14:39:46”,
            “categories”: [
            {
            “id”: 34,
            “slug”: “android”,
            “title”: “Android”,
            “description”: “”,
            “parent”: 0,
            “post_count”: 7
            },
            {
            “id”: 36,
            “slug”: “java”,
            “title”: “Java”,
            “description”: “”,
            “parent”: 10,
            “post_count”: 3
            }
            ],
            “thumbnail_images”: {
            “full”: {
            “url”: “http://www.bilgidostu.com/wp-content/uploads/navigation_drawer.jpg”,
            “width”: 720,
            “height”: 378
            }
            ]
            }

  • Merhaba, parametre olarak istek yollamak istiyorum. getData.aspx?id=5 şeklinde gibi.
    Controller kısmındaki Get kısmına bir şey yazmak istemiyorum. Fakat hata alıyorum.

    Bu şekilde istek nasıl yollayabilirim. Teşekkürler

    • merhabalar , ne şekilde bir hata alıyorsunuz tam olarak ? bir de parametre olarak istek yollamak için bu şekilde bir yapı oluşturup denermisiniz
      @GET(“/my/API/call”)
      Response getMyThing(
      @Query(“param1”) String param1,
      @Query(“param2”) String param2);

  • hocam, öncelikle güncel olarak dersler yayınladığınız için mobilhanem ailesine teşekkür ederim. bu dersinizde gerçekten faydalı oldu volley kütüphanesine göre daha avantajlı olması da şaşırtıcı. tekrardan iyi çalışmalar derslerinizin devamını bekliyorum 🙂

  • Unfor…. Hatası

    restAdapter = new RestAdapter.Builder() Satırında Hata Gösteriyor

    at com.example.newsfeed.MainActivity.onCreate(MainActivity.java:42)

    • Merhaba uygulama içindemi bu sorunu yaşıyorsunuz ? yoksa retrofit de çektiğiniz veridemi eğer veri ile alakalı ise json formatını tekrardan kontrol etmelisiniz.

  • Teşekkürler hocam gridview de resim üzerine tıkladığımızda farklı bir activity de resim açılıyor. Açıldıktan sonra geri tuşuna bastığımızsa mainactivicty kaldığı yerden devam ediyor. Bunu nasıl yapabiliriz ? ben verileri volley ile çekip json ile parse ediyorum.

    • Resmi tıkladığında yeni activity başladıkdan sonra eski activityi sonlandıra bilirsin. Activitden geri dönerken mainactivity yeniden başlatırsan olur

  • Hocam çok teşekkür ediyorum benim şöyle bir sorum var mesela 100 tane kayıt var diyelim bu yöntem ile yaptığımda 100 tane kayıt uygulama açıldığında getirilecek. Ben uygulama açılınca 10 tane kaydın getirilmesini istiyorum scroll aşağı inince getirdiğim ilk 10 kaydın devamını getirmesini istiyorum. Yani facebook uygulaması gibi scroll aşağı inince yeni verilerin yüklenmesi gibi bunu nasıl yapabilirim ? sitenizde böyle bir yazı bulamadım.

  • “/servejson ” adresine ulaşılamıyor.Geliştirmiş olduğunuz retrofitJson.php dosyasını paylaşır mısınız?

  • Merhaba hocam.Hocam retrofit le Jsoup parsing yapabilirmiyiz?Örnek bir link verirseniz sevinirim.teşekkürler

  • Hocam programı çalıştırdım gayet guzel çalısıyor ama Post kullandıgım zaman veri alamıyorum php ve programda post olarak ayarlıyorum veri gelmiyor ama get olarak yaptıgımda sıkıntı yok post işlemini nasıl yapabilirim

    • Merhaba, servis tarafı ile alakalı bir durum var siz post isteği yapıyorsanız servis tarafında yazılan kod da post isteğini alabilmesi lazım o yüzden server side tarafını gözden geçirmen gerekiyor.

  • Retrofiti hic bu kadar aciklayici anlatan bir yazi bulamamistim.Gercekten cok faydali oldu emeginize saglik Alper Hocam.

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?