Logcatが最後の行しか出力しないという苦情を誰かが見たことがあります。最後の行だけを出力するこの条件をどのように生成できるかという予備の質問をしたいと思います。
これは、スレッドを開始してログを読み取る方法です。
public class ReadLog implements Runnable{
private boolean running = true;
public void stop(){
running = false;
}
@Override
public void run() {
Process proc = null;
try {
//Runtime.getRuntime().exec("/system/bin/logcat -c");
proc = Runtime.getRuntime().exec("/system/bin/logcat ");
}catch(IOException e) {
e.printStackTrace();
}
if(proc != null){
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line= null;
try {
while((line=reader.readLine())!=null && running){
if(line.contains("specific word")){
doSomething();//do something base on log
running = false;
}
}
}
catch (IOException e) {
e.printStackTrace();
}
finally{
proc.destroy();
}
}
}
}
最新の行だけを読みたい。Runtime.getRuntime().exec("/system/bin/logcat -c");
問題は、実行を開始する前にログをクリアする行を追加しない限り、「特定の単語」が最後の行にない場合でも、doSomething()がトリガーされることです。
確かに、もう1つ追加while((line=reader.readLine())!=null && running){}
して、実行を開始する前にBufferedReaderを最後の行に移動させることができますが、時間がかかり、遅すぎる可能性があります。
私は試しましたが、stdinを受け入れRuntime.getRuntime().exec("/system/bin/logcat | tail -n 1");
ない運はありません。tail
stdoutの最後の行を。のようにすばやく出力するコマンドを求めていますtail -n 1 FILE
。