跳到主要內容

發表文章

目前顯示的是 4月, 2020的文章

Jetpack Compse 實戰 —— 全新的開發體驗

公眾號回復 Compose 獲取安裝包 項目地址: 經過前段時間的 Android Dev Summit ,相信你已經大概了解了 Jetpack Compose 。如果你還沒有聽說過,可以閱讀這篇文章 。總而言之,Compose 是一個 顛覆性 的 聲明式 UI 框架 ,它的口號就是 消滅 xml 文件 ! 儘管 Jetpack Compose 還只是預覽版,API 可能發生變化,缺乏足夠的控件支持,甚至不是那麼穩定,但這阻止不了我這顆好奇的心。我在第一時間就上手擼了一款 Compose 版本 Wanandroid 應用,功能也比較簡單,僅僅包括首頁,廣告和最新項目,類似於 Android 原生頁面的 Viewpager + TabLayout 。下面的 gif 展示了應用的基本頁面: 可以看出來頁面並不是那麼流暢,View 的復用應該是個問題,甚至我也沒發現應該怎麼做下拉刷新。那麼,Compose 給我們帶來了什麼呢?在解答這個問題之前,我想先來說說 Android 應用架構問題。 荒蕪年代 —— MVC 在我剛入行的時候,可以說是 Android 開發的黃金時代,也可以說是開發者的荒蕪時代。一方面,毫不誇張的說,基本會寫 xml 都能謀得一份工作。另一方面,對於開發者來說,遠遠沒有現在的規範的開發架構。沒記錯的話,我當年的主力開發框架是 xUtils 2 ,一個類庫大包干,從 布局和 ID 綁定,網絡請求,到圖片展示,ORM 操作,一應俱全。當時的 布局和 ID 綁定還是運行時反射,而不是編譯期註解。很長一段時間以來,Android 連一個官方的網絡庫都沒有。 在架構方面,很多人都是一個 Activity 擼到死,我真的見過上千行zouguolai的 MainActivity 。並且覺得這就是 MVC 架構,實體類 Entity 就是 Model 層, Activity/Fragment 就是 Controller 層,布局文件就是 View 層。 但這當真是 MVC 嗎?其實並不是。不管是 MVC , MVP ,還是 MVVM ,都應該遵循一個最起碼的原則, 表現層和業務層分離 ,也就是 Android 官網給出的 中強調的 分離關注點 。 Activity/Fragment 既要承擔

必知必會-存儲器層次結構

相信大家一定都用過各種存儲技術,比如mysql,mongodb,redis,mq等,這些存儲服務性能有非常大的區別,其中之一就是底層使用的存儲設備不同。作為一個程序員,你需要理解存儲器的層次結構,這樣才能對程序的性能差別瞭然於心。今天帶大家了解下計算機系統存儲器的層次結構。 存儲技術 首先了解下什麼是存儲器系統? 實質上就是一個具有不同容量、成本和訪問時間的存儲設備的層次結構。從快到慢依次為:CPU寄存器、高速緩存、主存、磁盤; 這裏給大家介紹一組數據,讓大家有一個更清晰的認識: 如果數據存儲在CPU寄存器,需要0個時鐘周期就能訪問到,存儲在高速緩存中需要4~75個時鐘周期。如果存儲在主存需要上百個周期,而如果存儲在磁盤上,大約需要幾千萬個周期! -- 出自 CSAPP 接下來一起深入了解下計算機系統涉及的幾個存儲設備: 隨機訪問存儲器 隨機訪問存儲器(RAM)分為靜態RAM (SRAM) 和動態RAM(DRAM)。SRAM的速度更快,但也貴很多,一般不會超過幾兆字節,通常用來做告訴緩存存儲器。DRAM就是就是我們常說的主存。 訪問主存 數據流是通過操作系統中的總線的共享电子電路在處理器和DRAM之間來來回回。每次CPU和主存之間的數據傳送都是通過一系列複雜的步驟完成,這些步驟成為總線事務。讀事務是將主存傳送數據到CPU。寫事務從CPU傳送數據到主存。 總線是一組并行的導線,能攜帶地址、數據和控制信號。下圖展示了CPU芯片是如何與主存DRAM連接的。 那麼我們在加載數據和存儲數據時,CPU和主存到底是怎樣交互實現的呢? 首先來看一個基本指令,加載內存數據到CPU寄存器中: movq A,%rax 將地址A的內容加載到寄存器%rax中,這個命令會使CPU芯片上稱為總線接口(bus interface)的電路在總線上發起讀事務,具體分為三個步驟: CPU將地址A放到系統總線上,I/O橋將信號傳遞到內存總線。詳情看下下圖a 主存感覺到內存總線上的地址信號,從內存總線讀地址,從DRAM取出數據字,將其寫到內存總線。I/O橋將內存總線信號翻譯成系統總線信號,沿着系統總線傳遞到CPU總線接口。下圖b CPU感覺到系統總線上的數據,從總線上讀數據,並將數據複製到寄存器%rax

