Android Kotlin中ViewModel发起API请求时应用崩溃问题求助
排查无Logcat报错的OTP请求崩溃问题
以下是针对你的场景的具体排查步骤和解决方案,覆盖ViewModel初始化、协程异常、API配置、布局绑定等核心环节:
1. 验证ViewModel初始化流程
- 检查
LoginViewModelFactory是否正确传递依赖:确保Factory的构造函数接收LoginService实例,且创建ViewModel时准确传递该实例。错误的依赖注入会导致ViewModel初始化失败,触发静默崩溃。// 正确的Factory示例 class LoginViewModelFactory(private val loginService: LoginService) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { return if (modelClass.isAssignableFrom(LoginViewModel::class.java)) { LoginViewModel(loginService) as T } else { throw IllegalArgumentException("无法创建未知类型的ViewModel") } } } - 确认Activity中ViewModel的获取方式:必须使用
ViewModelProvider结合自定义Factory,不能直接实例化ViewModel。// Activity中的正确获取方式 val loginService = Retrofit.Builder()...build().create(LoginService::class.java) val factory = LoginViewModelFactory(loginService) val viewModel = ViewModelProvider(this, factory)[LoginViewModel::class.java]
2. 补全协程异常捕获
ViewModel中发起API请求的协程如果未处理异常,会导致崩溃但Logcat无输出(协程未捕获异常默认不会打印到Logcat)。必须添加异常处理逻辑:
// LoginViewModel中的sendOtp方法示例 fun sendOtp(phoneNumber: String) { val exceptionHandler = CoroutineExceptionHandler { _, throwable -> Log.e("LoginVM", "OTP请求异常", throwable) // 这里可以添加UI提示逻辑 } viewModelScope.launch(exceptionHandler) { val response = loginService.sendOtp(OtpRequest(phoneNumber)) // 处理响应逻辑 } }
3. 检查布局与点击事件绑定
- 如果使用DataBinding:确认布局中按钮的点击事件已正确绑定到ViewModel方法,且Activity已设置
binding.lifecycleOwner = this,否则ViewModel的生命周期感知会失效,触发异常。<!-- 布局中的按钮绑定示例 --> <Button android:id="@+id/send_otp_btn" android:onClick="@{() -> viewModel.sendOtp(phoneInput.text.toString())}" ... /> - 如果手动设置点击事件:检查按钮实例是否为空(比如
findViewById未找到控件),避免空指针崩溃。
4. 排查Retrofit服务配置
- 确认
LoginService的接口定义是否符合后端要求:请求方法、URL、参数注解(@Body/@Query)必须与后端一致。 - 添加日志拦截器查看请求详情:通过
HttpLoggingInterceptor可以捕获请求和响应的完整信息,排查API调用是否正常发起。// Retrofit实例配置日志拦截器 val okHttpClient = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }) .build() val retrofit = Retrofit.Builder() .baseUrl("你的后端BaseUrl") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build()
5. 处理静默崩溃(无Logcat输出)
- 查看Native日志:如果是Native层崩溃,普通Logcat看不到,需切换到Android Studio的Native Logs面板,或执行
adb logcat -C命令查看完整日志。 - 暂时关闭混淆:ProGuard/R8混淆可能隐藏异常信息,关闭混淆后重新测试,看是否能出现报错日志。
- 检查开发者选项:确保“不保留活动”选项未开启,该选项会导致Activity被强制销毁,可能触发无日志的崩溃。
内容的提问来源于stack exchange,提问作者Panchumarthi Abhinav
相关产品推荐
相关产品推荐

