android 自定义库,Android自定义Log库

背景

我们在开发的时候肯定会打一些Log,特别是在调试代码或者bug的时候,我们都会打一些Log日志来记录,但是当我们发布正式版本的时候,尼玛,要一行一行的去掉,这就尴尬了。

ef509328a466?nomobile=yes

懵逼状态

励志封装Log库

本来想使用github上的Logger库的,但是感觉有点烦中,后面看到了鸿洋大师写过一篇关于Log库的文章 Android反观Log库后面我也是根据这个来简单的修改的

自定义内容

增加变量来区分debug模式还是release模式,在release的情况下将所有的Log日志都去掉。

利用StackTraceElement来输出我们的Log的位置,便于我们定位和寻找日志。

实现

我们以i的log来作为例子:

/**

* iiiiiiiiiiiiii

* @param content

*/

public static void i(String content){

i(null,content);

}

public static void i(String tag,String content){

if (!sDebug) return;

printer.i(getFinalTag(tag),content);

}

其中的isDebug是我们的标识位,我们可以把它在初始化的时候来与编译类型绑定起来。

其中Printer类是实现了打印Log日志功能的输出类:

public class LogPrint implements Printer{

@Override

public void d(String message, String str) {

new DebugLogText(message).setup(str);

}

@Override

public void e(String message, String str) {

new ErrorLogText(message).setup(str);

}

@Override

public void e(String message, String str,Throwable throwable) {

new ErrorLogText(message).setup(str+throwable.getMessage());

}

@Override

public void w(String message, String str) {

new WarnLogText(message).setup(str);

}

@Override

public void i(String message, String str) {

new InfoLogText(message).setup(str);

}

@Override

public void v(String message, String str) {

new VerboseLogText(message).setup(str);

}

@Override

public void wtf(String message, Object... args) {

}

@Override

public void json(String message, String json) {

new InfoLogText(message).setup(json);

}

@Override

public void xml(String xml) {

}

@Override

public void clear() {

}

}

具体的输出类型是由对应的Log类型来产生,我们来看一个类InfoLogText:

public class InfoLogText extends LogText {

public InfoLogText(String tag) {

super(tag);

}

@Override

protected void setUpHeader() {

Log.i(mTag, SINGLE_DIVIDER);

}

@Override

protected void setUpFooter() {

Log.i(mTag, DOUBLE_DIVIDER);

}

@Override

protected void setUpContent(String content) {

StackTraceElement targetStackTraceElement = getTargetStackTraceElement();

Log.i(mTag, "(" + targetStackTraceElement.getFileName() + ":"

+ targetStackTraceElement.getLineNumber() + ")");

Log.i(mTag, content);

}

}

总结

我们可以看到,它实际调用的是系统的Log的日志方法,当然拼接了,对应的Log日志的类和行数,具体的原理我们可以查看上面提到的鸿洋的文章。

好了,我么大家来看一下最后的日志效果

11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: ********************************************

11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: (MainActivity.java:30)

11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: is a test

11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: ════════════════════════════════════════════

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 处理输入输出错误

处理输入输出时,我们必须预计到其中可能发生的错误并给出相应的处理措施。 当我们输入时,可能会由于人的失误(错误理解了指令、打字错误等)、文件格式不符、错误估计了情况等原因造成读取失败。当我们输出时,如果输出设…

android jackson 解析json字符串,android:json解析的两个工具:Gson和Jackson的使用小样例...

