<div><font color="White"><div align="center"><b><font face="Tahoma">Merhaba Sayın THT üyeleri, bu gün Retrofit ve RxJava kullanarak internetten nasıl veri çekebiliriz onu göreceğiz. Bunu yaparken MVVM yapısını kullanmayı ihmal etmeyeceğiz.



Diyelim ki bir API?mız var ve bizim bu API?daki verileri almamız gerekiyor. Bu örnek için https://ctftime.org/api/v1/events/?l...ish=1611011426 'yi kullanacağız.

Şimdi Android Studio?da yeni bir proje oluşturalım.





MVVM yapısını kullanmak ve en iyi şekilde yararlanmak için bir tane fragment oluşturalım





Daha sonra oluşturduğumuz Fragmentı MainActivity?e ekliyoruz. Şimdi verileri çekerken kullanacağımız Retrofit ve RxJava?yı import edelim. build.gradle dosyamız bu şekilde olmalı.


Kod:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
compileSdkVersion 29
buildToolsVersion "30.0.2"

defaultConfig {
applicationId "com.ego1st.apideneme"
minSdkVersion 23
targetSdkVersion 29
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
jvmTarget = "1.8"
}
}

def retrofitVersion = '2.9.0'
def rxJavaVersion = '2.1.1'

dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.1'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.2'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

implementation "com.squareup.retrofit2:retrofit:$retrofitVers ion"
implementation "com.squareup.retrofit2:converter-gson:$retrofitVersion"
implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion"

implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion"
implementation "io.reactivex.rxjava2:rxandroid:$rxJavaVersion "
}


Şimdi kodlarımızı yazmaya başlayabiliriz, ilk olarak Modelimizi yazalım. CTFModel adlı bir sınıf oluşturalım ve bu sınıfı aşağıda da görüldüğü gibi bir data class'a çevirelim.


Kod:
package com.ego1st.apideneme

data class CTFModel (
val url: String?,

val hours: String?,
val days: String?,

val start: String?,
val finish: String?,

val title: String?,
val description: String?,
val name: String?
)


Gördüğünüz gibi API'de bizle paylaşılan propertylerin isimlerini aynen girerek onları belirtiyoruz.

Şimdi API bağlantısı için bir Interface oluşturalım, ismine CTFApi diyorum.



Kod:
package com.ego1st.apideneme

import io.reactivex.Single
import retrofit2.http.GET

interface CTFApi {

//https://ctftime.org/api/v1/events/?limit=50&start=1600470626&finish=1611011426

@Get("events/?limit=50&start=1600470626&finish=1611011426")
fun getCtfEvents(): Single
}
Gördüğünüz gibi API urlmizin BASE dediğimiz baş kısmını yazmadık, şimdi oluşturacağımız CTFService'de de orayı halledeceğiz. CTFService isimli bir sınıf oluşturalım



Kod:
package com.ego1st.apideneme

import io.reactivex.Single
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactor y
import retrofit2.converter.gson.GsonConverterFactory

class CTFService {

private val BASE_URL = "https://ctftime.org/api/v1/"

private val api = Retrofit.Builder()

.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create() )
.addCallAdapterFactory(RxJava2CallAdapterFactory.c reate())
.build()
.create(CTFApi::class.java)

fun getCtfEventData() : Single {
return api.getCtfEvents()
}
}
Gördüğünüz gibi burda Retrofit Builder ile CallAdapter ve Converterımızı belirtiyoruz.



Şimdi RecyclerView ile verilerimizin sıralı bir şekilde gelmesini sağlayalım. Recycleri View'ı oluşturalım;



Daha sonra alacağımız veriler için şu layoutu kullanalım;


<div style="margin:20px; margin-top:5px"> Kod: