Зависание приложения при добавлении строки в bufferedreader при попытке получить вывод php - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь закодировать приложение, которое запускает сервер, используя php двоичный файл. Однако, когда я читаю вывод из /data/data/com.mycompany.myapp/php с помощью BufferedReader, мое приложение зависает при добавлении строк вывода в оператор while. Как это исправить?

as.copy("php", new File("/data/data/com.mycompany.myapp"));
Runtime.getRuntime().exec("/system/bin/chmod 744 /data/data/com.mycompany.myapp/php");
new File("/data/data/com.mycompany.myapp/php").setExecutable(true);
new File("/sdcard/PocketMine-MP/PocketMine-MP.phar").setExecutable(true);
Runtime.getRuntime().exec("/system/bin/chmod -R 777 /sdcard/PocketMine-MP");
        
String[] startserver = {"/data/data/com.mycompany.myapp/php","/sdcard/PocketMine-MP/PocketMine-MP.phar","eng"};
final ProcessBuilder processbuilder = new ProcessBuilder(startserver);
processbuilder.directory(new File("/data/data/com.mycompany.myapp"));
processbuilder.environment().put("TMPDIR","/sdcard/PocketMine-MP/tmp");
processbuilder.redirectErrorStream();
        
java.lang.Process process = processbuilder.start();
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8")); 
        
StringBuilder builder = new StringBuilder();
while(br.readLine() != null){
    builder.append(br.readLine()+"\n");
}
t.append(builder);
}catch(Exception e){
    Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_LONG).show();
}           
}
}

1 Ответ

0 голосов
/ 25 июня 2020

Причина, по которой процесс явно приостанавливается через некоторое время после ProcessBuilder.start (), часто связана с тем, что ваше приложение не использует потоки stdout и stderr по мере их создания. Вы можете быстро проверить это, направив их в файл и прочитав из файлов после завершения proc.waitFor. Добавьте:

File outf = new File(TEMPDIR, "run.out");
File errf = new File(TEMPDIR, "run.err");
pb.redirectOutput(outf);
pb.redirectError(errf);

Если это сработает, продолжайте использовать перенаправление файлов или настройте Runnable / Thread для использования обоих getInputStream / getErrorStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...