IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

appel de ProcessBuilder en boucle


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Points : 52
    Points
    52
    Par défaut appel de ProcessBuilder en boucle
    Bonjour,
    je fais face depuis plusieurs semaines à un problème plutôt embêtant que je n'arrive pas à résoudre:

    J'appel via un AlarmManager un BroadcastReceiver chargé de récupérer la date de dernière action utilisateur. Pour le teste j'ai simplement fait une boucle d'appel à la fonction donc je ne m'attarde pas la dessus.

    Pour ce faire, j'utilise un shell en root (l'app ne tournera que sur un type précis de tablette qui est root à la sortie de l'usine)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new ProcessBuilder("su", "-c", "dumpsys power").start();
    je récupère les streams et les traite pour récupérer l'info que je recherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while ( (line = br.readLine()) != null) {
        if(line.contains("mLastUserActivityTime=")){
            line = line.substring(line.indexOf("(") + 1, line.indexOf("ms") - 1);
            _last = Double.valueOf(line.trim());
        }
    }
    Et tout fonctionne très bien, les 3058 premières fois... (bon ok ça représente plus de 2 jours de fonctionnement mais j'ai besoin de le laisser tourner bien plus longtemps que cela)
    Si je tue l'application à la 1000eme boucle et que je la relance elle bloquera à 2058.
    De plus, lorsqu'elle est bloquée, elle bloque également d'autres application ROOT tel que ADB WIFI, je dois redémarrer la tablette pour pouvoir l'utiliser de nouveau.

    Du coup j'ai 2 questions:
    -Y a-t-il un autre moyen de récupérer cette valeur sachant que l'utilisateur n'utilise pas une application particulière mais celle qu'il veut?
    -Si non, faut-il faire quelque chose de spécial lors de l'utilisation de ProcessBuilder pour libérer une ressource ou autre?


    Voici le code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    class StreamGobbler extends Thread{
        InputStream is;
        String type;
        double _last;
     
        StreamGobbler(InputStream is, String type){
            this.is = is;
            this.type = type;
        }
     
        public void run(){
            try{
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line=null;
                while ( (line = br.readLine()) != null) {
                    if("INPUT".equals(type) && line.contains("mLastUserActivityTime=")){
                        line = line.substring(line.indexOf("(") + 1, line.indexOf("ms") - 1);
                        _last = Double.valueOf(line.trim());
                    }
                    if("ERROR".equals(type))
                        System.out.println(type + ">" + line);
                }
            } catch (IOException ioe){
                ioe.printStackTrace();
            }
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public double getTime() {
            Process p;
            try {
                p = new ProcessBuilder("su", "-c", "dumpsys power").start();
                StreamGobbler gobIn = new StreamGobbler(p.getInputStream(), "INPUT");
                gobIn.start();
                StreamGobbler gobError = new StreamGobbler(p.getErrorStream(), "ERROR");
                gobError.start();
                if(p.waitFor()==0)
                    _last = gobIn._last;
                System.out.println("Exit > "+_last/1000);
            }catch (Exception ex){
                ex.printStackTrace();
                return _last;
            }
            return _last;
        }

  2. #2
    Membre du Club
    Homme Profil pro
    Flutter/java/windev/php/javascript
    Inscrit en
    Octobre 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Flutter/java/windev/php/javascript
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 87
    Points : 52
    Points
    52
    Par défaut
    J'ai pensé à une limitation du buffer comme indiqué dans la doc, j'ai donc changé la commande (ls et autre pour les tests) mais je suis toujours bloqué à 3058 subprocess...
    Je l'ai également traduit en Kotlin pour voir si ça changeait quelque chose mais c'est exactement la même chose. J'avais très peu d’espoir mais je tombe à court d'idées :/

    j'ai tenté de fermer les stream, de détruire le process (p.destroy()) mais rien ne change...

    je viens de tester également d'activer / désactiver ADB Wifi via l'app 20 fois histoire de voir avant de lancer mon test. je ne tombe plus à 3058 mais à 3038...


    y aurait il une limite caché dans Androïd au nombre de processus exécutable avant redémarrage de la tablette? O.o

Discussions similaires

  1. [FAQ] Comment attribuer à des objets un onclick faisant appel à une variable de boucle ?
    Par Watilin dans le forum Contributions JavaScript / AJAX
    Réponses: 1
    Dernier message: 09/12/2017, 16h48
  2. [AJAX] Appels non désirés en boucle de l'URL avec IE
    Par Gaadek dans le forum jQuery
    Réponses: 0
    Dernier message: 14/09/2015, 16h50
  3. Appel de procédure et boucle for
    Par bruno_nono dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 14/01/2014, 17h22
  4. [AJAX] Appel Ajax dans une boucle Php
    Par mycha25 dans le forum AJAX
    Réponses: 1
    Dernier message: 30/03/2012, 12h33
  5. [XL-2002] Appel macro dans une boucle
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/02/2010, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo