Android Studio中Retrofit日志不显示问题排查求助
Retrofit HttpLoggingInterceptor 无日志输出排查方案
1. 确认依赖是否正确添加
确保Module级build.gradle(或build.gradle.kts)中引入了日志拦截器依赖,版本需与OkHttp版本匹配:
// build.gradle.kts implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
2. 检查日志级别配置
HttpLoggingInterceptor默认不输出详细日志,必须显式设置级别,调试时建议用BODY级获取完整请求/响应内容:
val loggingInterceptor = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }
级别说明:
NONE:无日志输出BASIC:仅输出请求方法、URL、响应状态码及耗时HEADERS:输出请求/响应头部信息BODY:输出完整请求/响应的头部与Body内容
3. 验证拦截器是否添加到OkHttpClient
必须将日志拦截器加入OkHttpClient的拦截器链,且Retrofit需绑定该客户端:
// 构建带日志拦截器的OkHttpClient val okHttpClient = OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build() // Retrofit绑定该客户端 val retrofit = Retrofit.Builder() .baseUrl("http://api.themoviedb.org/3/") .client(okHttpClient) // 关键:不能遗漏此步骤 .addConverterFactory(GsonConverterFactory.create()) .build()
4. 检查Logcat过滤条件
- 默认日志Tag为
HttpLoggingInterceptor,可直接在Logcat搜索该Tag - 确保Logcat日志级别设置为
Verbose或Info(若仅选Error会过滤掉调试日志)
5. 确认网络安全配置有效性
虽然已开启明文流量,仍需验证配置是否正确:res/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">api.themoviedb.org</domain> </domain-config> </network-security-config>
并在AndroidManifest.xml的<application>标签中引用:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
配置错误会导致请求无法发出,自然无日志。
6. 排查Coroutine异常处理
若在Coroutine中调用接口,需确保异常被打印而非吞掉:
viewModelScope.launch { try { val response = movieApi.getPopularMovies() // 处理响应 } catch (e: Exception) { Log.e("MovieApiRequest", "请求失败", e) // 必须打印异常栈信息 } }
7. 检查ProGuard/R8混淆规则(仅Release版本)
若为Release包,混淆可能移除日志代码,需在proguard-rules.pro中添加:
-keep class okhttp3.** { *; } -keep class okio.** { *; } -keep class retrofit2.** { *; } -dontwarn okhttp3.** -dontwarn okio.** -dontwarn retrofit2.**
8. 自定义拦截器验证请求是否触发
若以上步骤均无效,可添加自定义拦截器验证请求是否被执行:
val testInterceptor = Interceptor { chain -> val request = chain.request() Log.d("TestInterceptor", "请求URL: ${request.url}") val response = chain.proceed(request) Log.d("TestInterceptor", "响应状态码: ${response.code}") response }
将其加入OkHttpClient,若该拦截器有日志输出,说明HttpLoggingInterceptor配置存在问题;若无输出,则请求未被触发,需检查ViewModel/Repository层的调用逻辑。
内容的提问来源于stack exchange,提问作者Zin Win Htet
相关产品推荐
相关产品推荐

