From 398b7c6e50e261ed7ea112038c6c38be67f7c31a Mon Sep 17 00:00:00 2001 From: Eric85710 Date: Sat, 13 Jun 2026 14:29:12 +0800 Subject: [PATCH] dm-125 --- .../example/login_v3/data/di/NetworkModule.kt | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt b/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt index 6855112..0cc5f86 100644 --- a/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt +++ b/app/src/main/java/com/example/login_v3/data/di/NetworkModule.kt @@ -10,6 +10,7 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking import okhttp3.OkHttpClient @@ -31,30 +32,21 @@ object NetworkModule { .build() } - // 修正:在這裡注入 okHttpClient - @Provides - @Singleton - fun provideRetrofit(moshi: Moshi, okHttpClient: OkHttpClient): Retrofit { - return Retrofit.Builder() - .baseUrl("http://192.168.0.189/") - .client(okHttpClient) // 關鍵:將攔截器綁定到 Retrofit - .addConverterFactory(MoshiConverterFactory.create(moshi)) - .build() - } - @Provides @Singleton fun provideOkHttpClient(tokenManager: TokenManager): OkHttpClient { return OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) - // 🟢 修正 2:如果使用 IP 且噴出 Hostname 錯誤才需要加這段。 - // 如果後端憑證的 SAN/CN 已經有包含 192.168.0.217,這行可以刪除。 - .hostnameVerifier { hostname, _ -> hostname == "192.168.0.217" } + // 🟢 如果未來改用 HTTPS 且 IP 是 192.168.0.189 遇到憑證問題再開啟 + // .hostnameVerifier { hostname, _ -> hostname == "192.168.0.189" } .addInterceptor { chain -> - // 1. 動態獲取「目前選中帳號」的 Token - // 使用 first() 確保只取目前最新的那一個值 - val token = runBlocking { tokenManager.currentAccessToken.first() } + // 在 OkHttp 的背景執行緒中安全地進行同步等待 + val (token, userId) = runBlocking(Dispatchers.IO) { + val t = tokenManager.currentAccessToken.first() + val id = tokenManager.currentUserId.first() + t to id + } val requestBuilder = chain.request().newBuilder() token?.let { @@ -63,14 +55,12 @@ object NetworkModule { val response = chain.proceed(requestBuilder.build()) - // 2. 處理 Token 失效 (401) + // 處理 Token 失效 (401) if (response.code == 401) { - runBlocking { - // 獲取目前是哪個 ID 失效了 - val currentId = tokenManager.currentUserId.first() - currentId?.let { - // 只登出當前失效的帳號,不影響其他帳號 - tokenManager.logout(it) + userId?.let { id -> + // 使用 Dispatchers.IO 確保不會卡死主執行緒 + runBlocking(Dispatchers.IO) { + tokenManager.logout(id) } } } @@ -80,9 +70,19 @@ object NetworkModule { .build() } + @Provides + @Singleton + fun provideRetrofit(moshi: Moshi, okHttpClient: OkHttpClient): Retrofit { + return Retrofit.Builder() + .baseUrl("http://192.168.0.189/") // 確保與實際伺服器 IP 一致 + .client(okHttpClient) + .addConverterFactory(MoshiConverterFactory.create(moshi)) + .build() + } + @Provides @Singleton fun provideTecnologiaApi(retrofit: Retrofit): TecnologiaApi { return retrofit.create(TecnologiaApi::class.java) } -} +} \ No newline at end of file