在尝试获取 php 输出时在 bufferedreader 中附加字符串时应用程序冻结

我正在尝试编写一个使用 php 二进制文件启动服务器的应用程序。但是,当我使用 BufferedReader 读取 /data/data/com.mycompany.myapp/php 的输出时,我的应用程序在 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();

}           

}

}


哔哔one
浏览 223回答 1
1回答

一只斗牛犬

进程在 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。
打开App,查看更多内容
随时随地看视频慕课网APP