为了方便调试,许多开发者都会习惯用 Log
打印网络请求响应的内容,而不是使用其他工具。
但是在打印日志时,你可能会遇到日志显示不完整的情况,比如响应的 JSON 数据在中间被截断了。
有人可能会认为是字符串超长的问题,不过回想『Java String 长度限制』就可以判断出这个问题并不是由于 String
的长度限制导致的,那就只能是 Android 的 Log
限制。
从 Android 内核源码来看,有以下宏定义:
#define LOGGER_ENTRY_MAX_LEN (4*1024)
#define LOGGER_ENTRY_MAX_PAYLOAD (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry))
Android 系统对日志长度有限制,最大长度为 4K,超过这个范围的自动截断,所以就会出现打印不全的情况。
既然一次只能打印 4K 长度的信息,那很容易想到将待打印的信息拆分成一个个信息段,然后分别打印即可。
实际测试发现,日志的最大长度其实略小于 4*1024
。为了保险起见,可以设置每一段日志长度为 3*1024
。如果待打印的字符串信息长度小于等于 3*1024
,则直接打印即可,否则将日志信息截断为一段一段分别打印。
public class LogUtil {
private static final int LOGGER_MAX_LENGTH = 3 * 1024;
public static void i(@NonNull String tag, @NonNull String msg) {
if (msg.length() > LOGGER_MAX_LENGTH) {
while (msg.length() > LOGGER_MAX_LENGTH) {
Log.i(tag, msg.substring(0, LOGGER_MAX_LENGTH));
msg = msg.substring(LOGGER_MAX_LENGTH);
}
}
Log.i(tag, msg);
}
}
一般情况下会对日志工具类做了封装,可参考之前『定制 Android 日志工具』一文做组合使用。