美文网首页
HttpLogger:可以定位代码的OkHttp拦截器(Inte

HttpLogger:可以定位代码的OkHttp拦截器(Inte

作者: sumuve | 来源:发表于2019-01-10 12:29 被阅读0次

    HttpLogger简介

    • HttpLogger可以方便的在logcat中查看网络请求参数及项目中发出网络请求的代码的位置,点击即可跳转
    http.gif
    初始化
    // 创建OkHttpClient
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
        if (BuildConfig.DEBUG) {//debug时添加拦截器
            HttpLogger interceptor = new HttpLogger.Builder()
                //logcat输出的tag
                .setTag("TAG")
                //logcat输出的级别
                .setLevel(Log.INFO)
                //返回的结果的最大行数,超过将折叠
                .setMaxLines(30)
                //将当前位置传递给Interceptor的HeaderName
                .setHeaderName("location")
                //logcat检测到包含此字符串的行将被折叠,默认为"\t\t\t at %s "最后一个空格为\#u00A0的空格
                //修改之后需要在File->Settings->Editor->General->Console中添加相应的字段
                //.setContain("HttpLogger")
                .build();
            //添加拦截器
            builder.addInterceptor(interceptor);
        }
    

    OkHttp用法

    ...
    Builder builder = new okhttp3.Request.Builder()
                        .url(url)
                        .get();
        if (BuildConfig.DEBUG) {//debug时在header中添加代码信息
            //headerName要与setHeaderName的字段相同
            builder.addHeader("location", CodeUtils.getCodeLine());
        }     
    Request request = builder.build();
    ...
    

    retrofit用法

    ...
    @FormUrlEncoded
    @POST("service/getIpInfo2.php")
    //动态添加header
    Observable<String> getIp(@Header("location") String codeLine, @Field("ip") String params);
    ...
    ...
    //调用方法时,将当前代码位置放入header
    
    HttpUtils.getInstance().getIp(CodeUtils.getCodeLine(), etIp.getText().toString());
    ...
    

    OkGo用法

    ....
    Request request = OkGo.<String>get(url);
    //debug下添加header信息
    if (BuildConfig.DEBUG) {
        request.headers("location", CodeUtils.getCodeLine());
    }
    ....
    

    关于CodeUtils.getCodeLine();

    1. CodeUtils.getCodeLine()

    会返回 MainActivity.retrofit(MainActivity.java:69) 这种格式的字符串用于定位代码,默认情况下哪里调用返回哪里的位置,当前位置就为MainActivity中的retrofit方法中调用,位于MainActivity文件中的第69行。

    1. CodeUtils.getCodeLine(Class excludeClass);

    大家在使用OkHttp时一定会封装一个统一的网络请求类(比如叫做OkHttpUtils),将builder.addHeader(...,CodeUtils.getCodeLine())也做了封装,于是在MainActivity中发出请求就打印的是OkHttpUtils中的代码位置,这个时候需要排除OkHttpUtils,代码修改成CodeUtils.getCodeLine(OkHttpUtils.class),则会排除OkHttpUtils在栈中的方法从而获取到MainActivity中的调用位置。

    1. CodeUtils.getCodeLine(int offset);

    如果使用排除也无法获取到正确的位置,可以使用直接添加偏移量的方法。

    CodeUtils.printStackTrace();//打印当前栈信息

    I/TAG1: ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════
    I/TAG0: ║ -4    dalvik.system.VMStack.getThreadStackTrace(Native Method)
    I/TAG1: ║ -3    java.lang.Thread.getStackTrace(Thread.java:1556)
    I/TAG0: ║ -2    com.cjj.httplogger.CodeUtils.getStackTraceElement(CodeUtils.java:77)
    I/TAG1: ║ -1    com.cjj.httplogger.CodeUtils.printStackTrace(CodeUtils.java:54)
    I/TAG0: ║  0    com.example.cjj.httplogger.MainActivity.onCreate(MainActivity.java:36)
    I/TAG1: ║  1    android.app.Activity.performCreate(Activity.java:7383)
    I/TAG0: ║  2    android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
    I/TAG1: ║  3    android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3256)
    I/TAG0: ║  4    android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3411)
    I/TAG1: ║  5    android.app.ActivityThread.-wrap12(Unknown Source:0)
    I/TAG0: ║  6    android.app.ActivityThread$H.handleMessage(ActivityThread.java:1994)
    I/TAG1: ║  7    android.os.Handler.dispatchMessage(Handler.java:108)
    I/TAG0: ║  8    android.os.Looper.loop(Looper.java:166)
    I/TAG1: ║  9    android.app.ActivityThread.main(ActivityThread.java:7529)
    I/TAG0: ║ 10    java.lang.reflect.Method.invoke(Native Method)
    I/TAG1: ║ 11    com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
    I/TAG0: ╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════════
    
    

    在控制台输出的信息中找到需要的代码位置标记的偏移量即可。


    Github
    大家使用中遇到问题或者有任何建议都可以给我发邮件 303464880@qq.com, 也可以加我QQ:303464880。

    相关文章

      网友评论

          本文标题:HttpLogger:可以定位代码的OkHttp拦截器(Inte

          本文链接:https://www.haomeiwen.com/subject/pwsirqtx.html