Pourquoi «System.out.println» ne fonctionne-t-il pas sous Android?


192

Je veux imprimer quelque chose dans la console, afin de pouvoir le déboguer. Mais pour une raison quelconque, rien ne s'imprime dans mon application Android.

Comment déboguer alors?

public class HelloWebview extends Activity {
    WebView webview;    
    private static final String LOG_TAG = "WebViewDemo";
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        webview = (WebView) findViewById(R.id.webview);
        webview.setWebViewClient(new HelloWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebChromeClient(new MyWebChromeClient());
        webview.loadUrl("http://example.com/");    
        System.out.println("I am here");
    }

4
Bien que vous ayez votre réponse ci-dessous, je voudrais ajouter que la sortie des instructions SOP est également dirigée vers LogCat: seulement que le nom de la balise serait System.out
Samuh

1
Avant la 0.9 System.out a été perdu, je pense. Après avoir été transmis à la sortie logcat: code.google.com/p/android/issues/detail?id=92 . (Si vous utilisez une bibliothèque existante ou telle qui utilise System.out, bonne ou mauvaise, elle apparaîtra dans logcat avec les versions ultérieures d'Android.)
Charlie Collins

nous pouvons voir le System.out.printlns dans le logcat.
rDroid

Réponses:


213

Correction:

Sur l'émulateur et la plupart des appareils System.out.printlnsont redirigés vers LogCat et imprimés à l'aide de Log.i(). Cela peut ne pas être vrai sur les versions Android très anciennes ou personnalisées.

Original:

Il n'y a pas de console à laquelle envoyer les messages afin que les System.out.printlnmessages soient perdus. De la même manière, cela se produit lorsque vous exécutez une application Java "traditionnelle" avec javaw.

Au lieu de cela, vous pouvez utiliser la classe AndroidLog :

Log.d("MyApp","I am here");

Vous pouvez ensuite afficher le journal soit dans la vue Logcat dans Eclipse, soit en exécutant la commande suivante:

adb logcat

Il est bon de prendre l'habitude de regarder la sortie de logcat car c'est également là que les traces de pile de toutes les exceptions non interceptées sont affichées.

La première entrée à chaque appel de journalisation est la balise de journal qui identifie la source du message de journal. Ceci est utile car vous pouvez filtrer la sortie du journal pour n'afficher que vos messages. Pour vous assurer que vous êtes cohérent avec votre étiquette de journal, il est probablement préférable de la définir une fois comme static final Stringquelque part.

Log.d(MyActivity.LOG_TAG,"Application started");

Il existe cinq méthodes à une lettre Logcorrespondant aux niveaux suivants:

  • e() - Erreur
  • w() - Attention
  • i() - Information
  • d() - Déboguer
  • v() - Verbeux
  • wtf() - Quel terrible échec

La documentation dit ce qui suit sur les niveaux :

Verbose ne doit jamais être compilé dans une application, sauf pendant le développement. Les journaux de débogage sont compilés mais supprimés au moment de l'exécution. Les journaux d'erreur, d'avertissement et d'information sont toujours conservés.


30
En fait - System.out imprime sur LogCat via Log.i ().
kaspermoerch

7
@JosephEarl - N'hésitez pas à utiliser le bouton Modifier.
Dave Webb

10
il y a aussi Log.wtf () :-)
Zorb

2
System.out.println s'affiche dans Android Studio, sous Android Monitor. Ceux-ci sont affichés comme "I / System.out"
PVS

La nouvelle bibliothèque de compléments de la console est également très utile.
PaulMcG


14

Oui. Si vous utilisez l'émulateur, il s'affichera dans la vue Logcat sous la System.outbalise. Écrivez quelque chose et essayez-le dans votre émulateur.


2
En plus de cette réponse, gardez à l'esprit que parfois "quelque chose se passe" et qu'aucune entrée n'est imprimée avec l'utilisation de System.out. Si tel est le cas, essayez de fermer et de redémarrer l'émulateur. Cela a fonctionné pour moi.
Byron Gavras

2

Bien sûr, pour voir le résultat dans logcat, vous devez définir le niveau de journal au moins sur "Info" ( niveau de journal dans logcat ); sinon, comme cela m'est arrivé, vous ne verrez pas votre sortie.


2

si vous avez vraiment besoin de System.out.println pour fonctionner (par exemple, il est appelé depuis une bibliothèque tierce). vous pouvez simplement utiliser la réflexion pour changer le champ dans System.class:

try{
    Field outField = System.class.getDeclaredField("out");
    Field modifiersField = Field.class.getDeclaredField("accessFlags");
    modifiersField.setAccessible(true);
    modifiersField.set(outField, outField.getModifiers() & ~Modifier.FINAL);
    outField.setAccessible(true);
    outField.set(null, new PrintStream(new RedirectLogOutputStream()); 
}catch(NoSuchFieldException e){
    e.printStackTrace(); 
}catch(IllegalAccessException e){
    e.printStackTrace(); 
}

Classe RedirectLogOutputStream:

public class RedirectLogOutputStream extends OutputStream{
    private String mCache;

    @Override
    public void write(int b) throws IOException{
        if(mCache == null) mCache = "";

        if(((char) b) == '\n'){
            Log.i("redirect from system.out", mCache);
            mCache = "";
        }else{
            mCache += (char) b;
        }
    }
}

2

il n'est pas affiché dans votre application ... c'est sous le logcat de votre émulateur


1
Ceci est la toute première phrase de l'OP "Je veux imprimer quelque chose dans la console"
Farid

0

Il n'y a aucun endroit sur votre téléphone où vous pouvez lire System.out.println();

Au lieu de cela, si vous voulez voir le résultat de quelque chose, regardez votre logcat/consolefenêtre ou faites apparaître un Toastou un Snackbar(si vous êtes sur un appareil plus récent) sur l'écran de l'appareil avec le message :) C'est ce que je fais quand je dois vérifier par exemple où ça va dans un switch casecode! Amusez-vous à coder! :)


1
Quand je clique sur Android Monitoret puis logcat, je vois beaucoup de messages constamment imprimés ... Est-ce censé être comme ça? Alors, comment verrais-je mes propres messages de débogage?

Je fais juste défiler les autres choses et je les trouve: D
Valentin Filyov

0

System.out.println ("...") s'affiche sur le moniteur Android dans Android Studio


0

Je vais laisser cela à d'autres visiteurs car pour moi, c'était quelque chose à propos du fil principal qui était incapable de le faire System.out.println.

public class LogUtil {

private static String log = "";
private static boolean started = false;
public static void print(String s) {
    //Start the thread unless it's already running
    if(!started) {
        start();
    }
    //Append a String to the log
    log += s;
}

public static void println(String s) {
    //Start the thread unless it's already running
    if(!started) {
        start();
    }
    //Append a String to the log with a newline.
    //NOTE: Change to print(s + "\n") if you don't want it to trim the last newline.
    log += (s.endsWith("\n") )? s : (s + "\n");
}

private static void start() {
    //Creates a new Thread responsible for showing the logs.
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            while(true) {
                //Execute 100 times per second to save CPU cycles.
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //If the log variable has any contents...
                if(!log.isEmpty()) {
                    //...print it and clear the log variable for new data.
                    System.out.print(log);
                    log = "";
                }
            }
        }
    });
    thread.start();
    started = true;
}
}