1.简单介绍json是android与server通信过程中经常使用的数据格式,比如。例如以下是一个json格式的字符串:{"address":"Nanjing","name":"NUPT","students":[{"name":"stu1","…

各种语言的 Hello World

学习编程的小伙伴们可能会发现,不敢我们学习哪种语言,我们的第一个程序都是Hello World!,所以我们非常有必要清楚的知道Hello World!使用每一种编程语言的写法。 使用C语言实现Hello World! #includeint main(void){printf("Hello Wor…

Android拦截浏览器广告,浏览器拦截广告的几种方法

悬浮闪动的弹窗广告和牛皮癣一样铺满全屏的低质广告,极大地破坏了浏览网页的体验。通过启用浏览器自带的广告拦截功能,或为浏览器安装广告拦截插件,能够还原网页原本的清爽真容。浏览器自带-安卓广告拦截操作说明口碑比较好的 Via、夸克和 X浏…

C++ 深拷贝和浅拷贝

对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: class Base{ public:Base(): m_a(0), m_b(0){ }Base(int a, int b): m_a(a), m_b(b){ } private:int m_a;int m_b; };int main(){int a 10;int b a; /…

android打包规范包含第三方库aar,Android Studio 打包AAR和第三方静态库(示例代码)

需求现在有一个第三方库libstatic_add.a和对应的头文件static.h,要求封装一个Module,该Module依赖这个静态库,要求打包的Module包含该静态库。方案创建Android Studio Library Project创建Project时,记得添加"Include C Sup…

C++ 重载赋值运算符

在定义的同时进行赋值叫做初始化(Initialization),定义完成以后再赋值(不管在定义的时候有没有赋值)就叫做赋值(Assignment)。初始化只能有一次,赋值可以有多次。 当以拷贝的方式初…

android 扫描重复文件,Android Gradle在APK META-INF中复制的重复文件

我尝试在我的Android应用程序中添加spring但应用程序不运行.我真的不知道为什么我的跑步失败了.你能帮我解决这个问题,谢谢这是我的app / build.gradle配置:apply plugin: com.android.applicationandroid {compileSdkVersion 23buildToolsVersion "23.0.3&quo…

C++ 转换构造函数

在 C/C 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。 自动类型转换示例: int a 6; a 7.5 a;编译器对 7.5 是作为…

android 媒体库扫描,如何扫描出Android系统媒体库中视频文件

Android系统启动时会去扫描系统文件,并将系统支持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件的信息:publicstatic List sysVideoList null;// 视频信息集合sysVideoList new ArrayList();setVideoLi…

C++ 四种类型转换运算符

隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。 但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有…

Android leak内存,GitHub - jin870132/memoryleakdemo: 安卓内存泄露几种常见形式及解决方案...

安卓内存泄露几种常见形式及解决方案一.前言1.内存溢出与内存泄露内存溢出(oom),是指程序在申请内存时,没有足够的内存空间供其使用,出现oom;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存泄…

第二批鸿蒙手机排行,鸿蒙系统第二批升级机型有哪些 鸿蒙系统第二批升级机型名单一览...

华为6月2日召开开启鸿蒙发布会,很多华为手机的用户都想第一时间用上鸿蒙手机系统,今天就给大家带来鸿蒙系统第二批升级机型名单一览,一起来看看吧鸿蒙系统第二批升级机型名单一览具体机型:HUAWEI Mate20 SeriesHUAWEl nova 8 Seri…

C++ 异常类型以及多级catch匹配

exceptionType是异常类型,它指明了当前的 catch 可以处理什么类型的异常;variable是一个变量,用来接收异常信息。当程序抛出异常时,会创建一份数据,这份数据包含了错误信息,程序员可以根据这些信息来判断到…

火狐 html5 退出 白屏,Html5+ 后退按钮出现白屏(webView.back会白屏)

您好,打包装到 iPad 上去调试,A ->B 之后,第一次调用 webView.back 会显示白屏,页面切换使用的 webView.loadUrl ,代码如下:var sub plus.webview.create(_basePath pages/canlucate/canlucate.html, …

C++ throw

我们知道C 异常处理的流程,具体为: 抛出(Throw)--> 检测(Try) --> 捕获(Catch)异常必须显式地抛出,才能被检测和捕获到;如果没有显式的抛出&#xff0…

html移除click事件绑定,带你了解JQuery中绑定事件(bind())和移除事件(unbind())...

本文主要向大家详细介绍了jQuery的绑定事件和移除事件的使用方法和示例分享,这里推荐给有需要的小伙伴们参考下。有时候事件执行完了,想取消事件的效果可以通过一定的办法来处理。比如bind()(绑定事件)和unbind()(移除通过bind()方法添加的事件)方法来移…

html怎么设计自己的网页,求一份自己设计的简单网页 HTML格式

A:百格*特点:该仪器用于均匀划出一定规格尺寸的方格,通过评定方格内涂膜的完整程度来评定涂膜对基材附着程度,以‘级’表示。它主要用于有机涂料划格法附着力的测定,不仅适用于实验室,也可用于各种条件下的…

VC2010 项目的创建

在VC2010中创建一个项目 1 . 创建新项目。打开我们的VC2010,点工具栏第一个按钮(New Project),或者菜单 File -> New -> Project…,或者按快捷键 CtrlShiftN,几种方式都可以。 2 . 在 “New Project…

html5教学案例撰写,怎样撰写教育教学案例

怎样撰写教育教学案例教学是教师的教和学生的学所组成的一种人类特有的人才培养活动。那么,怎样撰写教育教学案例呢?下面是小编收集整理的撰写教育教学案例的相关内容,希望对您有所帮助!1.撰写教育教学案例的思想准备要写好教育、教学案例,首…