Retrofit搭配RxJava请求数据无报错但RecyclerView不显示问题求助
问题排查与修复方案
核心问题:接口返回结构与接收类型不匹配
你提供的接口返回数据外层存在公共响应包装,并非直接返回Profile数组,你当前代码直接解析为List<Profile>会触发Gson解析异常,直接走onError回调,因此没有数据返回。
修复步骤
- 新增外层公共响应包装类
data class BaseResponse<T>( @SerializedName("status") val status: Boolean, @SerializedName("message") val message: String, @SerializedName("data") val data: T )
- 修改请求接口定义
interface ProfileApi { @GET("familymembers/v2") fun getProfiles(): Single<BaseResponse<List<Profile>>> }
- 修改服务类返回值
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<BaseResponse<List<Profile>>> { return api.getProfiles() } }
- 调整ViewModel订阅逻辑
private fun fetchProfiles() { loading.value = true disposable.add( profileService.getProfile() .subscribeOn(Schedulers.io()) // 推荐用io线程而非newThread,复用线程池性能更好 .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(object : DisposableSingleObserver<BaseResponse<List<Profile>>>() { override fun onSuccess(value: BaseResponse<List<Profile>>?) { value?.takeIf { it.status }?.let { resp -> profiles.value = resp.data profileLoadingError.value = false } ?: run { profileLoadingError.value = true } loading.value = false } override fun onError(e: Throwable?) { // 建议新增日志打印,方便后续排查问题 // Log.e("LoadError", e?.localizedMessage ?: "Unknown error", e) profileLoadingError.value = true loading.value = false } }) ) }
其他可能问题排查
- 检查
AndroidManifest.xml是否已添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 检查Activity/Fragment中是否已观察
profilesLiveData,收到数据后必须调用RecyclerView Adapter的更新方法(如notifyDataSetChanged()或者列表更新方法)刷新UI - 检查RecyclerView的LayoutManager、Adapter是否已正确绑定,Item布局参数是否正常
内容的提问来源于stack exchange,提问作者Ehtada Jodat
相关产品推荐
相关产品推荐

