web-dev-qa-db-fra.com

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

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 puis-je 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");
    }
170
TIMEX

Correction:

Sur l'émulateur et la plupart des périphériques, System.out.println est redirigé vers LogCat et imprimé avec Log.i(). Cela peut ne pas être vrai sur les versions très anciennes ou personnalisées d'Android. 

Original:

Il n’existe pas de console où envoyer les messages, les messages System.out.println sont donc perdus. De la même manière, cela se produit lorsque vous exécutez une application Java "traditionnelle" avec javaw.

À la place, vous pouvez utiliser la classe Android Log :

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

Vous pouvez ensuite afficher le journal dans la vue Logcat dans Eclipse ou 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 sont affichées les traces de pile de toutes les exceptions non interceptées.

 

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

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

Il existe cinq méthodes à une lettre dans Log correspondant aux niveaux suivants:

  • e() - Erreur
  • w() - Warning
  • i() - Information
  • d() - Debug
  • v() - Verbose
  • wtf() - Quel terrible échec

La documentation dit ce qui suit à propos des niveaux :

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

191
Dave Webb

Utilisez la classe Log . Sortie visible avec LogCat

18
Maurits Rijk

Oui. Si vous utilisez l'émulateur, il apparaîtra dans la vue Logcat sous la balise System.out. Ecrivez quelque chose et essayez-le dans votre émulateur.

12
kaushikSuman

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

2
Marc

si vous avez vraiment besoin que System.out.println fonctionne (par exemple, il est appelé depuis une bibliothèque tierce). vous pouvez simplement utiliser la réflexion pour changer de 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
7heaven

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

1
ALSP

Vous ne pouvez pas lire le System.out.println(); sur votre téléphone.

Au lieu de cela, si vous voulez voir le résultat de quelque chose, regardez votre fenêtre logcat/console ou faites apparaître une Toast ou une Snackbar (si vous utilisez un périphérique plus récent) sur l'écran du périphérique avec le message :) faire quand je dois vérifier par exemple où il va dans un code switch case! Amusez-vous à coder! :)

1
Valentin Filyov

System.out.println ("...") est affiché sur le moniteur Android dans Android Studio.

0
Wesos de Queso

Je laisserai cela à d'autres visiteurs, car pour moi, le thread principal était incapable de 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
Nut eater