Android通过EventBus(greenbot)

时间:2017-07-12 13:32:23

标签: java android executable android-intentservice greenrobot-eventbus

要运行可执行文件并获取实时输出,我使用以下代码(使用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());
}

也只是一行。

用另一个可执行文件测试它,现在它工作得很好,任何想法为什么它现在可以工作?

1 个答案:

答案 0 :(得分:0)

它只通过一条线吗?看起来你通过这样做将所有文本附加到一行 - &gt; tv.append(event.getMessage());

onMessageEvent()方法中,尝试System.out.println(event.getMessage());断言问题是否真的来自EventBus。