編輯:關於Android編程
在我們日常的開發中,肯定是少不了要和 Log 打交道,回想一下我們是怎麼使用 Log 的:先定義一個靜態常量 TAG,TAG 的值通常是當前類的類名,然後在需要打印 Log 的地方,調用 Log.d(TAG, "要打印的內容")。每次新寫一個類,都要寫一個 TAG,這也就算了,最苦逼的是,項目一上線,還要手動去把每個 Log 注釋掉。。。
當然,有的同學可能要說,這又沒什麼,自己封裝一個 Log 不就行了。但是對新手來說,自己封裝有一定的難度,如果有現成的開源庫可以直接拿來用就好了。
Github 上的大牛當然也注意到了這個情況,於是開源日志庫 Logger 誕生了。
Logger 的 Github 主頁:https://github.com/orhanobut/logger
Logger 提供以下功能:
線程的信息 類的信息 方法的信息 將 JSON 文本人性化輸出 將換行符人性化輸出 簡潔的輸出 從日志跳轉到源碼Logger 與 原生 Log 最大的不同就是:Logger 打印出來的日志一目了然,引用下官方 Github 上的圖片,看下原生 Log 和 Logger 打印日志的區別:
原生 Log 打印的日志:
Logger 打印的日志:
可以看到,Logger 打印的日志把多余的日志全部忽略了,只顯示對我們有用的日志,而且還把日志框了起來,可以讓我們看得更舒服。不得不說,Logger 做的實在是太人性化了。
Logger 使用方法也不難,Logger 開源庫的 Github 主頁 寫了很詳細的使用方法,英文還過得去的同學可以直接去 Logger 主頁查看使用方法,有英文恐懼症的同學呢,可以通過這篇博客來學習下。
打開 Android Studio,新建 LoggerTest 項目。
在 LoggerTest / app/ build.gradle 中的 dependencies 中,導入依賴,代碼如下:
dependencies { compile 'com.orhanobut:logger:1.15' }
然後 Android Studio 應該會彈出 Sync Now,也就是箭頭 1 指向的位置,如圖:
如果彈出了 Sync Now,就點擊它,如果沒有彈出,就點擊箭頭 2 指向的選項。
等 Grade 構建完,我們就可以使用 Logger了。
Logger 的使用方法和原生 Log 差不多,我們先來嘗試下打印一個簡單文本。
修改 MainActivity.java 中的 onCreate() 方法,代碼如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Logger.d("執行了 onCreate"); }
咦,怎麼沒寫 TAG?其實,Logger 是有它自己默認的 TAG 的,默認的 TAG 是 PRETTYLOGGER,我們運行一下程序,看一下輸出日志:
我們可以看到,已經成功的將日志輸出了,而且比我們之前用的原生 Log 輸出的美觀多了,日志信息一目了然。箭頭指向的就是 Logger 默認的 TAG,所以如果你想讓 Logcat 只顯示你自己打印的日志,可以在日志過濾器中,將默認 TAG 添加進去。
或者直接在過濾框中添加:
Logger 還支持打印 JSON,XML 等格式的數據。
private String JSON_CONTENT = "{\"weatherinfo\":{\"city\":\"北京\",\"cityid\":\"101010100\"," + "\"temp\":\"18\",\"WD\":\"東南風\",\"WS\":\"1級\",\"SD\":\"17%\",\"WSE\":\"1\"," + "\"time\":\"17:05\",\"isRadar\":\"1\",\"Radar\":\"JC_RADAR_AZ9010_JB\"," + "\"njd\":\"暫無實況\",\"qy\":\"1011\",\"rain\":\"0\"}}"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Logger.json(JSON_CONTENT); }
private String XML_CONTENT = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Logger.xml(XML_CONTENT); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // List 類型數據 Listlist = new ArrayList<>(); list.add("hello"); list.add("world"); Logger.d(list); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Map 類型數據 Mapmap = new HashMap<>(); map.put("key_hello", "hello"); map.put("key_world", "world"); Logger.d(map); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Set 類型數據 Setset = new HashSet<>(); set.add(new String("hello")); set.add(new String("world")); Logger.d(set); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Logger.d("hello %s %d", "world", 5); }
如果你不滿意默認的 TAG,也可以自己定義一個 TAG,只需要調用一次 Logger.init() 就行了。因為只需要調用一次,所以可以在 Application 中來完成 Logger 的初始化。
新建 MyApplication 繼承 Application,代碼如下:
public class MyApplication extends Application { private static String TAG = "LoggerTest"; @Override public void onCreate() { super.onCreate(); Logger.init(TAG); } }
修改 AndroidManifest.xml 中 application 的屬性,添加 android:name=".MyApplication" ,AndroidManifest.xml 代碼如下:
這樣 App 啟動時,初始化的就是我們自定義的 MyApplication 了。然後我們在 MainActivity 的 onCreate() 中打印一下日志,看下自定義的 TAG 生效了沒。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Logger.d("hello world"); }
可以看到,我們自定義的 TAG 已經生效了。那麼有的同學可能會有疑問了,我要是不想一直用這個 TAG 呢,要是臨時想換個 TAG 用呢,當然也是有辦法的,調用 Logger.t("臨時TAG名").d() ,就能使用臨時的 TAG 打印日志了。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Logger.t("MyTag").d("hello world"); }
可以看到,臨時的 TAG 名被追加到自定義 TAG 的後面了。
之前說了,日志只是開發的時候需要用到,等到項目上線就不能用了。Logger 當然也考慮到了這一點,通過設置 Logger.init(TAG).logLevel(LogLevel.NONE) 可以設置為不打印日志。logLevel() 方法默認的參數是 LogLevel.FULL,也就是打印全部日志。修改 MyApplication 的 onCreate() 方法:
@Override public void onCreate() { super.onCreate(); Logger.init(TAG).logLevel(LogLevel.NONE); }
運行一下,可以發現 Logger 沒有打印日志。
Logger 打印 Exception,可以很清晰的看到 Exception 信息,這裡我們寫一個數組越界異常:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int[] a = new int[3]; try { a[4] = 3; } catch (Exception e) { Logger.e(e, "message"); } }
Logger 還有一些個性化設置,比如
Logger.init(TAG) .methodCount(3) // 方法棧打印的個數,默認是 2 .hideThreadInfo() // // 隱藏線程信息,默認顯示 .methodOffset(2) // 設置調用堆棧的函數偏移值,默認是 0 .logAdapter(new AndroidLogAdapter()); // 自定義一個打印適配器
有興趣的同學可以去 Logger 的 Github 主頁 查看Logger 的更多用法。
上周學習了高德地圖和極光推送的SDK,需要在項目中用到,不過學習起來還是費了一番功夫去看文檔和Demo代碼的。(不得不吐槽部分文檔真的無厘頭,只有簡單的實例程序注釋都沒有
公司的新產品上線需要添加的彈幕功能,於是花了一天時間寫了一個Demo。效果實現如下:一開始的思路是:1、首先實現一個自定義的Layout,在其中獲得需要展示的彈幕數組,每
- 這幾天在學習郭霖大神關於Android屬性動畫的博客,順便也總結總結那個那個冬天學習動畫的筆記,之所以說那個冬天,意義深刻,呵呵 屬性動畫是Android3.0之後推
handler在安卓開發中是必須掌握的技術,但是很多人都是停留在使用階段。使用起來很簡單,就兩個步驟,在主線程重寫handler的handleMessage( )方法,在
本人使用Win8系統時間久了系統垃圾一大堆 ,後來重裝了Win8系統,