android-architecture-components - 有什么方法可以让 retrofit2 返回 LiveData
问题描述
有什么方法可以让 retrofit2 返回 livedata 而不是 Observable ?
如果有可能我们如何实施这种方法?
如果不可能,是否建议让改造返回 Observable 然后将其转换为 livedata?
解决方案
您必须添加
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
推荐阅读
- python - python OWASP的依赖检查
- c++ - 2 玩家井字游戏,玩家 1 赢了.. 但奇怪的是,玩家 2 没有
- flutter - 将字段文本缩小到比提示文本更小的宽度
- swift - 使用新的可点击区域和框架创建自定义形状(非矩形)按钮和按钮集
- laravel - Laravel 事件/监听器测试间歇性失败
- c# - 模 C# 没有产生预期值
- c# - 反序列化嵌套 JSON,映射到模型并保存
- java - java 'Robot' 类内存泄漏
- trace - 如何在 PostSharp 中拦截对 ICommand.Execute 的调用?
- r - 使用 R,如何跟踪基于 library::method 的函数?