Android 学习Android专题Android控件使用篇

开源框架Logger & HttpLogger打造你的炫酷Log

2020-11-06  本文已影响0人  千夜零一

引言

  使用AndroidStudio打印Log的时候很不好分辨怎么办,今天就来分享一下我常用的Logger框架,让你的Logcat清爽起来,所有的接口json数据格式化展现,妈妈再也不用担心我看Logcat看到头晕眼花了!
  本期就来带大家手把手实现炫酷的Log打印,我的代码我做主!还等什么呢?赶快@你的小伙伴一起学习吧~


介绍


效果预览


用法

第一步:添加依赖

//炫酷Logger
implementation 'com.orhanobut:logger:2.1.1'
//okhttp网络日志拦截器
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0'

第二步:初始化

/**
 * @data on 2020/10/9 11:09 AM
 * @auther armStrong
 * @describe 自定义Application
 */
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //自定义炫酷Logger
        FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
                .showThreadInfo(true)// (Optional) Whether to show thread info or not. Default true
                .methodCount(5)         // (Optional) How many method line to show. Default 2
                .methodOffset(7)        // (Optional) Hides internal method calls up to offset. Default 5
                .tag("My custom tag")   // (Optional) Global tag for every log. Default PRETTY_LOGGER
                .build();
        Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));  // 初始化Logger
    }
}

第三步:配置文件中指定Application

<manifest>
    <application
        ……
    android:name=".application.MyApplication"   //application为pakage名,.表明com.mydemo.xxx
    ……>
  </application>
</manifest>

第四步:在你的Retrofit+Okhttp打造网络请求框架中设置网络拦截器

OkHttpClient.Builder builder = getDefaultBuilder();
builder.addInterceptor(new HttpLoggingInterceptor(new HttpLogger()).setLevel(HttpLoggingInterceptor.Level.BODY));

第五步:创建Http网络拦截日志打印器的实现类

/**
 * @data on 2020/11/6 9:27 AM
 * @auther armStrong
 * @describe OkHttp网络日志拦截器实现类
 */
public class HttpLogger implements HttpLoggingInterceptor.Logger {
    private StringBuilder mMessage = new StringBuilder();

    @Override
    public void log(String message) {
        // 请求或者响应开始
        if (message.startsWith("--> POST")) {
            mMessage.setLength(0);
        }
        // 以{}或者[]形式的说明是响应结果的json数据,需要进行格式化
        if ((message.startsWith("{") && message.endsWith("}"))
                || (message.startsWith("[") && message.endsWith("]"))) {
            message = JsonUtil.formatJson(JsonUtil.decodeUnicode(message));
        }
        mMessage.append(message.concat("\n"));
        // 响应结束,打印整条日志
        if (message.startsWith("<-- END HTTP")) {
            Logger.d(mMessage.toString());
        }
    }
}

第六步:创建JsonUtil工具类,格式化json

/**
 * @data on 2020/11/6 9:30 AM
 * @auther armStrong
 * @describe 将无序的json串处理成格式化的json
 */
public class JsonUtil {
    /**
     * 格式化json字符串
     *
     * @param jsonStr 需要格式化的json串
     * @return 格式化后的json串
     */

    public static String formatJson(String jsonStr) {
        if (null == jsonStr || "".equals(jsonStr)) return "";
        StringBuilder sb = new StringBuilder();
        char last = '\0';
        char current = '\0';
        int indent = 0;
        for (int i = 0; i < jsonStr.length(); i++) {
            last = current;
            current = jsonStr.charAt(i);
            //遇到{ [换行,且下一行缩进
            switch (current) {
                case '{':
                case '[':
                    sb.append(current);
                    sb.append('\n');
                    indent++;
                    addIndentBlank(sb, indent);
                    break;
                //遇到} ]换行,当前行缩进
                case '}':
                case ']':
                    sb.append('\n');
                    indent--;
                    addIndentBlank(sb, indent);
                    sb.append(current);
                    break;
                //遇到,换行
                case ',':
                    sb.append(current);
                    if (last != '\\') {
                        sb.append('\n');
                        addIndentBlank(sb, indent);
                    }
                    break;
                default:
                    sb.append(current);
            }
        }
        return sb.toString();
    }

    /**
     * 添加space
     *
     * @param sb
     * @param indent
     */
    private static void addIndentBlank(StringBuilder sb, int indent) {
        for (int i = 0; i < indent; i++) {
            sb.append('\t');
        }
    }


    /**
     * http 请求数据返回 json 中中文字符为 unicode 编码转汉字转码
     *
     * @param theString
     * @return 转化后的结果.
     */

    public static String decodeUnicode(String theString) {
        char aChar;
        int len = theString.length();
        StringBuffer outBuffer = new StringBuffer(len);
        for (int x = 0; x < len; ) {
            aChar = theString.charAt(x++);
            if (aChar == '\\') {
                aChar = theString.charAt(x++);
                if (aChar == 'u') {
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        aChar = theString.charAt(x++);
                        switch (aChar) {
                            case '0':
                            case '1':
                            case '2':
                            case '3':
                            case '4':
                            case '5':
                            case '6':
                            case '7':
                            case '8':
                            case '9':
                                value = (value << 4) + aChar - '0';
                                break;
                            case 'a':
                            case 'b':
                            case 'c':
                            case 'd':
                            case 'e':
                            case 'f':
                                value = (value << 4) + 10 + aChar - 'a';
                                break;
                            case 'A':
                            case 'B':
                            case 'C':
                            case 'D':
                            case 'E':
                            case 'F':
                                value = (value << 4) + 10 + aChar - 'A';
                                break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed   \\uxxxx   encoding.");
                        }

                    }
                    outBuffer.append((char) value);
                } else {
                    if (aChar == 't')
                        aChar = '\t';
                    else if (aChar == 'r')
                        aChar = '\r';
                    else if (aChar == 'n')
                        aChar = '\n';
                    else if (aChar == 'f')
                        aChar = '\f';
                    outBuffer.append(aChar);
                }
            } else
                outBuffer.append(aChar);
        }
        return outBuffer.toString();
    }
}

第七步:设置你的Logcat颜色:

AndroiStudio设置步骤
Preference—>Editor—>ColorScheme—>AndroidLogcat中
首先:取消Inherit values from勾选框,然后选择每个log标签的颜色,完成。

Tips:如果你喜欢我的Logcat色系,贴出来颜色值如下:
绿色:Debug:48BB31
红色:Error:FF0006
蓝色:Infor:0070BB
白色:Verbose:BBBBBB
黄色:Warning:BBBB23

大功告成!

上一篇下一篇

猜你喜欢

热点阅读