为何出现I/system_server日志且Kotlin+Retrofit无法调用API请求?
问题根因排查及解决方法
前置说明
日志I/system_server: oneway function results will be dropped but finished with status OK and parcel size 4属于系统层面的通用日志,和你的App网络请求失败无关联,无需针对该日志做排查。
最高概率故障点及修复方案
- CompositeDisposable未初始化
你的代码中使用myCompositeDisposable?.add添加RxJava订阅,存在可空调用符?,若myCompositeDisposable没有提前初始化,订阅代码会直接跳过,既不会发起请求,也不会触发任何回调。
修复方案:在页面对应生命周期(如onCreate/onViewCreated)中添加初始化代码:
myCompositeDisposable = CompositeDisposable()页面销毁时记得调用
myCompositeDisposable?.dispose()释放资源。- CompositeDisposable未初始化
- 参数类型不匹配
addUser方法传入的参数是UserDataObject类型,但Retrofit接口定义中@Body接收的是UserDataClass类型,若两个类型结构不兼容,Gson序列化会直接失败且不会触发你定义的错误回调。
修复方案:将接口定义调整为参数类型匹配:
@POST("/api/some/API/URL") fun addUser(@Body user: UserDataObject) : Completable- 参数类型不匹配
- BASE_URL配置错误
Retrofit要求BASE_URL必须以斜杠/结尾,否则接口路径拼接会出错;如果是局域网测试,还要确保手机和API服务器在同一个网段,且端口、IP配置正确。
修复方案:校验BASE_URL格式,示例正确格式:http://192.168.31.2:8080/
- BASE_URL配置错误
辅助排查手段
添加OkHttp日志拦截器,直观查看请求是否发出、参数是否正确:
- 先添加依赖到模块级build.gradle:
implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'
- 调整OkHttpClient配置:
val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } val client = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .addInterceptor(BasicAuthInterceptor("admin", "admin")) .build()
配置完成后运行App,查看Logcat中Tag为OkHttp的日志,即可确认请求的完整链路信息。
SELinux权限问题排查
如果上述所有代码问题都已排除,再验证SELinux权限问题:
- 调试阶段可通过adb命令临时关闭SELinux校验:
adb shell setenforce 0,执行后再测试请求是否正常 - 若关闭SELinux后请求恢复正常,可根据SELinux的具体报错日志添加对应权限规则,普通应用开发场景极少碰到该类问题。
内容的提问来源于stack exchange,提问作者Just_a_anon
相关产品推荐
相关产品推荐

