本人在使用UiAutomator的時候,想多寫一個自動收集手機log的方法,使用runtime類執行了adb logcat的方法,可是一直找不到好的方法結束這個線程,網上說有kill pid的,可是這個操做起來略微麻煩了。本身也想了一個destroy線程的方法,一直很差用。提示錯誤信息以下:java
Exception in thread "main" java.lang.NoSuchMethodError at java.lang.Thread.destroy(Thread.java:990) at monkeytest.Monkey.main(Monkey.java:15)
緣由是由於:destroy()方法會摧毀線程,可是runtime使用中新建了一個子線程,因此纔會報錯。 後來本身想了一個辦法,在去讀input流的時候,多加一個參數來寫一個stop的方法。下面是logcat的類代碼,分享出來,供你們參考。其中一個destroy的方法得直接去結束process線程,若是子線程在運行的時候,直接調用destroy方法,就會報上面的那個錯誤。這個是本身總結的,若有錯誤還請指正。編程
package monkeytest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import source.Common; public class Logcat extends Thread { private static boolean LogKey = false; @Override public void run() { execCmdAdb("adb logcat -c"); execCmdAdb("adb logcat", "logcat.log", "happyjuzi", true); } /** * 執行adb命令 * * @param cmd * 命令內容 * @param fileName * 輸入文件路徑 * @param filter * 過濾詞彙 * @param key * 是否包含過濾詞彙 */ private void execCmdAdb(String cmd, String fileName, String filter, boolean key) { System.out.println(cmd); String OSname = System.getProperty("os.name"); try { Process p = null; if (OSname.contains("Mac")) { p = Runtime.getRuntime().exec(Common.ADB_PATH + cmd); } else { p = Runtime.getRuntime().exec("cmd /c " + cmd); } // 正確輸出流 InputStream input = p.getInputStream();// 建立並實例化輸入字節流 BufferedReader reader = new BufferedReader(new InputStreamReader(input));// 先經過inputstreamreader進行流轉化,在實例化bufferedreader,接收內容 String line = ""; while ((line = reader.readLine()) != null) {// 循環讀取 if (LogKey) { p.destroy();//結束線程 reader.close();// 此處reader依賴於input,應先關閉 input.close(); return; } // System.out.println(line);// 輸出 if (key) { if (line.contains(filter)) { Common.getInstance().saveToFile(line, fileName, false);// 保存 } } else { if (!line.contains(filter)) { Common.getInstance().saveToFile(line, fileName, false);// 保存 } } } reader.close();// 此處reader依賴於input,應先關閉 input.close(); // 錯誤輸出流 InputStream errorInput = p.getErrorStream();// 建立並實例化輸入字節流 BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorInput));// 先經過inputstreamreader進行流轉化,在實例化bufferedreader,接收內容 String eline = ""; while ((eline = errorReader.readLine()) != null) {// 循環讀取 if (LogKey) { p.destroy(); errorReader.close();// 此處有依賴關係,先關閉errorReader errorInput.close(); return; } if (key) { if (eline.contains(filter)) { Common.getInstance().saveToFile(line, fileName, false);// 保存 } } else { if (!eline.contains(filter)) { Common.getInstance().saveToFile(line, fileName, false);// 保存 } } } errorReader.close();// 此處有依賴關係,先關閉errorReader errorInput.close(); } catch (IOException e) { Common.getInstance().output("執行" + cmd + "失敗!"); e.printStackTrace(); } } private void execCmdAdb(String cmd) { System.out.println(cmd); String OSname = System.getProperty("os.name"); try { if (OSname.contains("Mac")) { Runtime.getRuntime().exec(Common.ADB_PATH + cmd); } else { Runtime.getRuntime().exec("cmd /c " + cmd); } } catch (IOException e) { Common.getInstance().output("執行" + cmd + "失敗!"); e.printStackTrace(); } } public void stopLoacat() { Logcat.LogKey = true; } }
多線程實現:json
package monkeytest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Date; import source.Common; public class Logcat extends Thread { private static boolean LogKey = false; @Override public void run() { execCmdAdb("adb logcat -c"); execCmdAdb("adb logcat", "logcat" + getNow() + ".log"); } /** * 執行adb命令 * * @param cmd * 命令內容 * @param fileName * 輸入文件路徑 * @param filter * 過濾詞彙 * @param key * 是否包含過濾詞彙 */ private void execCmdAdb(String cmd, String fileName) { System.out.println(cmd); String OSname = System.getProperty("os.name"); try { Process p = null; if (OSname.contains("Mac")) { p = Runtime.getRuntime().exec(Common.ADB_PATH + cmd); } else { p = Runtime.getRuntime().exec("cmd /c " + cmd); } // 正確輸出流 InputStream input = p.getInputStream();// 建立並實例化輸入字節流 BufferedReader reader = new BufferedReader(new InputStreamReader(input));// 先經過inputstreamreader進行流轉化,在實例化bufferedreader,接收內容 String line = ""; while ((line = reader.readLine()) != null) {// 循環讀取 if (LogKey) { p.destroy();// 結束線程 reader.close();// 此處reader依賴於input,應先關閉 input.close(); return; } // System.out.println(line);// 輸出 if (line.contains("happyjuzi")) { Common.getInstance().saveToFile(line, fileName, false);// 保存 } } reader.close();// 此處reader依賴於input,應先關閉 input.close(); // 錯誤輸出流 InputStream errorInput = p.getErrorStream();// 建立並實例化輸入字節流 BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorInput));// 先經過inputstreamreader進行流轉化,在實例化bufferedreader,接收內容 String eline = ""; while ((eline = errorReader.readLine()) != null) {// 循環讀取 if (LogKey) { p.destroy(); errorReader.close();// 此處有依賴關係,先關閉errorReader errorInput.close(); return; } if (eline.contains("happyjuzi")) { Common.getInstance().saveToFile(line, fileName, false);// 保存 } } errorReader.close();// 此處有依賴關係,先關閉errorReader errorInput.close(); } catch (IOException e) { Common.getInstance().output("執行" + cmd + "失敗!"); e.printStackTrace(); } } private void execCmdAdb(String cmd) { System.out.println(cmd); String OSname = System.getProperty("os.name"); try { if (OSname.contains("Mac")) { Runtime.getRuntime().exec(Common.ADB_PATH + cmd); } else { Runtime.getRuntime().exec("cmd /c " + cmd); } } catch (IOException e) { Common.getInstance().output("執行" + cmd + "失敗!"); e.printStackTrace(); } } /** * 中止logcat線程 */ public void stopLoacat() { Logcat.LogKey = true; } /** * 獲取當前時間 * * @return 返回當前時間,只有日期和小時和分數沒有年份和秒數 */ private String getNow() { Date time = new Date(); SimpleDateFormat now = new SimpleDateFormat("MMdd-HHmm"); String c = now.format(time); return c; } }