You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit LiveDataCallAdapter未调用adapt方法问题求助

问题诊断与解决方案

首先,你的核心问题是LiveData没有被观察,导致LiveDataCallAdapter的onActive方法从未触发,进而没有执行网络请求。LiveData的设计逻辑是:只有当它拥有活跃的观察者(比如在Activity/Fragment中调用observe())时,才会触发onActive回调。你的代码里只是获取了LiveData实例但没有对其进行观察,所以整个网络请求链条完全没有启动。

下面是具体的修复步骤:

1. 调整ViewModel,暴露可被UI层观察的LiveData

你当前的ViewModel只是在signIn方法里获取了LiveData,但没有把它暴露给上层UI。修改ViewModel,让它持有并对外提供请求结果的LiveData:

class AuthViewModel @Inject constructor(private val authApiRepo: AuthApiRepo) : ViewModel() {
    private val _authResult = MutableLiveData<Resource<AuthResponse>>()
    // 对外暴露不可变的LiveData,保证数据安全
    val authResult: LiveData<Resource<AuthResponse>> get() = _authResult

    fun signIn(login: String, password: String) {
        val authLiveData = authApiRepo.authLoginPass(login, password)
        // 转发仓库返回的LiveData结果到ViewModel的LiveData中
        _authResult.value = authLiveData.value
        // 或者使用MediatorLiveData来监听仓库LiveData的变化
        val mediator = MediatorLiveData<Resource<AuthResponse>>().apply {
            addSource(authLiveData) {
                value = it
            }
        }
        _authResult.postValue(mediator.value)
    }

    override fun onCleared() {
        super.onCleared()
    }
}

2. 在UI层(Activity/Fragment)添加LiveData观察者

只有当LiveData被观察时,onActive才会触发。你需要在Activity或Fragment中添加观察者,启动整个请求链条:

// 示例:在Activity的onCreate方法中
val viewModel = ViewModelProvider(this)[AuthViewModel::class.java]

// 观察登录结果
viewModel.authResult.observe(this) { resource ->
    when(resource.status) {
        Resource.Status.LOADING -> {
            // 显示加载状态,比如弹出ProgressDialog
        }
        Resource.Status.SUCCESS -> {
            // 处理成功响应,比如保存token、跳转页面
            resource.data?.let { authResponse ->
                // 处理authResponse中的token等数据
            }
            // 更新登录状态
            _isSigned.value = true
        }
        Resource.Status.ERROR -> {
            // 处理错误,比如显示Toast提示
            Toast.makeText(this, resource.message, Toast.LENGTH_SHORT).show()
            _isSigned.value = false
        }
    }
}

// 触发登录请求
viewModel.signIn("your_login", "your_password")

3. 确认Retrofit Service接口的返回值类型

检查你的BrizSmartTVService接口中,authLoginPass方法的返回值是否严格匹配LiveData<ApiResponse<AuthResponse>>,这是LiveDataCallAdapter能被Retrofit识别并调用的前提:

interface BrizSmartTVService {
    @POST("your_login_api_endpoint")
    fun authLoginPass(@Body body: AuthLogPassBody): LiveData<ApiResponse<AuthResponse>>
}

为什么之前的代码没有触发adapt方法?

因为LiveDataCallAdapter返回的LiveData没有任何活跃观察者,所以onActive永远不会被调用,自然不会执行call.enqueue。你在ViewModel中打印authRespons.value时,LiveData还处于未活跃状态,所以只能拿到你在NetworkBoundResource的init里设置的初始LOADING状态值,且数据为null。


内容的提问来源于stack exchange,提问作者Василий Могилев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:22:08