Как я могу прочитать logcat только для последней строки?

Я видел, как кто-то жаловался на то, что 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();
                }
            }
        }
    }

Я хочу прочитать только самую новую строку. Проблема в том, что это вызовет doSomething(), даже если «конкретное слово» не находится в последней строке, если я не добавлю Runtime.getRuntime().exec("/system/bin/logcat -c"); строку для очистки журнала перед запуском.

Это правда, что я могу добавить еще один while((line=reader.readLine())!=null && running){}, чтобы позволить BufferedReader перейти к последней строке перед запуском, но это может занять много времени и слишком поздно.

Я пробовал Runtime.getRuntime().exec("/system/bin/logcat | tail -n 1"); Но не повезло, что tail не принимает стандартный ввод. Я прошу любую команду, которая быстро выводит последнюю строку stdout, как tail -n 1 FILE.


person Yeung    schedule 16.04.2012    source источник


Ответы (1)


попробуй Runtime.getRuntime().exec("/system/bin/logcat -d | tail -n 1");

Согласно документации logcat -> -d : «Выводит журнал на экран и выходит».

Затем readline вернет последнюю новую строку. (Я не тестировал).

ИЗМЕНИТЬ:

На самом деле | tail -n 1 не имеет никакого эффекта с "exec", но с "-d" вы можете легко получить последнюю строку журнала.

try {
    //Executes the command.
    Process process = Runtime.getRuntime().exec(
        "/system/bin/logcat -d");

    BufferedReader reader = new BufferedReader(
        new InputStreamReader(process
        .getInputStream()));

    String output;
    String lastLine = null;
    while ((output = reader.readLine()) != null) {
        lastLine = output;
    }
    reader.close();

    //Waits for the command to finish.
    process.waitFor();

    if(lastLine != null)
        System.out.println("Last log line : " + lastLine);
} catch (IOException e) {
    throw new RuntimeException(e);
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}

Не забудьте добавить разрешение READ_LOGS в свой манифест:

<uses-permission android:name="android.permission.READ_LOGS" />
person Duffydake    schedule 11.05.2012
comment
Я старался. Нет ничего другого без -d. Единственная разница в том, что процесс завершится или нет. - person Yeung; 24.05.2012
comment
Мое первое решение не работает, но я сделал новое решение, которое работает для меня на Android 2.3.3, я надеюсь, что это может решить вашу проблему, извините, я не видел, что вы уже протестировали это, я не могу вам помочь, это единственный способ, который я нашел - person Duffydake; 26.05.2012