为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
哔哔one 2023-06-24 17:25:50
我正在尝试编写一个使用 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();}           }}
查看完整描述

1 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

进程在 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。


查看完整回答
反对 回复 2023-06-24
  • 1 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信