您好,登錄后才能下訂單哦!
android手機(jī)上的logcat會不斷的打印出日志。我們想要實現(xiàn)這樣一個目標(biāo):在網(wǎng)頁上顯示某個手機(jī)的logcat打印信息,就像這樣:
因為是logcat是動態(tài)實時不斷打印的,所以,不論多大的緩存都會被撐爆。所以,必須使用環(huán)形緩沖區(qū),覆蓋和重用日志緩沖區(qū)。如果日志打印過快,顯然會出現(xiàn)新舊日志堆疊的問題。但常規(guī)情形下,使用環(huán)形日志緩沖區(qū),都能收到比較好的實測效果。
接收日志的裝置(里邊放置環(huán)形緩沖容器logs,是一個列表,環(huán)形是通過放置邏輯實現(xiàn)的):
- public final class GetLogReceiver extends MultiLineReceiver {
- // 五和:環(huán)形緩沖區(qū)的容量大小
- private static final int MAX_LOG_COUNT = 3000;
- private List<String> logs;
- private int writePos = 0;
- public GetLogReceiver() {
- // 環(huán)形日志容器,留一條日志為空作為結(jié)束位置標(biāo)識
- logs = new ArrayList<String>(MAX_LOG_COUNT);
- for(int i=0; i<MAX_LOG_COUNT; i++) {
- logs.add(null);
- }
- }
- @Override
- public boolean isCancelled() {
- return false;
- }
- @Override
- public void processNewLines(String[] lines) {
- synchronized(logs) {
- for(String line : lines) {
- if(!line.trim().equals("")) {
- logs.set(writePos, line);
- writePos++;
- writePos = writePos % MAX_LOG_COUNT;
- }
- }
- logs.set(writePos, null);
- }
- }
- public List<String> getNextBatchLogs(int start, int count) {
- List<String> result = new ArrayList<String>();
- synchronized(logs) {
- int firstReadPos = start % MAX_LOG_COUNT;
- for(int i=0; i<count; i++) {
- readPos = (firstReadPos + i)%MAX_LOG_COUNT;
- if (logs.get(readPos) != null) {
- result.add(logs.get(readPos));
- } else {
- break;
- }
- }
- }
- return result;
- }
- }
getNextBatchLogs提供了2個參數(shù),一個是start,一個是count,前者表示網(wǎng)頁開始讀取日志的位置,后者表示網(wǎng)頁想要讀取日志的條數(shù)。通過這兩個參數(shù),網(wǎng)頁可以通過ajax前向獲取日志內(nèi)容。
運行l(wèi)ogcat的線程(核心代碼):
- public void run() {
- while(true) {
- try {
- String serialNumber = device.getSerialNumber();
- String runLogcatCmd = "logcat -v time";
- device.executeShellCommand(runLogcatCmd,
- LogReceiverManager.getInstance().getLogReceiver(serialNumber));
- } catch (TimeoutException e) {
- e.printStackTrace();
- } catch (AdbCommandRejectedException e) {
- // 五和:表明手機(jī)被拔掉了
- break;
- } catch (IOException e) {
- // 五和:adb不穩(wěn)定會拋此異常
- break;
- } catch (ShellCommandUnresponsiveException e) {
- e.printStackTrace();
- }
- // 每間隔1秒重試一次
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- if (isKilled) {
- break;
- }
- }
- }
這里,通過LogReceiverManager給每個手機(jī)維護(hù)一個日志緩存裝置,通過serialNumber可以獲取到GetLogReceiver對象。
原理很簡單,實現(xiàn)還是有點精巧的,因為代碼并不多,效果比較好。此logcat實時打印的功能,百度的MTC貌似現(xiàn)在還未提供。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。