Pour exécuter l'exécutable et obtenir la sortie en temps réel, je suis en utilisant le code suivant (avec String[] command = new String[]{"/a.out"};
):poignée Android sortie en temps réel de l'exécutable par EventBus (greenbot)
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();
}
}
La commande doit être exécutée à l'intérieur d'un service:
public class Service extends IntentService {
...
@Override
protected void onHandleIntent(Intent intent) {
String[] command = new String[]{"/a.out"};
Class.execute(command);
}
}
mais je ne reçois une ligne en sortie, rien de plus, mais il devrait être des centaines d'entre eux. Je l'ai déjà essayé sur mon ordinateur en remplaçant EventBus.getDefault().post(new MessageEvent(line+"\n"));
avec System.out.println(line);
et cela fonctionne très bien.
Informations complémentaires: poignées Abonné EventBus par:
@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();
}
et la télévision est un TextView: TextView tv = (TextView)findViewById(R.id.TextView);
Cette structure a été testée avec une méthode simple, qui dans la suite montré. Il a mis à jour le TextView et il y avait plus d'une ligne passée à TextView. Donc je suppose que ça doit être quelque chose dans ma méthode d'exécution.
public static void test() {
for(int i = 0; i<500000; i++)
EventBus.getDefault().post(new MessageEvent(i+"\n"));
}
Pourquoi l'EventBus ne passe qu'une ligne? Que puis-je changer pour obtenir le résultat attendu?
Edit: Changer onMessageEvent()
à:
public void onMessageEvent(MessageEvent event) {
Log.i("Activity",event.getMessage());
}
également une seule ligne.
Testé avec un autre exécutable, maintenant il fonctionne très bien, aucune idée pourquoi cela fonctionne maintenant?
Bien désolé, j'ai oublié d'ajouter ce que la télévision est, c'est un TextView (j'ai également ajouté l'information à la question). Je ne pense pas que ce soit le EventBus car une fonction fictive (juste une simple boucle) a réussi (plus d'infos en question). Mais je vais essayer dès que possible. – janonymous
J'ai essayé, mais au lieu de System.out.println j'ai utilisé Log.i(), aucune entrée de "Activity" dans mon logcat. – janonymous