Perché "System.out.println" non funziona su Android?


191

Voglio stampare qualcosa in console, in modo da poter eseguire il debug. Ma per qualche motivo, nulla viene stampato nella mia applicazione Android.

Come eseguo il debug quindi?

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
Sebbene tu abbia la risposta qui sotto, vorrei aggiungere che l'output delle istruzioni SOP è diretto anche a LogCat: solo che il nome del tag sarebbe System.out
Samuh

1
Prima che 0.9 System.out fosse perso, penso. Dopo che è stato passato all'output di logcat: code.google.com/p/android/issues/detail?id=92 . (Se stai utilizzando una libreria esistente o tale che utilizza System.out, giusto o sbagliato, verrà visualizzato in logcat con le versioni successive di Android.)
Charlie Collins

possiamo vedere System.out.printlns all'interno del logcat.
rDroid,

Risposte:


212

Correzione:

System.out.printlnSull'emulatore e la maggior parte dei dispositivi viene reindirizzato a LogCat e stampato usando Log.i(). Questo potrebbe non essere vero su versioni Android molto vecchie o personalizzate.

Originale:

Non esiste una console a cui inviare i messaggi in modo che i System.out.printlnmessaggi vadano persi. Allo stesso modo ciò accade quando si esegue un'applicazione Java "tradizionale" con javaw.

Invece, puoi usare la classe AndroidLog :

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

È quindi possibile visualizzare il registro nella vista Logcat in Eclipse o eseguendo il comando seguente:

adb logcat

È bene prendere l'abitudine di guardare l'output di logcat poiché è anche lì che vengono visualizzate le tracce dello stack di eventuali eccezioni non rilevate.

La prima voce per ogni chiamata di registrazione è il tag di registro che identifica l'origine del messaggio di registro. Questo è utile in quanto puoi filtrare l'output del registro per mostrare solo i tuoi messaggi. Per assicurarti di essere coerente con il tag di registro, probabilmente è meglio definirlo una volta come da static final Stringqualche parte.

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

Esistono cinque metodi di una lettera in Logcorrispondenza dei seguenti livelli:

  • e() - Errore
  • w() - Avvertimento
  • i() - Informazione
  • d() - Debug
  • v() - Verbose
  • wtf() - Che terribile fallimento

La documentazione dice quanto segue sui livelli :

Verbose non deve mai essere compilato in un'applicazione se non durante lo sviluppo. I registri di debug vengono compilati ma eliminati in fase di esecuzione. I log degli errori, degli avvisi e delle informazioni vengono sempre mantenuti.


30
In realtà - System.out stampa su LogCat tramite Log.i ().
Kaspermoerch,

7
@JosephEarl - Sentiti libero di usare il pulsante Modifica.
Dave Webb,

10
c'è anche Log.wtf () :-)
Zorb,

2
System.out.println viene visualizzato in Android Studio, sotto Android Monitor. Questi sono indicati come "I / System.out"
PVS

Anche la nuova libreria di componenti aggiuntivi Console è molto utile.
PaulMcG


13

Sì lo fa. Se si utilizza l'emulatore, verrà visualizzato nella vista Logcat sotto il System.outtag. Scrivi qualcosa e provalo nel tuo emulatore.


2
In aggiunta a questa risposta tenere presente che alcune volte "succede qualcosa" e nessun input viene stampato con l'utilizzo di System.out. In tal caso, provare a chiudere e riavviare l'emulatore. Questo ha funzionato per me.
Byron Gavras,

1

Naturalmente, per vedere il risultato in logcat, è necessario impostare il livello di registro almeno su "Informazioni" ( Livello di registro in logcat ); altrimenti, come è successo a me, non vedrai il tuo output.


1

se hai davvero bisogno di System.out.println per funzionare (es. è chiamato da una libreria di terze parti). puoi semplicemente usare la riflessione per cambiare campo in 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;
        }
    }
}

1

non viene visualizzato nella tua applicazione ... è sotto il logcat dell'emulatore


1
Questa è la prima frase dell'OP "Voglio stampare qualcosa in console"
Farid

0

Non c'è posto sul tuo telefono che puoi leggere System.out.println();

Invece, se vuoi vedere il risultato di qualcosa, guarda la tua logcat/consolefinestra o fai apparire uno Toasto un Snackbar(se sei su un nuovo dispositivo) sullo schermo del dispositivo con il messaggio :) Questo è quello che faccio quando devo controllare per esempio dove va in un switch casecodice! Divertiti a programmare! :)


1
Quando faccio clic su Android Monitore logcatvedo che molti messaggi vengono costantemente stampati ... Dovrebbe essere così? Quindi come vedrei i miei messaggi di debug?


0

System.out.println ("...") viene visualizzato sul monitor Android in Android Studio


0

Lascio questo per altri visitatori perché per me era qualcosa che il thread principale non poteva 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;
}
}

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


-5

Di recente ho notato lo stesso problema in Android Studio 3.3. Ho chiuso gli altri progetti Android Studio e Logcat ha iniziato a funzionare. La risposta accettata sopra non è affatto logica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.