精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

安卓to鴻蒙系列:Timber

系統
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[395653]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

目錄

  • Guide
  • 原理
  • 知識點
  • 移植到鴻蒙

Guide

本文基于https://gitee.com/andych008/timber_ohos 分析Timber的源碼,及移植到鴻蒙需要做的工作。

大神JakeWharton的Timber是我寫日志的最愛,幾乎在所有的項目中都用。當然一般我會通過Timber使用Logger,原因很簡單,因為Timber接口簡潔,Logger的輸出樣式好看。常規套路:

  1. FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder() 
  2.         .tag("DwGG")   // (Optional) Global tag for every log. Default PRETTY_LOGGER 
  3.         .build(); 
  4.  
  5. Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy)); 
  6. Timber.plant(new Timber.DebugTree() { 
  7.     @Override 
  8.     protected void log(int priority, String tag, String message, Throwable t) { 
  9.         Logger.log(priority, tag, message, t); 
  10.     } 
  11. }); 

當然它的內部實現也一樣完美。咱們往下看。

原理

Timber英文翻譯為**“木材”**。靜態方法Timber.plant(Tree tree)即種樹。每種一棵樹,就擁有一種日志能力。

比如樹A表示輸出日志到控制臺,樹B表示輸出日志到文件,樹C輸出到網絡。

代碼實現上,Timber使用了外觀(facade)模式。

  • Tree類是外觀類,通過plant方法Timber持有Tree類的實例,Timber中的asTree、tag方法將它暴露出去,而對于調用者來說依賴的是抽象類Tree,而不是具體的Tree的實現,如果要更換或者添加Tree類實例,只需要調用plant等相關方法即可,所有調用者使用Tree對象的地方不需要做任何修改,這是符合面向對象依賴倒置原則的一個很好的體現。

另外也使用了委托(delegate)模式。Tree TREE_OF_SOULS把所有的操作都委托給forestAsArray。

更詳細的分析請移步

  1. Timber 源碼解析
  2. Timber源碼解析及涉及知識點總結

知識點

