0

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?

Répondre

0

Ne passe-t-il qu'une seule ligne? Il semble que votre tout le texte annexant en une seule ligne en faisant cela ->tv.append(event.getMessage());

Dans votre méthode onMessageEvent() essayer de System.out.println(event.getMessage()); d'affirmer si le problème est vraiment de EventBus.

+0

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

+0

J'ai essayé, mais au lieu de System.out.println j'ai utilisé Log.i(), aucune entrée de "Activity" dans mon logcat. – janonymous