Retrofit无法通过指定ID更新任务:API未调用且无失败回调
Retrofit更新任务API未调用问题排查
问题详情
使用Retrofit更新任务时,已成功获取到目标任务的ID(id2)并能打印正确日志,但点击更新按钮后,API请求完全未被触发,onFailure回调也没有任何日志输出。
更新按钮点击代码
val task = UpdateTask( taskName, taskDesc, category, dueDate, assignee, pointEarned ) if (getData != null) { val id2 = getData.taskId Log.e("yes", "yes " + id2) GroomedKidzApi.retrofitService.updateTask(id2, makeGSONRequestBody(task)) .enqueue(object : Callback<TasksItem?> { override fun onResponse( call: Call<TasksItem?>, response: Response<TasksItem?> ) { val responseBody = response.body() if (responseBody != null) { Log.e("qqq", "yes " + responseBody) Toast.makeText( this@UpdateTaskActivity, "Update Successfully", Toast.LENGTH_SHORT ).show() } } override fun onFailure(call: Call<TasksItem?>, t: Throwable) { Log.e("FAIL", "FAIL " + id2) Toast.makeText( this@UpdateTaskActivity, "Update Unsuccessfully", Toast.LENGTH_SHORT ).show() } }) }
API接口定义
@Headers("Content-Type: application/json") @PUT("api/Tasks/{id}") fun updateTask(@Path("id") id: Int, @Body requestBody: RequestBody): Call<TasksItem>
核心疑问:updateTask(id2, makeGSONRequestBody(task)) 这种调用方式是否正确?
排查方向
- 检查
makeGSONRequestBody方法实现:确认它是否能正确将UpdateTask对象序列化为合法的JSON RequestBody,是否存在返回null的情况。如果该方法生成的RequestBody无效,Retrofit可能无法发起请求。 - 验证Retrofit实例初始化:检查
GroomedKidzApi.retrofitService的baseUrl是否配置正确,是否添加了日志拦截器(如OkHttp的HttpLoggingInterceptor),通过日志可以确认请求是否被构建、是否尝试发送。 - 确认ID类型匹配:虽然日志显示
id2值正确,但要确保id2的类型是Int,和接口定义的参数类型完全一致,避免隐性类型转换错误。 - 添加日志拦截器:配置OkHttp的日志拦截器并设置为BODY级别,这样可以查看请求的完整详情,包括是否有请求被发出、请求体内容、是否有异常抛出。
- 检查网络相关配置:确认应用已申请
INTERNET权限,设备网络连接正常;虽然onFailure未触发,但部分网络异常可能导致请求静默失败。 - 检查
UpdateTask序列化:确认类中所有需要传递的字段都正确配置了GSON序列化注解(如@SerializedName),避免因字段不匹配导致的序列化失败(虽然这一般不会导致请求不发起,但可能影响后续排查)。 - 确认线程调用:
enqueue本身是异步执行,但要确保代码没有在异常线程环境中执行,或者存在线程阻塞的情况。
内容的提问来源于stack exchange,提问作者Alex Chong01
相关产品推荐
相关产品推荐

