Kotlin Flow로 개조

12142 단어 androidkotlin
저는 Amit Shekhar , 개발자들이 고임금 기술직을 구하도록 돕는 멘토입니다.

이번 블로그에서는 Android에서 KotlinRetrofit과 함께 Flow를 사용하는 방법에 대해 알아보겠습니다. 기본 MVVM 아키텍처를 따르는 KotlinViewModel을 사용하여 Flow 내부에 코드를 작성하는 방법을 배웁니다.

이 문서는 원래 amitshekhar.me에 게시되었습니다.

구현 부분에 다음 프로젝트를 사용할 것입니다. 이 프로젝트는 단순성을 위해 기본 MVVM 아키텍처를 따릅니다. 프로젝트 자체에서 이 블로그에 언급된 구현을 위한 전체 코드를 찾을 수 있습니다.

GitHub 프로젝트: Learn Kotlin Flow

먼저 Retrofit에 대한 종속성을 아래와 같이 설정해야 합니다.

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'


참고: 항상 사용 가능한 최신 버전을 확인하십시오.

Gson을 사용하여 JSON을 Java 및 Kotlin 클래스로 구문 분석하므로 Gson에 대한 종속성을 추가했습니다. 요구 사항에 따라 추가할 수 있습니다.

이제 아래와 같이 data 클래스ApiUser를 만듭니다.

data class ApiUser(
    @SerializedName("id")
    val id: Int = 0,
    @SerializedName("name")
    val name: String = "",
    @SerializedName("email")
    val email: String = "",
    @SerializedName("avatar")
    val avatar: String = ""
)


이제 Retrofit에 필요한 ApiService 인터페이스를 생성해야 합니다.

interface ApiService {

    @GET("users")
    suspend fun getUsers(): List<ApiUser>

    @GET("more-users")
    suspend fun getMoreUsers(): List<ApiUser>

    @GET("error")
    suspend fun getUsersWithError(): List<ApiUser>

}


참고: suspend 키워드를 사용했습니다.

그 후에 RetrofitBuilder 가 될 Singleton 클래스가 필요합니다.

object RetrofitBuilder {

    private const val BASE_URL = "https://5e510330f2c0d300147c034c.mockapi.io/"

    private fun getRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    val apiService: ApiService = getRetrofit().create(ApiService::class.java)

}


그런 다음 인터페이스ApiHelper를 생성합니다.

interface ApiHelper {

    fun getUsers(): Flow<List<ApiUser>>

    fun getMoreUsers(): Flow<List<ApiUser>>

    fun getUsersWithError(): Flow<List<ApiUser>>

}


참고: 반환 유형은 Flow 입니다.

그런 다음 ApiHelperImpl 인터페이스를 구현하는 클래스ApiHelper를 만듭니다.

class ApiHelperImpl(private val apiService: ApiService) : ApiHelper {

    override fun getUsers() = flow {
        emit(apiService.getUsers())
    }

    override fun getMoreUsers() = flow {
        emit(apiService.getMoreUsers())
    }

    override fun getUsersWithError() = flow {
        emit(apiService.getUsersWithError())
    }

}


여기서 반환 유형이 Flow 임을 이해해야 합니다. 또한 흐름 빌더를 사용하고 요구 사항에 따라 항목을 내보냅니다.

이렇게 하면 아래와 같이 ApiHelper의 인스턴스를 만들 수 있습니다.

val apiHelper = ApiHelperImpl(RetrofitBuilder.apiService)


마지막으로, 예를 들어 ViewModel 와 같이 필요할 때마다 이 인스턴스를 전달할 수 있고 아래와 같이 네트워크에서 users 를 가져오기 위해 네트워크 호출을 수행할 수 있습니다.

class SingleNetworkCallViewModel(private val apiHelper: ApiHelper, private val dbHelper: DatabaseHelper) : ViewModel() {

    init {
        fetchUsers()
    }

    private fun fetchUsers() {
        viewModelScope.launch {
            apiHelper.getUsers()
                .flowOn(Dispatchers.IO)
                .catch { e ->
                    // handle exception
                }
                .collect {
                    // list of users from the network
                }
        }
    }

}


이렇게 하면 Android에서 Retrofit with KotlinFlow을 사용하여 네트워크에서 데이터를 가져올 수 있습니다.

이 블로그에서 위에서 언급한 GitHub 리포지토리에서 훨씬 더 많은 것을 배울 수 있음을 언급해야 합니다. 다음을 배울 수 있습니다.
  • Retrofit with Kotlin Flow를 사용하여 일련의 네트워크 호출을 만듭니다.
  • Retrofit with Kotlin Flow를 사용하여 여러 네트워크 호출을 병렬로 수행합니다.

  • Android에서 KotlinFlow과 함께 Retrofit을 사용하는 방법입니다.

    지금은 그게 다입니다.

    감사

    Amit Shekhar

    다음에서 나와 연결할 수 있습니다.


  • GitHub
  • Facebook

  • Read all of my high-quality blogs here.

    좋은 웹페이지 즐겨찾기