要运行可执行文件并获取实时输出,我使用以下代码(使用String[] command = new String[]{"/a.out"};
):
public static void execute(String... command) {
try {
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
final Process proc = builder.start();
new Thread(new Runnable() {
public void run() {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
EventBus.getDefault().post(new MessageEvent(line+"\n"));
}
} catch (Exception e) {
// TODO
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
// ignore
}
}
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
该命令应在服务中执行:
public class Service extends IntentService {
...
@Override
protected void onHandleIntent(Intent intent) {
String[] command = new String[]{"/a.out"};
Class.execute(command);
}
}
但我只得到一行作为输出,仅此而已,但它应该是数百行。我已经在我的计算机上尝试了将EventBus.getDefault().post(new MessageEvent(line+"\n"));
替换为System.out.println(line);
并且它运行正常。
其他信息:订阅者通过以下方式处理EventBus:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
tv.append(event.getMessage());
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
电视是TextView:TextView tv = (TextView)findViewById(R.id.TextView);
使用简单的方法测试该结构,如下所示。它更新了TextView,并且有多行传递给TextView。所以我想它必须是我执行方法中的内容。
public static void test() {
for(int i = 0; i<500000; i++)
EventBus.getDefault().post(new MessageEvent(i+"\n"));
}
为什么EventBus只通过一行?我可以改变什么来获得预期的结果?
修改:将onMessageEvent()
更改为:
public void onMessageEvent(MessageEvent event) {
Log.i("Activity",event.getMessage());
}
也只是一行。
用另一个可执行文件测试它,现在它工作得很好,任何想法为什么它现在可以工作?
答案 0 :(得分:0)
它只通过一条线吗?看起来你通过这样做将所有文本附加到一行 - &gt; tv.append(event.getMessage());
在onMessageEvent()
方法中,尝试System.out.println(event.getMessage());
断言问题是否真的来自EventBus。