北京公用充電樁數量今年將破萬 實現手機支付

據北京市科委消息,截至2015年年底,北京共建成公用充電樁5008根,2016年將再建5000根。 日前,"電動社區"行動計畫暨北京市充電設施公共服務管理平臺(e充網)啟動,將選擇500家社區率先實現電源條件到車位,並在無充電樁安裝條件社區率先投放500台移動充電車。 北京市"電動社區"行動計畫對於三類情況不同的社區給出了三種解決方案:對於有固定停車位元且具備電容量的社區,遴選500家,率先實現電源條件到車位;對於無固定停車位的社區,鼓勵在公共管理區域率先建設公用充電樁;在無充電樁安裝條件的社區,將投放500台移動充電車,方便車主預約充電車到車位充電,其投放範圍覆蓋北京16區中包括老舊社區、保障房社區、大型居住社區等各類社區200個。 公用充電樁將實現手機支付 據e充網工作人員表示,目前e充網已經實現了北京地區建設運營商全納入,全市所有公用充電樁的位置與導航資訊均收入到了APP之中。 此外,在充電樁國標符合性改造的過程中,統一支付結算(支持支付寶、微信、銀聯)、即時資料更新、充電樁預約等功能也會同步實施,即充電樁升級一批,其即時資料、統一支付結算等功能便實現一批,到今年6月底,電動汽車車主可以從"多卡不通用"的困境中解放出來,用手機實現線上查詢支付等諸多功能。 e充網工作人員介紹,目前北京已有604根快充樁(直流樁)實現了統一支付結算、即時資料更新的功能。 本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理 【其他文章推薦】 ※帶您來了解什麼是  USB CONNECTOR   ? ※自行創業 缺乏曝光? 下一步" 網站設計 "幫您第一時間規劃公司的門面形象 ※如何讓商品強力曝光呢? 網頁設計公司 幫您建置最吸引人的網站,提高曝光率!! ※綠能、環保無空污,成為 電動車 最新代名詞,目前市場使用率逐漸普及化 ※廣告預算用在刀口上, 網站設計公司 幫您達到更多曝光效益 Orignal From: 北京公用充電樁數量今年將破萬 實現手機支付

012.Kubernetes二進制部署worker節點Flannel

一 部署flannel 1.1 安裝flannel kubernetes 要求集群內各節點(包括 master 節點)能通過 Pod 網段互聯互通。flannel 使用 vxlan 技術為各節點創建一個可以互通的 Pod 網絡,使用的端口為 UDP 8472。 flanneld 第一次啟動時,從 etcd 獲取配置的 Pod 網段信息,為本節點分配一個未使用的地址段,然後創建 flannedl.1 網絡接口(也可能是其它名稱,如 flannel1 等)。 flannel 將分配給自己的 Pod 網段信息寫入 /run/flannel/docker 文件,docker 後續使用這個文件中的環境變量設置 docker0 網橋,從而從這個地址段為本節點的所有 Pod 容器分配 IP。 更多flannel參考:《008.Docker Flannel+Etcd分佈式網絡部署》。 提示:k8smaster01節點已下載相應二進制,可直接分發至node節點。 1.2 分發flannel 1 [root@k8smaster01 ~]# cd /opt/k8s/work 2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh 3 [root@k8smaster01 work]# for node_ip in ${NODE_IPS[@]} 4 do 5 echo " >>> ${node_ip} " 6 scp flannel/{flanneld,mk-docker-opts.sh} root@${node_ip}:/opt/k8s/bin/ 7 ssh root@${node_ip} " chmod +x /opt/k8s/bin/* " 8 done 1.3 創建flannel證書和密鑰 提示:k8smaster01節點已創建flanneld的CA證書請求文件,可直接分發至node節點。 1.4 分發證書和私鑰 1

