diff --git a/app/src/main/java/com/sw/dualscreen/network/ApiClient.kt b/app/src/main/java/com/sw/dualscreen/network/ApiClient.kt index cd2e260..dccc8f4 100644 --- a/app/src/main/java/com/sw/dualscreen/network/ApiClient.kt +++ b/app/src/main/java/com/sw/dualscreen/network/ApiClient.kt @@ -4,6 +4,7 @@ import com.sw.dualscreen.BuildConfig import com.sw.dualscreen.MyApp import com.sw.dualscreen.network.api.ApiService import com.sw.dualscreen.network.interceptor.RequestInterceptor +import com.sw.dualscreen.utils.FileUtil import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -29,6 +30,7 @@ object ApiClient { else "ApiClient" val loggingInterceptor = HttpLoggingInterceptor(logger = { Timber.tag(tag).d("okhttp logger ==>${it}") + FileUtil.saveLog("okhttp logger ==>${it}") }).apply { level = if (BuildConfig.DEBUG) { HttpLoggingInterceptor.Level.BODY diff --git a/app/src/main/java/com/sw/dualscreen/utils/FileUtil.java b/app/src/main/java/com/sw/dualscreen/utils/FileUtil.java index 59720fe..9cacdcf 100644 --- a/app/src/main/java/com/sw/dualscreen/utils/FileUtil.java +++ b/app/src/main/java/com/sw/dualscreen/utils/FileUtil.java @@ -19,11 +19,18 @@ import java.io.StringReader; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class FileUtil { private static boolean isSaveLog = true; - public static final String FILE_STR_PATH = App.getContext().getExternalCacheDir().getAbsolutePath(); +// public static final String FILE_STR_PATH = App.getContext().getExternalCacheDir().getAbsolutePath(); + // 使用内部存储,不会被系统缓存清理策略影响 + public static final String FILE_STR_PATH = new File(App.getContext().getFilesDir(), "logs").getAbsolutePath(); + // 单线程执行器,保证日志串行写入,避免多线程并发竞争 + // 单线程执行器,保证日志串行写入,避免多线程并发竞争 + private static final ExecutorService LOG_EXECUTOR = Executors.newSingleThreadExecutor(); public static final int SIZETYPE_B = 1;//获取文件大小单位为B的double值 public static final int SIZETYPE_KB = 2;//获取文件大小单位为KB的double值 public static final int SIZETYPE_MB = 3;//获取文件大小单位为MB的double值 @@ -610,24 +617,19 @@ public class FileUtil { if (!isSaveLog) { return; } - new Thread() { - @Override - public void run() { - super.run(); + // 提交到单线程队列,串行执行,避免并发写入竞争 + LOG_EXECUTOR.execute(() -> { StringBuilder sb = new StringBuilder(); for (String log : logs) { sb.append("===") .append((AppUtil.formatDateGetCurrentTime())) .append("===") - .append("\n") .append(log) .append("\n"); } String fileName = "log" + AppUtil.formatDateGetDay(System.currentTimeMillis()) + ".txt"; FileUtil.saveStrFile(sb.toString(), fileName, FILE_STR_PATH, true); - - } - }.start(); + }); } private static final String[][] MIME_MapTable = { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c996dd3..fc515d1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ #Mon Jul 14 11:28:37 CST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-all.zip +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip #distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip #distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.14.3-all.zip zipStoreBase=GRADLE_USER_HOME