0

このクラスを使用して、Android アプリで logcat を読み取り、一定期間、開始と停止を行いたいと考えています。start() を呼び出した後、機能し、いくつかのログが StringBuilder に追加されました。しかし、新しい logcat が来ることを確認するためにしばらく待った後、InputStream リーダーは新しいバイトを読み取ることができません。stop() を呼び出すと、StringBuilder に期待どおりのログがありません。

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class LogcatUtils {

    public static StringBuilder logcatSB;
    public static Thread thread;
    public static Process process;

    public static void start() {
        try {
            Runtime.getRuntime().exec("logcat -c");
            logcatSB = new StringBuilder();

            thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        process = Runtime.getRuntime().exec("logcat");
                        InputStream inputStream = process.getInputStream();
                        try {
                            ByteArrayOutputStream bo = new ByteArrayOutputStream();
                            byte[] buffer = new byte[32];
                            try {
                                while (true) {
                                    int read = inputStream
                                            .read(buffer, 0, 32);
                                    if (read == -1) {
                                        break;
                                    }
                                    bo.write(buffer, 0, read);
                                    bo.flush();
                                    logcatSB.append(bo.toString());
                                }
                            } finally {
                                bo.close();
                            }
                        } finally {
                            inputStream.close();
                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }, "logcatThread");
            thread.start();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void addPidFilter(long pid) {

    }

    public static void stop() {
        process.destroy();
        thread.interrupt();
        thread = null;
    }

    public static String getLog() {
        return logcatSB.toString();
    }
}
4

1 に答える 1