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 :

boucle infine qui bloque l'application, malgré l'utilisation de AsyncTask.


Sujet :

Android

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 40
    Points
    40
    Par défaut boucle infine qui bloque l'application, malgré l'utilisation de AsyncTask.
    Salut,
    Je souhaite réaliser une application qui lit en permanence les activités log. Pour cela, j'ai réaliser une petite application qui récupére le résultat de la commande "logcat -v time". Mais l'application "freeze" au bout de quelques secondes.
    Est-ce que il y a un moyen de réaliser ce travail ?
    Merci.

    Voici le code:
    Manifest:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ....
    <uses-permission android:name="android.permission.READ_LOGS" />
    ....
    source java:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    package logcloud.logsintotextfield;
     
    import android.os.AsyncTask;
    import android.os.Looper;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ScrollView;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class logsIntoTextfieldMainActivity extends AppCompatActivity {
        public EditText logsTextfieldId;
        public ScrollView logContainer;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_activity_logs_into_textfield);
     
            logsTextfieldId = (EditText) findViewById(R.id.logsTextfieldId);
            logContainer = (ScrollView)findViewById(R.id.logContainer);
     
            getLogs();
     
        }
     
        protected void getLogs() {
            GetLogs getLogs = new GetLogs(this);
            getLogs.execute();
        }
     
    }
     
    class GetLogs extends AsyncTask<Void, String, Void> {
        protected logsIntoTextfieldMainActivity context;
     
        public GetLogs(logsIntoTextfieldMainActivity _context){
            context = _context;
        }
     
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                Process process = Runtime.getRuntime().exec("logcat -v time");
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(process.getInputStream()));
     
                String line = "";
                while ((line = bufferedReader.readLine()) != null) {
                    publishProgress(line);
                }
            }
            catch (IOException e) {
            }
            return null;
        }
     
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            context.logsTextfieldId.append(values[0] + "\n");
            context.logContainer.post(new Runnable() {
                @Override
                public void run() {
                    context.logContainer.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
    }

  2. #2
    Membre actif Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Points : 245
    Points
    245
    Par défaut
    Hello,

    Ta fonction publishprogress fait quoi?
    De plus, peux-tu nous dire combien de fois cette fonction est appelé par seconde? J'aimerai savoir si le while s'effectue énormement ou si il est bloquant (si il attend une nouvelle ligne).

    Si il s'effectue trop souvent, il est normal que ca freeze car même si c'est fait en background, la boucle prend trop de proc

    GL HF

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    Je pense plutôt que c'est le composant EditText qui mange sévère sur le invalidate.

    En gros au bout de qqs kilos octets ça va commencer à ramer (temps de traitement exponentiel).

    Essaye plutôt de passer par une ListView avec un adapter.

    Tu vas devoir ruser en gérant une liste fixe pour ne garder que les N dernières entrées.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 40
    Points
    40
    Par défaut
    Altak: La mise à jour très rapide du TextView bloque l'application, je ne sais pas comment faire pour gérer cette rapidité.
    UbuntuMan: Je veux garder les logs pour une période (une semaine par exemple) si j'utilise sleep ou delay ou un Handler ça sera lourd.
    Je veux garder uniquement les logs de connexions: .*[CDS]connect.*
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
               String line = "";
                while ((line = bufferedReader.readLine()) != null) {
                    Pattern p = Pattern.compile(".*connect.*");
                    Matcher m = p.matcher(line);
                    if (m.matches())
                    //publishProgress(line);
                        System.out.println(line);
     
                }
    Quand je me connecte en local via pc: rien de s'affiche dans la console du debug, pourtant que la logcat affiche bien la connexion: "11-03 20:23:40.665 6830-6843/? I/System.out: [CDS]connect[/192.168.1.4:4444] tm:90"

    Alors là je suis perdu

Discussions similaires

  1. Problème de readLine() qui bloque mon application
    Par critok dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 15/08/2012, 21h20
  2. [WD11] Timer qui bloque application
    Par ivichou dans le forum WinDev
    Réponses: 11
    Dernier message: 29/04/2010, 08h14
  3. Méthode qui bloque l'application
    Par Mister Nono dans le forum Langage
    Réponses: 5
    Dernier message: 15/10/2008, 11h44
  4. les boucles qui bloquent l'application
    Par niouze dans le forum VB.NET
    Réponses: 5
    Dernier message: 18/07/2007, 08h51
  5. Boucle for qui se bloque
    Par Flophx dans le forum C
    Réponses: 67
    Dernier message: 25/03/2007, 14h14

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