Usage: LogUtil.println("This is a string");


0

Je n'ai pas d'IDE sophistiqué pour utiliser LogCat car j'utilise un IDE mobile.

J'ai dû utiliser diverses autres méthodes et j'ai les classes et les utilitaires que vous pouvez utiliser si vous en avez besoin.

  1. classe jav.android.Msg. Possède une collection de méthodes statiques. A: méthodes d'impression de TOASTS android. B: méthodes pour ouvrir une boîte de dialogue. Chaque méthode nécessite un contexte valide. Vous pouvez définir le contexte par défaut.

  2. Une manière plus ambitieuse, une console Android. Vous instanciez un handle vers la console dans votre application, ce qui déclenche la console (si elle est installée), et vous pouvez écrire dans la console. J'ai récemment mis à jour la console pour implémenter l'entrée de lecture de la console. Ce qui ne revient pas tant que l'entrée n'est pas reçue, comme une console ordinaire. R: Téléchargez et installez Android Console (obtenez-le de moi) B: Un fichier java est livré avec (jav.android.console.IConsole). Placez-le dans le répertoire approprié. Il contient les méthodes pour utiliser la console Android. C: Appelez le constructeur qui termine l'initialisation. D: lisez <*> et écrivez la console. Il y a encore du travail à faire. À savoir, comme OnServiceConnected n'est pas appelé immédiatement, vous ne pouvez pas utiliser IConsole dans la même fonction que vous l'avez instanciée.

  3. Avant de créer la console Android, j'ai créé la boîte de dialogue Console, qui était une boîte de dialogue fonctionnant dans la même application pour ressembler à une console. Pro: pas besoin d'attendre OnServiceConnected pour l'utiliser. Con: Lorsque l'application se bloque, vous ne recevez pas le message qui a planté l'application.

Étant donné que la console Android est une application distincte dans un processus distinct, si votre application se bloque, vous pourrez certainement voir l'erreur. De plus, IConsole définit un gestionnaire d'exceptions non interceptées dans votre application au cas où vous n'aimeriez pas la gestion des exceptions. Il imprime à peu près les traces de pile et les messages d'exception dans la console Android. Enfin, si la console Android tombe en panne, elle vous envoie son stacktrace et ses exceptions et vous pouvez choisir une application pour la lire. En fait, AndroidConsole n'est pas obligé de planter.

Modifier les extras J'ai remarqué que mon alors APK Builder n'a pas de LogCat; AIDE le fait. Ensuite, j'ai réalisé un pro de l'utilisation de ma console Android de toute façon.

  1. La console Android est conçue pour n'occuper qu'une partie de l'écran, afin que vous puissiez voir à la fois votre application et les données émises par votre application vers la console. Cela n'est pas possible avec AIDE. Je veux donc toucher l'écran et voir les coordonnées, la console Android rend cela facile.

  2. La console Android est conçue pour apparaître lorsque vous y écrivez.

  3. La console Android se masquera lorsque vous rétro-appuyez.


-5

Récemment, j'ai remarqué le même problème dans Android Studio 3.3. J'ai fermé les autres projets de studio Android et Logcat a commencé à travailler. La réponse acceptée ci-dessus n'est pas du tout logique.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.