Retrofit 不显示任何数据
Retrofit does not show any data
我正在尝试 retrieve/fetch 使用改造和 Rxjava 从服务器获取数据以在回收器视图中显示数据。该代码未检测到任何错误,但仍未显示任何数据。请检查我的代码并帮助我在哪里弄错了。
这是我的 API
https://www.testing.albassamapp.com/api/familymembers/v2
这是我的数据class
代码:
data class Profile(
@SerializedName("id")
val id: Int,
@SerializedName("name")
val name: String,
@SerializedName("father_name")
val fatherName: String,
@SerializedName("profile_picture_square")
val profilePicture: String
)
这是我的界面:
interface ProfileApi {
@GET("familymembers/v2")
//single is observable it emit one variable and then close
fun getProfiles(): Single<List<Profile>>
}
这是我的服务class:
class ProfileService {
private val BASE_URL = "https://www.testing.albassamapp.com/api/"
private val api:ProfileApi
init {
api = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(ProfileApi::class.java)
}
fun getProfile(): Single<List<Profile>> {
return api.getProfiles()
}
}
这是我的 listViewModel:
class ListViewModel:ViewModel() {
private val profileService = ProfileService()
private val disposable = CompositeDisposable()
//for live data
val profiles = MutableLiveData<List<Profile>>()
val profileLoadingError = MutableLiveData<Boolean>()
val loading = MutableLiveData<Boolean>()
fun refresh() {
fetchProfiles()
}
private fun fetchProfiles() {
loading.value = true
disposable.add(
profileService.getProfile()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableSingleObserver<List<Profile>>() {
override fun onSuccess(value: List<Profile>?) {
profiles.value = value
profileLoadingError.value = false
loading.value = false
}
override fun onError(e: Throwable?) {
profileLoadingError.value = true
loading.value = false
}
})
)
}
override fun onCleared() {
disposable.clear()
}
}
你犯了一个错误,基于对 api 的响应,serlizable 是错误的,api 响应是 json 对象包含你在 [=27] 中更改 return 的配置文件列表=] 界面
首先创建对象
这是你的数据class
data class Profile(
@SerializedName("id")
val id: Int,
@SerializedName("name")
val name: String,
@SerializedName("father_name")
val fatherName: String,
@SerializedName("profile_picture_square")
val profilePicture: String
)
在您的数据中添加新的 class class
data class Result(
@SerializedName("Status")
val status: Int,
@SerializedName("Message")
val message: String,
@SerializedName("Data")
val data: List<Profile>
)
你的界面改成这个样子
interface ProfileApi {
@GET("familymembers/v2")
//single is observable it emit one variable and then close
fun getProfiles(): Single<Result>
}
你的服务会是这样
class ProfileService {
private val BASE_URL = "https://www.testing.albassamapp.com/api/"
private val api:ProfileApi
init {
api = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(ProfileApi::class.java)
}
fun getProfile(): Single<Result> {
return api.getProfiles()
}
}
你的视图模型会像这样
class ListViewModel: ViewModel() {
private val profileService = ProfileService()
private val disposable = CompositeDisposable()
//for live data
val profiles = MutableLiveData<List<Profile>>()
val profileLoadingError = MutableLiveData<Boolean>()
val loading = MutableLiveData<Boolean>()
fun refresh() {
fetchProfiles()
}
private fun fetchProfiles() {
loading.value = true
disposable.add(
profileService.getProfile()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableSingleObserver<Result>() {
override fun onSuccess(result: Result) {
if(result.status==200){
profiles.value = result.data
profileLoadingError.value = false
}else{
// in case exception or message
profileLoadingError.value = true
}
loading.value = false
}
override fun onError(e: Throwable) {
profileLoadingError.value = true
loading.value = false
}
})
)
}
override fun onCleared() {
disposable.clear()
}
}
我把上面@yousef的回答改成了下面的,因为我因为某些原因无法编辑,而且英文有点不清楚
你犯了一个错误,根据 api 的响应模型是错误的,api 响应是 json 包含其他模型对象列表的对象说 Profile
你必须在 api 接口中更改返回的模型,例如
首先创建模型Result
data class Result(
@SerializedName("Status")
val status: Int,
@SerializedName("Data")
val data: List<Profile>
)
然后像这样Profile
class
data class Profile(
@SerializedName("id")
val id: Int
@SerializedName("parent_id")
val parentId: Int // and so on based on the fields you need
)
只需更改界面即可 api 像这样获取对象结果
fun getProfiles(): Single<Result>.
然后相应地这将更改其他代码,您可以使用默认提供的 getter 获取 Result
class 的 List<Profile>
属性 Kotlin
的数据class
此外,为了减少从 json 制作模型时的头痛,您可以使用 Json2Kotlin
等网站
我正在尝试 retrieve/fetch 使用改造和 Rxjava 从服务器获取数据以在回收器视图中显示数据。该代码未检测到任何错误,但仍未显示任何数据。请检查我的代码并帮助我在哪里弄错了。 这是我的 API https://www.testing.albassamapp.com/api/familymembers/v2
这是我的数据class 代码:
data class Profile(
@SerializedName("id")
val id: Int,
@SerializedName("name")
val name: String,
@SerializedName("father_name")
val fatherName: String,
@SerializedName("profile_picture_square")
val profilePicture: String
)
这是我的界面:
interface ProfileApi {
@GET("familymembers/v2")
//single is observable it emit one variable and then close
fun getProfiles(): Single<List<Profile>>
}
这是我的服务class:
class ProfileService {
private val BASE_URL = "https://www.testing.albassamapp.com/api/"
private val api:ProfileApi
init {
api = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(ProfileApi::class.java)
}
fun getProfile(): Single<List<Profile>> {
return api.getProfiles()
}
}
这是我的 listViewModel:
class ListViewModel:ViewModel() {
private val profileService = ProfileService()
private val disposable = CompositeDisposable()
//for live data
val profiles = MutableLiveData<List<Profile>>()
val profileLoadingError = MutableLiveData<Boolean>()
val loading = MutableLiveData<Boolean>()
fun refresh() {
fetchProfiles()
}
private fun fetchProfiles() {
loading.value = true
disposable.add(
profileService.getProfile()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableSingleObserver<List<Profile>>() {
override fun onSuccess(value: List<Profile>?) {
profiles.value = value
profileLoadingError.value = false
loading.value = false
}
override fun onError(e: Throwable?) {
profileLoadingError.value = true
loading.value = false
}
})
)
}
override fun onCleared() {
disposable.clear()
}
}
你犯了一个错误,基于对 api 的响应,serlizable 是错误的,api 响应是 json 对象包含你在 [=27] 中更改 return 的配置文件列表=] 界面 首先创建对象
这是你的数据class
data class Profile(
@SerializedName("id")
val id: Int,
@SerializedName("name")
val name: String,
@SerializedName("father_name")
val fatherName: String,
@SerializedName("profile_picture_square")
val profilePicture: String
)
在您的数据中添加新的 class class
data class Result(
@SerializedName("Status")
val status: Int,
@SerializedName("Message")
val message: String,
@SerializedName("Data")
val data: List<Profile>
)
你的界面改成这个样子
interface ProfileApi {
@GET("familymembers/v2")
//single is observable it emit one variable and then close
fun getProfiles(): Single<Result>
}
你的服务会是这样
class ProfileService {
private val BASE_URL = "https://www.testing.albassamapp.com/api/"
private val api:ProfileApi
init {
api = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(ProfileApi::class.java)
}
fun getProfile(): Single<Result> {
return api.getProfiles()
}
}
你的视图模型会像这样
class ListViewModel: ViewModel() {
private val profileService = ProfileService()
private val disposable = CompositeDisposable()
//for live data
val profiles = MutableLiveData<List<Profile>>()
val profileLoadingError = MutableLiveData<Boolean>()
val loading = MutableLiveData<Boolean>()
fun refresh() {
fetchProfiles()
}
private fun fetchProfiles() {
loading.value = true
disposable.add(
profileService.getProfile()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableSingleObserver<Result>() {
override fun onSuccess(result: Result) {
if(result.status==200){
profiles.value = result.data
profileLoadingError.value = false
}else{
// in case exception or message
profileLoadingError.value = true
}
loading.value = false
}
override fun onError(e: Throwable) {
profileLoadingError.value = true
loading.value = false
}
})
)
}
override fun onCleared() {
disposable.clear()
}
}
我把上面@yousef的回答改成了下面的,因为我因为某些原因无法编辑,而且英文有点不清楚
你犯了一个错误,根据 api 的响应模型是错误的,api 响应是 json 包含其他模型对象列表的对象说 Profile
你必须在 api 接口中更改返回的模型,例如
首先创建模型Result
data class Result(
@SerializedName("Status")
val status: Int,
@SerializedName("Data")
val data: List<Profile>
)
然后像这样Profile
class
data class Profile(
@SerializedName("id")
val id: Int
@SerializedName("parent_id")
val parentId: Int // and so on based on the fields you need
)
只需更改界面即可 api 像这样获取对象结果
fun getProfiles(): Single<Result>.
然后相应地这将更改其他代码,您可以使用默认提供的 getter 获取 Result
class 的 List<Profile>
属性 Kotlin
此外,为了减少从 json 制作模型时的头痛,您可以使用 Json2Kotlin
等网站