У меня проблема с записью собственного двоичного стандартного вывода в приложение для Android.Это мой упрощенный код:
String[] args = {"command", "arg1", "arg2"...};
ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectErrorStream(true);
Process p = pb.start();
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
final TextView textView = findViewById(R.id.logView);
//loop through stdout and output to textView until process p is exited
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
final String finalLine = line;
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.append(finalLine);
textView.append(System.getProperty("line.separator"));
}
});
}
reader.close();
Я беру стандартный вывод и просматриваю его в текстовом представлении.Этот код отлично работает на трех моих устройствах под управлением Android 4.x, 5.x и 6.x.Я могу просмотреть весь вывод, пока процесс не будет закрыт.Это не работает полностью на моем устройстве Android 8.x.На этом устройстве цикл for завершается преждевременно, и я получаю только первые несколько строк вывода, иногда строку больше.Тем не менее, сам процесс продолжает работать и отвечать, но больше нет выходных для журнала.Я прошил устройство Android 5.x на Android 7.1, и оно больше не регистрируется полностью, оно работает как мое устройство Android 8 с усеченным выводом.Похоже, что эта проблема имеет отношение к версии Android.
Вот некоторая информация logcat:
2018-10-28 11: 53: 52.608 7283-7812 / com.example.server W / art: длительный конфликт монитора с владельцем Thread-6 (7816) в int libcore.io.Posix.readBytes (java.io.FileDescriptor, java.lang.Object, int, int) (Posix.java:-2) waiters = 0 в пустом java.lang.UNIXProcess $ ProcessPipeInputStream.processExited () для 22,424 с
Почему этот код работает на версиях Android <7.x, но не на более поздних версиях?И как я могу это исправить, чтобы получить все выходные данные, пока процесс не завершится на Android 7.0 +? </p>