国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android gradle插件打印時間戳的方法詳解

2019-10-21 21:38:21
字體:
來源:轉載
供稿:網友

Android中時間戳的詳細解釋:

(1).定義: 

時間戳就是根據當前系統時間生成的一組隨機數字。 

(2).作用: 

作為對數據唯一性的一種判斷依據。避免了重復修改數據所帶來的錯誤! 

(3).應用: 

(1).在銀行account表中建立時間戳字段timestamp,設定為文本類型varchar。 

(2).當銀行A讀取account表中的存款字段時,同時也讀取時間戳字段,比如123456。 

(3).當銀行A修改完存款數值后,進行存盤操作時,將先前讀取的時間戳123456與當時表中的時間戳進行一次對比,如果一致,那么允許存盤,然后生成一個新的時間戳比如456789替換表中原有的時間戳123456。 
若沒有使用時間戳: 

銀行A和銀行B同時打開你的賬戶,看到的金額都是1000元。與此同時,兩個銀行讀取的時間戳都是12345. 

若使用時間戳: 

當銀行A打開賬戶的時候,把1000元改成1500元,存盤,系統將對比先前的時間戳與存盤時表中的時間戳是否一致,現在一致,允許存盤。存盤時,將生成了一個新的時間戳45678。B銀行也將1000元修改成了1500元,存盤,系統對比先前的時間戳123456是否與存盤時表中的時間戳一致,發現先前的時間戳123456已經與現在的時間戳456789相異,系統拒絕存盤,要求刷新數據,那么數據刷新之后1000元已經因為之前A銀行存入了500元而成為了1500元,那么B銀行就會在1500元的基礎上改為2000元,再次存盤,系統允許. 

簡而言之:就是在操作的時候,通過對比修改之前的數據表中的時間戳與修改之后的數據表中的時間戳是否一致。

若一致,允許存儲,同時生成一個新的時間戳。 

若不一致,就要求刷新數據,在新的數據上進行修改。再次存儲。

引言

在性能調優時經常要打印函數執行時間、參數值等, 為了調試加了很多代碼,調完后還要刪掉, 這個事很繁瑣。 我們可以用Android Profiler或methodtracing打印函數執行時間,但日志太多了且缺少參數值。所以JakeWharton寫了個hugo庫, 是用AspectJ實現的,基于AOP思想。 我看了hugo源碼,總共四個文件左右,代碼量很少。
我想做個同功能的插件,順便學習一下gradle插件制作方法和字節碼注入。

用法很簡單,參考https://github.com/brycegao/TimePlugin/tree/master/demo

項目build.gradle文件里添加classpath和maven。

buildscript { repositories {google()jcenter()maven { url "https://dl.bintray.com/brycegmail/maven" }}dependencies {classpath 'com.android.tools.build:gradle:3.1.3'classpath 'com.brycegao.timeplugin:timeplugin:1.0.4'// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}}allprojects {repositories {google()jcenter()maven { url "https://dl.bintray.com/brycegmail/maven" }}}task clean(type: Delete) {delete rootProject.buildDir}

在app模塊的build.gradle文件添加

apply plugin: 'timeplugin'...implementation 'com.brycegao.tpannotation:tpannotation:1.0.2'

在想打印日志的類或方法前添加注解@DebugLogger即可,用法參照hugo實現的。

@DebugLoggerpublic class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);showMsg(1, "this is test");findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() {@Override public void onClick(View view) {Intent intent = new Intent(MainActivity.this, SecondActivity.class);startActivity(intent);}});}private void showMsg(int i, String msg) {try {Thread.sleep(100); //僅僅為了測試} catch (Exception ex) {ex.printStackTrace();}}@Override public void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);}}

運行程序:

Android,gradle,打印,時間戳

原理:

注解的作用表示要修改哪個函數, gradle插件的作用是遍歷.class, Javassist是字節碼注入工具。
在編譯期間進行字節碼注入, 打開./app/build/intermediates/classes/debug/transforms/TPTransform/1目錄可以看到修改后的字節碼。

Android,gradle,打印,時間戳

優點:在編譯期間注入業務邏輯代碼,比在源碼里加log更方便,不用feature時只要配置gradle 插件不參與編譯即可。

展望:在編譯期間加日志只是一個點, 還可以實現很多其它業務邏輯。

完整代碼:https://github.com/brycegao/TimePlugin 求star

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尚义县| 博客| 惠来县| 丹江口市| 达孜县| 渭南市| 绥中县| 东港市| 韶山市| 噶尔县| 南通市| 郴州市| 新郑市| 闽清县| 正镶白旗| 松江区| 南木林县| 嘉禾县| 道孚县| 朝阳市| 宜丰县| 玉门市| 泌阳县| 保靖县| 铁力市| 宜川县| 沧州市| 淮南市| 孟津县| 五寨县| 建湖县| 江西省| 巴东县| 吴堡县| 定安县| 贵港市| 鹿泉市| 平江县| 黄陵县| 彭阳县| 武清区|