2016年電動車和插電式混合動力車銷量預計將超過70萬輛

中汽協日前預測,2016年全國電動汽車和插電式混合動力車的銷量預計將超過70萬輛,較2015年的銷量增長一倍。 2015年電動車和插電式混合動力車的合併銷量為331092輛,較2014年增長了340%。其中包括247482輛電動車和83610輛插電式混合動力車,在24萬輛多的電動汽車銷量中,包括146719輛乘用車,另有100763輛為商用車。插電式混合動力車的銷量中,60663輛為乘用車,22947輛為商用車。 根據2015年起草的藍圖,政府計畫到2020年在全國範圍內新建12000個充電站和480枚充電樁。2014年年底,全國共有780個充電站共31000枚充電樁。2015年政府還為27個省市自治區設定了電動車的最低銷量目標。 政府預計,這些措施到位後,自主品牌車企的電動車和插電式混合動力車銷量到2020年可達100萬輛,到2025年可達300萬輛。 本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理 【其他文章推薦】 ※為什麼 USB CONNECTOR 是電子產業重要的元件? ※ 網頁設計 一頭霧水??該從何著手呢? 找到專業技術的 網頁設計公司 ,幫您輕鬆架站! ※想要讓你的商品成為最夯、最多人討論的話題? 網頁設計公司 讓你強力曝光 ※想知道最厲害的 台北網頁設計公司推薦 、 台中網頁設計公司推薦 專業設計師"嚨底家"!! Orignal From: 2016年電動車和插電式混合動力車銷量預計將超過70萬輛

日問周刊 | 全棧面試匯總 | 第二期

勤學如春起之苗,不見其增,日有所長;輟學如磨刀之石,不見其損,日有所虧。 我在 github 上新建了一個倉庫 ,每天至少一個問題。有關全棧,graphql,devops,微服務以及軟技能,促進職業成長,歡迎交流。 以諸葛武侯的誡子書與君共勉 夫君子之行,靜以修身,儉以養德。非澹泊無以明志,非寧靜無以致遠。夫學須靜也,才須學也,非學無以廣才,非志無以成學。淫慢則不能勵精,險躁則不能治性。 年與時馳,意與日去,遂成枯落,多不接世,悲守窮廬,將復何及! 【Q037】linux 有哪些發行版,你最喜歡哪一個 原文鏈接,歡迎討論: 開放問題,不過你至少得知道一個發行版... 【Q036】http 狀態碼中 301,302和307有什麼區別 原文鏈接,歡迎討論: 301,Moved Permanently。永久重定向,該操作比較危險,需要謹慎操作:如果設置了301,但是一段時間后又想取消,但是瀏覽器中已經有了緩存,還是會重定向。 302,Fount。臨時重定向,但是會在重定向的時候改變 method: 把 POST 改成 GET,於是有了 307 307,Temporary Redirect。臨時重定向,在重定向時不會改變 method 【Q035】http 常見的狀態碼有哪些 原文鏈接,歡迎討論: 【Q034】如何實現一個 loading 動畫 原文鏈接,歡迎討論: 【Q033】如何對接口進行限流] 原文鏈接,歡迎討論: 一般採用漏桶算法: 漏桶初始為空 API 調用是在往漏桶里注水 漏桶會以一定速率出水 水滿時 API 拒絕調用 可以使用 redis 的計數器實現 計數器初始為空 API 調用計數器增加 給計數器設置過期時間,隔段時間清零,視為一定速率出水 計數器達到上限時,拒絕調用 當然,這隻是大致思路,這時會有兩個問題要注意 最壞情況下的限流是額定限流速率的2倍 條件競爭問題 不過實際實現時注意以下就好了(話說一般也是調用現成的三方庫做限流...),可以參考我以前的文章 【Q032】js 中什麼是 softbi

BMW i3小改版 續航力增48%