1.臨時tag的實現方法

  • 很簡單,Timber.tag("臨時tag").d(xxx);設置臨時tag。使用一次就刪除。
  • 為了性能,使用ThreadLocal 以空間換時間。
  1. public static abstract class Tree { 
  2. final ThreadLocal<String> explicitTag = new ThreadLocal<>(); 
  3.  
  4. String getTag() { 
  5.   String tag = explicitTag.get(); 
  6.   if (tag != null) { 
  7.     explicitTag.remove(); 
  8.   } 
  9.   return tag; 
  1. public static class DebugTree extends Tree { 
  2.  
  3. @Override final String getTag() { 
  4.   String tag = super.getTag(); 
  5.   if (tag != null) { 
  6.     return tag; 
  7.   } 
  8.  
  9.   // DO NOT switch this to Thread.getCurrentThread().getStackTrace(). The test will pass 
  10.   // because Robolectric runs them on the JVM but on Android the elements are different. 
  11.   StackTraceElement[] stackTrace = new Throwable().getStackTrace(); 
  12.   if (stackTrace.length <= CALL_STACK_INDEX) { 
  13.     throw new IllegalStateException( 
  14.         "Synthetic stacktrace didn't have enough elements: are you using proguard?"); 
  15.   } 
  16.   return createStackElementTag(stackTrace[CALL_STACK_INDEX]); 

2.synchronized的使用,因為FOREST為單例,所以對其讀寫要加鎖。

3.static volatile Tree[] forestAsArray ,volatile 保證了可見性

4.關于plant(Tree tree)方法中的forestAsArray = FOREST.toArray(new Tree[FOREST.size()]);

  1. public static void plant(@NotNull Tree tree) { 
  2.   if (tree == null) { 
  3.     throw new NullPointerException("tree == null"); 
  4.   } 
  5.   if (tree == TREE_OF_SOULS) { 
  6.     throw new IllegalArgumentException("Cannot plant Timber into itself."); 
  7.   } 
  8.   synchronized (FOREST) { 
  9.     FOREST.add(tree); 
  10.     forestAsArray = FOREST.toArray(new Tree[FOREST.size()]); 
  11.   } 
  • 為什么要把List 轉成Tree[]數組?

解釋這個問題可以參考 深度解析CopyOnWriteArrayList,線程安全的ArrayList!,從使用場景上看,Timber對于List FOREST讀多寫少,所以只對寫操作加鎖,讀操作(遍歷時)不需要加鎖。其本質上也是讀寫分離的思想,和CopyOnWriteArrayList類似,也是為了性能。

  • 為什么要用List.toArray(T[] a),而不是List.toArray()?

不推薦使用 toArray() 無參方法,此方法返回值只能是Object[]類,若強轉將出現ClassCastException錯誤。

移植到鴻蒙

如果Timber沒有默認提供DebugTree,直接拿來就能在鴻蒙上使用。DebugTree這棵樹的能力是在Logcat中輸出日志。所以移植要做的就是把android.util.Log換成ohos.hiviewdfx.HiLog。

HiLog在tag的基礎上擴展了HiLogLabel的概念。

label = new HiLogLabel(HiLog.DEBUG,0,tag);

如果每次都new一個label,太低效,所以這里可以優化。比如如果和上次一樣,就使用上次的。或者使用對象池技術。

關鍵代碼:

  1. public static class DebugTree extends Tree { 
  2.   private final ThreadLocal<HiLogLabel> currentLabel = new ThreadLocal<>(); 
  3.   private final ThreadLocal<String> currentTag = new ThreadLocal<>(); 
  4.  
  5.  
  6.   @Override protected void log(int priority, String tag, @NotNull String message, Throwable t) { 
  7.     HiLogLabel label = getHiLogLabel(tag); 
  8.  
  9.     if (message.length() < MAX_LOG_LENGTH) { 
  10.       if (priority == HiLog.FATAL) { 
  11.         HiLog.fatal(label,message); 
  12.       } else  if (priority == HiLog.INFO){ 
  13.         HiLog.info(label, message); 
  14.       }else if (priority == HiLog.WARN){ 
  15.         HiLog.warn(label, message); 
  16.       }else if (priority == HiLog.ERROR){ 
  17.         HiLog.error(label, message); 
  18.       }else if (priority == HiLog.DEBUG){ 
  19.         HiLog.debug(label, message); 
  20.       } 
  21.       return
  22.     } 
  23.  
  24.     // Split by line, then ensure each line can fit into Log's maximum length. 
  25.     for (int i = 0, length = message.length(); i < length; i++) { 
  26.       int newline = message.indexOf('\n', i); 
  27.       newline = newline != -1 ? newline : length; 
  28.       do { 
  29.         int end = Math.min(newline, i + MAX_LOG_LENGTH); 
  30.         String part = message.substring(i, end); 
  31.         if (priority == HiLog.FATAL) { 
  32.           HiLog.fatal(label,part); 
  33.         }else  if (priority == HiLog.INFO){ 
  34.           HiLog.info(label, part); 
  35.         }else if (priority == HiLog.WARN){ 
  36.           HiLog.warn(label, part); 
  37.         }else if (priority == HiLog.ERROR){ 
  38.           HiLog.error(label, part); 
  39.         }else if (priority == HiLog.DEBUG){ 
  40.           HiLog.debug(label, part); 
  41.         } 
  42.         i = end
  43.       } while (i < newline); 
  44.     } 
  45.   } 
  46.  
  47.   private HiLogLabel getHiLogLabel(String tag) { 
  48.     HiLogLabel label; 
  49.     if (tag.equals(currentTag.get())) { 
  50.       label = currentLabel.get(); 
  51.     } else { 
  52.       label = new HiLogLabel(HiLog.DEBUG,0,tag); 
  53.       currentLabel.set(label); 
  54.       currentTag.set(tag); 
  55.     } 
  56.     return label; 
  57.   } 

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-04-27 09:22:28

鴻蒙HarmonyOS應用

2021-07-26 10:09:43

鴻蒙HarmonyOS應用

2021-05-11 14:43:16

鴻蒙HarmonyOS應用

2019-06-20 16:07:12

鴻蒙安卓操作系統

2020-09-10 09:30:03

鴻蒙安卓操作系統

2013-11-04 14:49:34

安卓

2018-02-09 08:59:47

安卓FuchsiaiOS

2019-07-12 16:00:25

華為禁令開發

2021-06-04 05:13:22

鴻蒙

2021-05-18 15:44:13

IOS安卓鴻蒙

2014-12-09 11:15:06

郵箱安卓移動端

2013-10-17 10:17:41

安卓

2013-04-24 11:33:50

安卓

2021-07-06 18:21:31

鴻蒙HarmonyOS應用

2020-09-29 13:03:45

安卓應用開發工具開發

2021-02-25 10:40:00

數據

2011-10-18 13:33:02

思亞諾CMMBDTV

2020-10-14 07:27:08

MacBook

2021-10-21 18:57:55

Windows 11操作系統微軟

2013-12-12 16:23:53

安卓進化AndroidGoogle
點贊
收藏

51CTO技術棧公眾號

日韩色性视频| 欧美性天天影视| 欧美综合二区| 久久国产精品久久精品| 中文字幕在线国产| 欧美成人性网| 一区二区三区美女视频| 欧美黑人3p| 亚洲成人中文字幕在线| 日本怡春院一区二区| 欧美激情视频给我| 精品国产aaa| 亚洲国产高清在线观看| 色欧美片视频在线观看在线视频| 欧美一级中文字幕| 国产一二三区在线| k8久久久一区二区三区| 91免费国产视频| 天天射天天干天天| 亚洲狠狠婷婷| 欧美大学生性色视频| 伊人影院综合网| 亚洲宅男网av| 亚洲第一中文字幕在线观看| 亚洲成人手机在线观看| 日本欧美韩国| 一本色道久久综合亚洲精品按摩| 午夜久久久久久久久久久| 九色在线免费| 91在线国产福利| 成人免费在线看片| 国产999久久久| 久久99热狠狠色一区二区| 热草久综合在线| 日韩av在线天堂| 欧美一区二区三区久久精品茉莉花 | 精品久久久久久久久久久久久久久| 免费看污黄网站| 一区二区视频免费完整版观看| 欧美日韩裸体免费视频| 和岳每晚弄的高潮嗷嗷叫视频| 黄色在线免费网站| 国产精品久久夜| 视频一区三区| 69视频在线观看| 欧美激情一区在线观看| 性欧美videosex高清少妇| 免费在线毛片| 久久久综合网站| 欧美一区二区三区四区五区六区| 亚洲色大成网站www| 99国产精品99久久久久久| 国产精品成人一区二区三区 | 日韩av超清在线观看| 欧美性猛交99久久久久99按摩| 亚洲美免无码中文字幕在线 | 国产欧美日韩专区发布| 中文字幕精品一区二| 老司机午夜精品| 国产日韩欧美中文| 国产99视频在线| 成人黄色av电影| 久久av一区二区三区亚洲| 水莓100在线视频| 久久久久久99久久久精品网站| 日韩经典在线视频| 在线免费看a| 亚洲精品大片www| 日韩伦理在线免费观看| 自由日本语热亚洲人| 欧美性受xxxx黑人xyx性爽| 日本三级黄色网址| 8x国产一区二区三区精品推荐| 亚洲白虎美女被爆操| 实拍女处破www免费看| 欧美freesextv| 欧美激情综合色综合啪啪五月| 国产精品6666| 奇米综合一区二区三区精品视频| 成人激情视频免费在线| 国产 欧美 自拍| 久久久精品tv| 国产日韩第一页| 7777kkk亚洲综合欧美网站| 91国产免费看| 欧美熟妇另类久久久久久多毛| 精品一区二区男人吃奶| 亚洲一区第一页| 国产suv一区二区三区| 亚洲高清电影| 国产日韩欧美中文| 午夜在线视频观看| 中文字幕一区日韩精品欧美| 青青草视频在线免费播放| 精品裸体bbb| 日韩精品中文字幕在线一区| 久久久久久亚洲中文字幕无码| 天天久久综合| 情事1991在线| 亚洲精品综合久久| 国产精品久久二区二区| 日日碰狠狠添天天爽超碰97| 欧美1区2区3| 国产一区二区三区18| 免费一级肉体全黄毛片| 日本不卡视频在线| 九色91在线视频| 草莓福利社区在线| 欧美中文字幕一区二区三区亚洲| 国产精久久久久| 国产大片一区| 国产精欧美一区二区三区| 二区三区在线视频| 亚洲欧洲色图综合| 密臀av一区二区三区| 免费看久久久| 色综合老司机第九色激情| 在线观看国产小视频| 99re热视频这里只精品| 国产亚洲精品久久久久久久| 国产福利亚洲| 国产亚洲欧美一区| 影音先锋在线国产| hitomi一区二区三区精品| 99视频精品全部免费看| 成年永久一区二区三区免费视频| 国产性猛交xxxx免费看久久| 国产成人一区二区三区影院在线| 国产福利一区在线| 男同互操gay射视频在线看| 亚洲精品一区av| 最近更新的2019中文字幕| 一级黄色av片| 久久久久久**毛片大全| 日韩精品视频一区二区在线观看| 国产乱人伦精品一区| 欧美精品久久久久| 好吊色一区二区三区| 亚洲综合精品自拍| 国内精品免费视频| 亚洲免费播放| 蜜桃999成人看片在线观看| 欧美sm一区| 亚洲欧洲国产精品| 69国产精品视频免费观看| 91免费观看视频在线| 精品一卡二卡三卡| 欧美精品一区二区三区精品| 国产精品久久色| 色老头视频在线观看| 欧美卡1卡2卡| 特级片在线观看| 国产91综合一区在线观看| www.av91| 三级精品视频| 国产精品极品美女在线观看免费 | 色资源在线观看| 色一区在线观看| 中文字幕网站在线观看| 日本视频一区二区三区| 在线免费观看成人| 亚洲性视频在线| 欧美一区二区三区免费观看| 国产剧情在线观看| 制服丝袜激情欧洲亚洲| 国产一级生活片| 久久老女人爱爱| 日本黄色福利视频| 欧美视频在线观看| 国产日韩在线一区二区三区| 日韩理论视频| 中文字幕亚洲欧美日韩2019| 99久久精品国产成人一区二区| 亚洲成人高清在线| 亚洲欧洲久久久| 国产乱一区二区| aa在线免费观看| 国产国产精品| 精品网站在线看| 99国内精品久久久久| 久久琪琪电影院| 国产精品影院在线| 欧美精品一区二区久久久| 成人黄色三级视频| 亚洲国产欧美在线| 一级在线观看视频| 成人小视频免费观看| 欧美在线观看视频网站| 永久亚洲成a人片777777| 久久综合入口| 麻豆国产一区二区三区四区| 欧美一区视频在线| 怡红院av在线| 亚洲色图第三页| 亚洲精品一区二区三区四区| 欧美色图免费看| 日韩三级av在线| 亚洲私人黄色宅男| 亚洲区自拍偷拍| 成人午夜激情片| 国产精品自在自线| 久久午夜av| 亚洲精品蜜桃久久久久久| 久久免费大视频| 久久久一本精品99久久精品| 日本一区二区三区播放| 国产精品久久久久久久久久尿 | 国内三级在线观看| 亚洲第一区中文99精品| 国产精品久久久久毛片| 91国产福利在线| 日本韩国欧美中文字幕| 一区二区三区四区激情| 91n在线视频| 国产校园另类小说区| jizz日本免费| 国产成人aaa| 国产黑丝在线视频| 精品系列免费在线观看| 超碰超碰在线观看| 日韩精品亚洲一区| 久久九九国产视频| 久久精品道一区二区三区| 亚洲人成无码网站久久99热国产 | 国产国语老龄妇女a片| 国产一区在线不卡| 一级黄色在线播放| 九色综合狠狠综合久久| 天堂中文视频在线| 日日夜夜精品视频天天综合网| 国产黄色一级网站| 亚洲先锋成人| 东北少妇不带套对白| 黄色亚洲在线| 欧美精品卡一卡二| 好看的av在线不卡观看| 中文字幕人妻熟女人妻洋洋| 欧美成人有码| 国产传媒久久久| 亚洲国产精品一区制服丝袜| 国产91xxx| 亚洲女同在线| 精品久久久久久无码国产| 日韩精品色哟哟| 在线看的黄色网址| 精品在线观看视频| 亚洲五月激情网| 成人免费看的视频| 中文字幕 亚洲一区| 久久新电视剧免费观看| www在线观看免费视频| 国产日韩精品一区| av片在线免费看| 亚洲欧美偷拍卡通变态| 久久免费视频播放| 精品久久久久久中文字幕大豆网| 影音先锋亚洲天堂| 色噜噜狠狠成人网p站| 中文字幕在线播放不卡| 91精品国产欧美一区二区成人| 精品久久久久久亚洲综合网站| 欧美成人精品福利| 四虎精品成人影院观看地址| 在线观看日韩视频| av小次郎在线| 97精品国产97久久久久久免费 | 日韩欧美黄色网址| 亚洲美女区一区| 国产精品成人久久| 色久优优欧美色久优优| 亚洲综合免费视频| 精品免费视频一区二区| 男生女生差差差的视频在线观看| 色悠悠久久88| 大香伊人久久| 国产精品美女免费看| 麻豆国产一区| 日韩精品在在线一区二区中文| 国产高清欧美| 国产精品免费观看久久| 激情五月婷婷综合网| 自拍视频一区二区| 国产精品成人一区二区三区夜夜夜| 久久精品99国产精| 欧美亚洲一区三区| 丰满岳乱妇国产精品一区| 亚洲午夜未删减在线观看| av免费在线观| 国产精品18久久久久久首页狼 | 日韩欧美亚洲一区二区三区| 欧美性videosxxxxx| 欧美视频xxx| 久久久国产一区二区三区| 天堂√中文最新版在线| 亚洲精品欧美一区二区三区| 欧美禁忌电影网| 亚洲精品蜜桃久久久久久| 久久精品久久99精品久久| 日本丰满少妇裸体自慰| 亚洲黄网站在线观看| 中文字幕+乱码+中文乱码www| 亚洲缚视频在线观看| h片在线观看网站| 国产精品男女猛烈高潮激情| 日韩成人动漫在线观看| 97碰在线视频| 国产在线精品一区在线观看麻豆| 四虎永久免费在线观看| 亚洲va国产va欧美va观看| 国产美女三级无套内谢| 亚洲性生活视频| 牛牛精品一区二区| 国产精品一区二区你懂得| 无码一区二区三区视频| 黄色成人免费看| 久久久精品国产免费观看同学| 国产中文字幕免费| 91精品国产免费久久综合| av电影在线观看| 国产成人久久久| 综合国产视频| 九色在线视频观看| 99久久伊人久久99| 精品无码黑人又粗又大又长| 日韩一区二区精品| 麻豆网站在线免费观看| 国产精品亚洲精品| 日韩精品dvd| 亚洲三级视频网站| 国产欧美综合色| 亚洲中文无码av在线| 国产亚洲精品久久久优势| 韩日成人影院| 欧洲亚洲一区二区| 久久一区精品| 欧美大波大乳巨大乳| 色婷婷久久99综合精品jk白丝| 三级无遮挡在线观看| 欧美亚洲在线视频| 一区二区美女| 免费看a级黄色片| 中文在线一区二区 | 国产综合色产在线精品 | 欧美性精品220| 免费福利在线观看| 国产精品久久综合av爱欲tv| 成人精品视频| 亚洲第一天堂久久| 亚洲激情男女视频| 亚洲欧美强伦一区二区| 午夜精品99久久免费| 午夜a一级毛片亚洲欧洲| 亚洲色成人一区二区三区小说| 久久―日本道色综合久久| 日本中文字幕在线观看视频| 在线中文字幕日韩| 久久综合给合| 日本www在线视频| 久久久久久一二三区| www.久久网| 欧美成人精品h版在线观看| 国产精品115| 国产免费人做人爱午夜视频| 国产精品国产三级国产| 国产不卡精品视频| 91福利视频网| 日韩欧美字幕| 中文字幕在线观看视频www| 岛国av一区二区三区| av一区在线观看| 国产69精品久久久久9999apgf| 亚洲一区二区三区免费在线观看| 成人激情五月天| 日韩欧美在线不卡| 中文字幕在线视频久| 一区二区视频在线观看| 丁香网亚洲国际| 国产一卡二卡三卡| 九九精品在线观看| 妖精一区二区三区精品视频| 日本三级黄色网址| 精品久久久国产| 免费看美女视频在线网站| 国产精品久久久久久久久久久久冷| 久久天堂精品| 国产在线拍揄自揄拍无码视频| 亚洲欧美综合区自拍另类| 精品中文在线| 激情综合网婷婷| 亚洲精品免费在线| 国产视频二区在线观看| y111111国产精品久久婷婷| 久色成人在线| 日韩精品人妻中文字幕| 日韩中文字幕精品视频| 亚州综合一区| 无人码人妻一区二区三区免费| 色老汉av一区二区三区| gogo高清午夜人体在线| 青春草在线视频免费观看|