首页 > 解决方案 > 有什么方法可以让 retrofit2 返回 LiveData

问题描述

有什么方法可以让 retrofit2 返回 livedata 而不是 Observable ?

如果有可能我们如何实施这种方法?

如果不可能,是否建议让改造返回 Observable 然后将其转换为 livedata?

标签: android-architecture-componentsandroid-livedataandroid-jetpack

解决方案


您必须添加 addCallAdapterFactory(LiveDataCallAdapterFactory())改造适配器。

我已经使用 Dagger-2 实现了:-

@Module(includes = [ViewModelModule::class])
        class AppModule {
        @Singleton
        @Provides
        fun provideGithubService(): GithubService {
            return Retrofit.Builder()
                .baseUrl("YOUR URL")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(LiveDataCallAdapterFactory())
                .build()
                .create(GithubService::class.java)
        }
      }

创建一个类似 GithubService 的接口类:-

interface GithubService {
    @GET("users/{login}")
    fun getUser(@Path("login") login: String): LiveData<ApiResponse<User>>
}

注入 GithubService 类,然后你可以得到:-

githubService.getUser(login)

LiveDataCallAdapterFactory 会是这样的

import androidx.lifecycle.LiveData
import com.android.example.github.api.ApiResponse
import retrofit2.CallAdapter
import retrofit2.CallAdapter.Factory
import retrofit2.Retrofit
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type

class LiveDataCallAdapterFactory : Factory() {
    override fun get(
            returnType: Type,
            annotations: Array<Annotation>,
            retrofit: Retrofit
    ): CallAdapter<*, *>? {
        if (Factory.getRawType(returnType) != LiveData::class.java) {
            return null
        }
        val observableType = Factory.getParameterUpperBound(0, returnType as ParameterizedType)
        val rawObservableType = Factory.getRawType(observableType)
        if (rawObservableType != ApiResponse::class.java) {
            throw IllegalArgumentException("type must be a resource")
        }
        if (observableType !is ParameterizedType) {
            throw IllegalArgumentException("resource must be parameterized")
        }
        val bodyType = Factory.getParameterUpperBound(0, observableType)
        return LiveDataCallAdapter<Any>(bodyType)
    }
}

作为参考,您可以查看此链接https://github.com/googlesamples/android-architecture-components/tree/master/GithubBrowserSample


推荐阅读