國際車商BMW推出的電動車i3是目前市面上體型最小的電動車款之一,續航力相對也較差。據傳,今年i3將進行部份改版,讓續航力從目前的81英哩(129公里)延長48%到120英哩(192公里)。 《自由時報》指出 ,BMW的市場及銷售主任Ian Robertson在接受媒體採訪時,表示i3今年將有小改版的計畫。但除了續航力之外,並未說明外型與其他設計是否會有更動。 i3 電動版目前最高時速為150公里,0至100公里加速時間為7.2秒,屬於性能較佳的房車。此外,i3有純電版與油箱版,當電池耗盡後可用9公升的油箱開車到充電樁地點。 (照片來源:BWM 官網) 本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理 【其他文章推薦】 ※ USB CONNECTOR 掌控什麼技術要點? 帶您認識其相關發展及效能 ※評比前十大 台北網頁設計 、 台北網站設計 公司知名案例作品心得分享 ※智慧手機時代的來臨, RWD網頁設計 已成為網頁設計推薦首選 ※評比 南投搬家公司費用 收費行情懶人包大公開 Orignal From: BMW i3小改版 續航力增48%

寒潮來襲,電動車撐不住?材料改良或為解方

北極震盪下,中國、台灣面臨數十年難得一見的低溫,連深圳與台北的平地都下起冰霰。這樣的天氣暴露出電動車的一大缺點──由於鋰電池在低溫環境下放電量不穩,因此電動車的續航力也大受挑戰。 根據美國AAA Automotive Research Center所做的研究,同一輛電動車在攝氏24度左右的溫度下可行駛約168公里,但在攝氏-6.7度左右時,行駛距離大幅縮減到只剩約69公里。而美國能源部及環保署的資料也載示,同樣在攝氏-6.7度的環境下,汽油車續航力會下降12%,但電動車會降低34%。 EnergyTrend鋰電池/電動車研究指出,同樣的問題也會發生在手機、平板等攜帶裝置上,主要的原因是鋰電池長時間處於寒冷環境下時,因化學反應不正常,會使放電電流變少,導致可用容量降低。若是攜帶式裝置,可將裝置帶在身上「保暖」,但電動車可不能如法炮製。 電動車近兩年來展望長紅,不只有Tesla、Faraday Future等新公司出現,保時捷、BMW、Audi、Nissan、Toyota、Ford、福斯汽車等國際車廠也紛紛推出電動車款,且銷售量持續攀升。尤其在霾害嚴重的中國,已正式將電動車列為重點發展項目。但在氣候的限制下,如何解決鋰電池的續航力降低問題,就成為一大議題。 從材料面、系統面解決 EnergyTrend調研團隊指出,中國雖然大力推動電動車,但仍以華中以南地區為推行主力,原因正在於東北、華北等地氣候太過嚴寒,不利於鋰電池與電動車行駛,不只電池容量會降低,汽車也會有無法發動的問題。 要解決此一問題,主要分成材料改良與系統改良。在材料方面,可改用更耐嚴寒氣候的電池材料;在系統方面,則又分成耐低溫零件以及低溫系統的使用。分析師指出,目前已有廠商針對電動車耐寒的議題提出相關技術。 以台灣電動機車Gogoro為例,Gogoro設計有高溫預防模式與低溫保護模式,在低溫狀況下,低溫保護模式啟用並使動力輸出降低,但騎乘一段時間後電池溫度就能慢慢回到正常。 目前相關技術仍在發展當中,但隨著電動車市場擴大,這將成為不得不跨越的一大難題。 (照片來源:Wikepedia) 本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我

Spring Security登錄驗證流程源碼解析

一、登錄認證基於過濾器鏈 Spring Security的登錄驗證流程核心就是過濾器鏈。當一個請求到達時按照過濾器鏈的順序依次進行處理,通過所有過濾器鏈的驗證,就可以訪問API接口了。 SpringSecurity提供了多種登錄認證的方式,由多種Filter過濾器來實現,比如: BasicAuthenticationFilter實現的是HttpBasic模式的登錄認證 UsernamePasswordAuthenticationFilter實現用戶名密碼的登錄認證 RememberMeAuthenticationFilter實現登錄認證的"記住我"的功能 SmsCodeAuthenticationFilter實現短信驗證碼登錄認證 SocialAuthenticationFilter實現社交媒體方式登錄認證的處理 Oauth2AuthenticationProcessingFilter和Oauth2ClientAuthenticationProcessingFilter實現Oauth2的鑒權方式 根據我們不同的需求實現及配置,不同的Filter會被加載到應用中。 二、結合源碼講解登錄驗證流程 我們就以用戶名、密碼登錄方式為例講解一下Spring Security的登錄認證流程。 2.1 UsernamePasswordAuthenticationFilter 該過濾器封裝用戶基本信息(用戶名、密碼),定義登錄表單數據接收相關的信息。如: 默認的表單用戶名密碼input框name是username、password 默認的處理登錄請求路徑是/login、使用POST方法 2.2 AbstractAuthenticationProcessingFilter的doFilter方法的驗證過程 UsernamePasswordAuthenticationFilter繼承自抽象類AbstractAuthenticationProcessingFilter,該抽象類定義了驗證成功與驗證失敗的處理方法。 2.3 驗證成功之後的Handler和驗證失敗之後的handler 也就是說當我們需要自定義驗證成功或失敗的處理方法時,要去實現Aut

