본문 바로가기

Android

[Android] RxJava2 + Retrofit2

android_rxjava_retrofit

 

RxJava와 가장 많은 조합으로 사용된다고 알고 있는 Retrofit 사용법을 정리해보고자 합니다.

 

RxJava 스타일대로 Retrofit을 사용할 수 있게 해주는 adapter 라이브러리가 RxJava3 버전으로 아직 나오지 않아서

이번 글은 RxJava2 + Retrofit의 조합으로 Android에서 REST API 통신을 하는 방법에 대해 작성하였습니다.

 

RxJava3 정리는 아래 링크에서 확인 가능합니다 :)

-> https://dev-eunji.tistory.com/19

 

역시 가장 빠르게 배우고, 써먹을 수 있는 방법은 직접 해보는 것이기 때문에

Fake REST API 사이트, https://jsonplaceholder.typicode.com 의 json 데이터의 도움을 받아서 테스트 코드를 구현했습니다.

토이프로젝트에서 간편하게 JSON 데이터 활용이 가능하기때문에,  활용해보시기를 추천드립니다.

 

 

STEP1. 종속성 추가

implementation 'com.squareup.retrofit2:retrofit:2.7.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.7.1'
implementation 'com.squareup.retrofit2:converter-gson:2.7.1'

 

STEP2. Model 생성 (DTO)

https://jsonplaceholder.typicode.com/todos 를 url 에 입력해보면, 아래와 같은 데이터가 반환됨을 확인할 수 있다.

[
// 동일한 구조의 200개의 뭉치
  {
    "userId": 1,
    "id": 1,
    "title": "delectus aut autem",
    "completed": false
  },
 ]

 

따라서, 아래와 같이 Model 클래스를 작성할 수 있다.

import com.google.gson.annotations.SerializedName

class Task(
    @SerializedName("userId")
    val userId: Long,

    @SerializedName("id")
    val id: String,

    @SerializedName("title")
    val title: String,

    @SerializedName("completed")
    val completed: Boolean
)

 

STEP3. Retrofit 구현

 

1. Api Manager

import com.google.gson.GsonBuilder
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory


object ApiManager {
    private val BASE_URL = "https://jsonplaceholder.typicode.com/"

    private val gson =
        GsonBuilder()
            .setLenient()
            .create()

    private val retrofit by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(
                OkHttpClient.Builder()
                    .build()
            )
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()
    }

    val todoApi: TodoApi by lazy {
        retrofit.create(TodoApi::class.java)
    }
}

 

2. API 인터페이스 정의

import com.example.rx3retrofit.entity.Task
import io.reactivex.Single
import retrofit2.http.GET
import retrofit2.http.Path

interface TodoApi {
    @GET("todos")
    fun getTodos(): Single<List<Task>> 

	
    @GET("todos/{id}")
    fun getTodo(
        @Path("id") id: Long
    ): Single<Task>		
}

 

3. repository 레벨 구현

import com.example.rx3retrofit.entity.Task
import io.reactivex.Single
import io.reactivex.schedulers.Schedulers

class TodoRepository {
    private val api = ApiManager.todoApi

    fun getTaskList(): Single<List<Task>> =
        api.getTodos()
            .subscribeOn(Schedulers.io())

    fun getTask(id: Long): Single<Task> =
        api.getTodo(id)
            .subscribeOn(Schedulers.io())
}

 

 

STEP4. 로직 구현

 

1. ViewModel 정의

class TodoReposViewModel {
    private val repository = TodoRepository()

    fun getTaskListsObservable() =
        repository.getTaskList().toObservable()

    fun getTaskObservable(id: Long) =
        repository.getTask(id).toObservable()
}

 

2. 화면 구현

fab.setOnClickListener { view ->
	TodoReposViewModel().getTaskObservable(100).subscribe {
    	Snackbar.make(view, it.title, Snackbar.LENGTH_LONG).show()
    }
}

 

 

 

참고

https://github.com/ReactiveX/RxJava

'Android' 카테고리의 다른 글

[Android] BottomSheet  (0) 2020.02.01