diff --git a/app/src/main/java/com/stand/standapp/LoginActivity.kt b/app/src/main/java/com/stand/standapp/LoginActivity.kt index 8c5d750..3b8a93c 100644 --- a/app/src/main/java/com/stand/standapp/LoginActivity.kt +++ b/app/src/main/java/com/stand/standapp/LoginActivity.kt @@ -9,6 +9,7 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import com.hjq.permissions.Permission import com.hjq.permissions.XXPermissions +import com.stand.standapp.net.NetworkModule import com.stand.standapp.printer.PrinterManager import okhttp3.* import org.json.JSONObject @@ -17,7 +18,7 @@ import java.io.IOException class LoginActivity : AppCompatActivity() { - private val client = OkHttpClient() + private val client = NetworkModule.defaultClient override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/stand/standapp/UpdateManager.kt b/app/src/main/java/com/stand/standapp/UpdateManager.kt index 9c6b418..96191e7 100644 --- a/app/src/main/java/com/stand/standapp/UpdateManager.kt +++ b/app/src/main/java/com/stand/standapp/UpdateManager.kt @@ -15,6 +15,7 @@ import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.content.FileProvider +import com.stand.standapp.net.NetworkModule import okhttp3.* import org.json.JSONObject import java.io.File @@ -58,7 +59,7 @@ class UpdateManager(private val context: Context) { val url = "$serverUrl/api/app-version/check-update?versionCode=$currentVersionCode" - val client = OkHttpClient() + val client = NetworkModule.defaultClient val request = Request.Builder().url(url).build() client.newCall(request).enqueue(object : Callback { @@ -139,7 +140,7 @@ class UpdateManager(private val context: Context) { private fun startManualDownload(url: String) { showProgressDialog() - val client = OkHttpClient() + val client = NetworkModule.defaultClient val request = Request.Builder() .url(url) .addHeader("User-Agent", "Mozilla/5.0 (Android)") diff --git a/app/src/main/java/com/stand/standapp/net/NetworkModule.kt b/app/src/main/java/com/stand/standapp/net/NetworkModule.kt new file mode 100644 index 0000000..b197b62 --- /dev/null +++ b/app/src/main/java/com/stand/standapp/net/NetworkModule.kt @@ -0,0 +1,25 @@ +package com.stand.standapp.net + +import okhttp3.OkHttpClient +import java.util.concurrent.TimeUnit + +object NetworkModule { + private const val DEFAULT_CONNECT_TIMEOUT_SEC = 15L + private const val DEFAULT_READ_TIMEOUT_SEC = 30L + private const val DEFAULT_WRITE_TIMEOUT_SEC = 30L + + val defaultClient: OkHttpClient by lazy { + OkHttpClient.Builder() + .connectTimeout(DEFAULT_CONNECT_TIMEOUT_SEC, TimeUnit.SECONDS) + .readTimeout(DEFAULT_READ_TIMEOUT_SEC, TimeUnit.SECONDS) + .writeTimeout(DEFAULT_WRITE_TIMEOUT_SEC, TimeUnit.SECONDS) + .retryOnConnectionFailure(true) + .build() + } + + fun streamingClient(): OkHttpClient { + return defaultClient.newBuilder() + .readTimeout(0, TimeUnit.MILLISECONDS) + .build() + } +} diff --git a/app/src/main/java/com/stand/standapp/ui/chat/repo/AiChatRepository.kt b/app/src/main/java/com/stand/standapp/ui/chat/repo/AiChatRepository.kt index b72fd2e..223dcb8 100644 --- a/app/src/main/java/com/stand/standapp/ui/chat/repo/AiChatRepository.kt +++ b/app/src/main/java/com/stand/standapp/ui/chat/repo/AiChatRepository.kt @@ -2,6 +2,7 @@ package com.stand.standapp.ui.chat.repo import com.stand.standapp.AppConfig import android.content.Context +import com.stand.standapp.net.NetworkModule import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose @@ -15,12 +16,9 @@ import okhttp3.RequestBody.Companion.toRequestBody import timber.log.Timber import java.io.BufferedReader import java.io.InputStreamReader -import java.util.concurrent.TimeUnit class AiChatRepository { - private val client = OkHttpClient.Builder() - .readTimeout(0, TimeUnit.MILLISECONDS) // 禁用读取超时以适配 SSE 流 - .build() + private val client: OkHttpClient = NetworkModule.streamingClient() fun streamChat(context: Context, message: String, token: String, historyJson: String): Flow = callbackFlow { // 1. 从 AppConfig 中动态读取当前服务器基准地址,完美适配真实网关 diff --git a/app/src/main/java/com/stand/standapp/utils/LogManager.kt b/app/src/main/java/com/stand/standapp/utils/LogManager.kt index 355f6b7..450092e 100644 --- a/app/src/main/java/com/stand/standapp/utils/LogManager.kt +++ b/app/src/main/java/com/stand/standapp/utils/LogManager.kt @@ -2,6 +2,7 @@ package com.stand.standapp.utils import android.content.Context import com.stand.standapp.AppConfig +import com.stand.standapp.net.NetworkModule import okhttp3.* import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody.Companion.asRequestBody @@ -17,7 +18,7 @@ import kotlin.system.exitProcess object LogManager { private val executor = Executors.newSingleThreadExecutor() private const val MAX_DAYS = 15 - private val client = OkHttpClient() + private val client = NetworkModule.defaultClient private var logDir: File? = null fun init(context: Context) {