[ASP.NET Core 3框架揭秘] 依賴注入[10]:與第三方依賴注入框架的適配

.NET Core具有一個承載(Hosting)系統,承載需要在後台長時間運行的服務,一個ASP.NET Core應用僅僅是該系統承載的一種服務而已。承載系統總是採用依賴注入的方式來消費它在服務承載過程所需的服務。對於承載系統來說,原始的服務註冊總是體現為一個 IServiceCollection 集合,最終的依賴注入容器則體現為一個 IServiceProvider 對象,如果要將第三方依賴注入框架整合進來,就需要利用它們解決從IServiceCollection集合到IServiceProvider對象之間的適配問題。 一、IServiceCollection =>ContainerBuilder=>IServiceProvider 具體來說,我們可以在IServiceCollection集合和IServiceProvider對象之間設置一個針對某個第三方依賴注入框架的 ContainerBuilder 對象。我們先利用包含原始服務註冊的IServiceCollection集合來創建一個ContainerBuilder對象,再利用該對象來構建作為依賴注入容器的IServiceProvider對象。 二、 IServiceProviderFactory<TContainerBuilder> 如上圖所示的兩種轉換是利用一個 IServiceProviderFactory<TContainerBuilder> 對象完成的。如下面的代碼片段所示,IServiceProviderFactory<TContainerBuilder>接口定義了兩個方法,其中 CreateBuilder 方法利用指定的IServiceCollection集合創建出對應的ContainerBuilder對象,而 CreateServiceProvider 方法則進一步利用這個ContainerBuilder對象創建出作為依賴注入容器的IServiceProvider對象。 public interface IServiceProviderFactory<TContainerBuilder> { TContainerBuilder CreateBuilder(IServiceCollection

.NET Core前後端分離快速開發框架(Core.3.0+AntdVue)

.NET Core前後端分離快速開發框架(Core.3.0+AntdVue) 目錄 引言 時間真快,轉眼今年又要過去了。回想今年,依次開源發布了 Colder.Fx.Net.AdminLTE(254Star) 、 Colder.Fx.Core.AdminLTE(335Star) 、 DotNettySocket(82Star) 、 IdHelper(47Star) ,這些框架及組件都是本着以實際出發,實事求是的態度,力求提高開發效率(我自己都是第一個使用者),目前來看反響不錯。但是隨着前端和後端技術的不斷變革,尤其是前端,目前大環境已經是前後端完全分離為主的開發模式,在這樣的大環境和必然趨勢之下,傳統的MVC就顯得有些落伍了。在這樣的背景下,一款前後端分離的.NET開發框架就顯得尤為必要,由此便定了框架的升級目標: 前後端分離 。 首先後端技術的選擇,從目前的數據來看,.NET Core的發展遠遠快於.NET Framework,最簡單的分析就是Colder.Fx.Core.AdminLTE發布比Colder.Fx.Net.AdminLTE晚,但是星星卻後來居上而且比前者多30%,並且這個差距在不斷擴大,由點及面的分析可以看出我們廣大.NET開發人員學習的熱情和积極向上的態度,並不是某些人所認為的那麼不堪( 走自己的路,讓別人說去吧 )。大環境上微軟积極擁抱開源,大力發展.NET Core, 可以說前途一片光明。因此後端決定採用 .NET Core3.0 ,不再浪費精力去支持.NET Framework。 然後是前端技術選擇,首選是三大js框架選擇,也是從實際出發,Vue相對其它而言更加容易上手,並且功能也毫不遜色,深得各種大小公司喜歡,如果偏要說缺點的話,那就是對TS支持不行,但是即將發布Vue3.0肯定會改變這一缺陷。選擇了Vue之後,然後就是UI框架的選擇了,這裏的選擇更多了,我選擇了Ant Design Vue,理由便是簡潔方便,十分符合我的設計理念。 技術選型完畢之後便

怎麼把CAT客戶端的RootMessageId記錄到每條日誌中?

什麼是RootMessageId? 為了理解RootMessageId先簡單介紹一下CAT的數據結構設計。CAT客戶端會將所有消息都封裝為一個完整的消息樹(MessageTree),消息樹可能包括Transaction、Event、Heartbeat、Metric等類型的消息。具體如下: Transaction:適合記錄跨越系統邊界的程序訪問行為,比如遠程調用,數據庫調用,也適合執行時間較長的業務邏輯監控,Transaction用來記錄一段代碼的執行時間和次數 Event:用來記錄一件事發生的次數,比如記錄系統異常,它和transaction相比缺少了時間的統計,開銷比transaction要小 Heartbeat:表示程序內定期產生的統計信息, 如CPU利用率, 內存利用率, 連接池狀態, 系統負載等 Metric:用於記錄業務指標、指標可能包含對一個指標記錄次數、記錄平均值、記錄總和,業務指標最低統計粒度為1分鐘 歡迎關注微信公眾號: 萬貓學社 ,每周一分享Java技術乾貨。 其中,Transaction類型的消息可作為消息樹節點,而其他消息只可作為消息樹的恭弘=叶 恭弘子節點,也就是Transaction是一個可嵌套的遞歸結構。比如: 消息樹的每一節點都有一個屬性messageId,用來唯一表示節點本身,其構成為:{domain}-{ip}-{timestamp}-{自增index}。另外還有兩個屬性,分別是parentMessageId, rootMessageId。parentMessageId表示父節點的messageId; rootMessageId 則表示整個消息樹的根節點的messageId。這兩個屬性在之後CAT的調用鏈分析與分佈式調用鏈分析中發揮了關鍵作用。 歡迎關注微信公眾號: 萬貓學社 ,每周一分享Java技術乾貨。 為什麼在日誌中記錄? 根據RootMessageId可以追蹤某一個請求的整個分佈式調用鏈,結合每一條日誌快速定位耗費性能的癥結,做針對性的性能優化。更加方便地做性能優化,特別是TP95、TP99等指標。 遇到偶爾發生的bug,是最讓人頭疼的,只有先從日誌中找線索,但是在海量的日誌中找到出現bug的那一個請求是很困難的。有了上游API提供的RootMessage

Android Debug 之 Log 最佳實踐

本文微信公眾號「AndroidTraveler」首發。 背景 在開發過程中,調試是必不可少的一項工作。 當我們要確定項目的邏輯時,當我們要了解界面的生命周期時,當我們發現新寫的邏輯與期望效果不一致時,當我們覺得數據有問題時...... 而調試有兩種方式: 第一種就是使用 debug 模式運行 APP,然後通過斷點讓程序運行到指定位置進行分析。 第二種就是打日誌的方式,通過觀察輸出來確定程序是否運行到該位置以及此時的數據。 本篇文章主要聚焦在第二種方式上面。 在 Android 裏面,打日誌使用的系統 API 是 Log,你以為直接使用就完了嗎? 封裝 假設你在需要打印日誌的地方直接使用系統的 API,那麼當遇到下面情況時,會「牽一發而動全身」。 場景一:如果我打印日誌要用三方庫的日誌 API,那麼我要查找項目所有使用位置,並一一替換。 場景二:如果我希望在開發環境下打印日誌,release 環境不打印,這個時候每個位置都需要單獨做處理。 因此我們需要在使用 Log 進行日誌打印之前,做一層封裝。 假設我們的類名字為 ZLog,代碼如下: import android.util.Log; /** * Created on 2019-10-26 * * @author Zengyu.Zhan */ public class ZLog { public static int v(String tag, String msg) { return Log.v(tag, msg); } public static int d(String tag, String msg) { return Log.d(tag, msg); } public static int i(String tag, String msg) { return Log.i(tag, msg); } public static int w(String tag, String msg) { return Log.w(tag, msg); } public sta