Warum funktioniert "System.out.println" in Android nicht?

191

Ich möchte etwas in der Konsole drucken, damit ich es debuggen kann. Aber aus irgendeinem Grund wird in meiner Android-Anwendung nichts gedruckt.

Wie debugge ich dann?

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");
    }
TIMEX
quelle
4
Obwohl Sie Ihre Antwort unten erhalten haben, möchte ich hinzufügen, dass die Ausgabe von SOP-Anweisungen auch an LogCat gerichtet ist: nur, dass der Tag-Name System.out
Samuh
1
Bevor 0.9 System.out verloren ging, denke ich. Nachdem es an die Logcat-Ausgabe übergeben wurde: code.google.com/p/android/issues/detail?id=92 . (Wenn Sie eine vorhandene Bibliothek oder eine solche verwenden, die System.out verwendet, richtig oder falsch, wird sie in logcat mit späteren Versionen von Android angezeigt.)
Charlie Collins
Wir können die System.out.printlns im Logcat sehen.
Droroid

Antworten:

211

Korrektur:

Auf dem Emulator und den meisten Geräten System.out.printlnwird zu LogCat umgeleitet und mit gedruckt Log.i(). Dies gilt möglicherweise nicht für sehr alte oder benutzerdefinierte Android-Versionen.

Original:

Es gibt keine Konsole, an die die Nachrichten gesendet werden können, sodass die System.out.printlnNachrichten verloren gehen. Auf die gleiche Weise geschieht dies, wenn Sie eine "traditionelle" Java-Anwendung mit ausführen javaw.

Stattdessen können Sie die Android- LogKlasse verwenden :

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

Sie können das Protokoll dann entweder in der Logcat- Ansicht in Eclipse oder durch Ausführen des folgenden Befehls anzeigen :

adb logcat

Es ist gut, sich daran zu gewöhnen, die Logcat-Ausgabe zu betrachten, da dort auch die Stapelspuren nicht erfasster Ausnahmen angezeigt werden.

Der erste Eintrag zu jedem Protokollierungsaufruf ist das Protokoll-Tag, das die Quelle der Protokollnachricht identifiziert. Dies ist hilfreich, da Sie die Ausgabe des Protokolls filtern können, um nur Ihre Nachrichten anzuzeigen. Um sicherzustellen, dass Sie mit Ihrem Protokoll-Tag übereinstimmen, ist es wahrscheinlich am besten, es einmal als static final Stringirgendwo zu definieren .

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

Es gibt fünf Ein-Buchstaben-Methoden Log, die den folgenden Ebenen entsprechen:

  • e() - Error
  • w() - Warnung
  • i() - Information
  • d() - Debuggen
  • v() - Ausführlich
  • wtf() - Was für ein schrecklicher Fehler

In der Dokumentation wird Folgendes zu den Ebenen angegeben :

Verbose sollte nur während der Entwicklung in eine Anwendung kompiliert werden. Debug-Protokolle werden kompiliert, aber zur Laufzeit entfernt. Fehler-, Warn- und Infoprotokolle werden immer geführt.

Dave Webb
quelle
29
Tatsächlich - System.out wird über Log.i () in LogCat gedruckt.
Kaspermoerch
7
@JosephEarl - Verwenden Sie die Schaltfläche Bearbeiten.
Dave Webb
10
Es gibt auch Log.wtf () :-)
Zorb
2
System.out.println wird in Android Studio unter Android Monitor angezeigt. Diese werden als "I / System.out"
PVS
Die neue Konsolen-Add-In-Bibliothek ist ebenfalls sehr nützlich.
PaulMcG
17

Verwenden Sie die Log-Klasse . Ausgabe mit LogCat sichtbar

Maurits Rijk
quelle
13

Ja tut es. Wenn Sie den Emulator verwenden, wird er in der Logcat-Ansicht unter dem System.outTag angezeigt . Schreiben Sie etwas und probieren Sie es in Ihrem Emulator aus.

kaushikSuman
quelle
2
Beachten Sie zusätzlich zu dieser Antwort, dass manchmal "etwas passiert" und bei Verwendung von System.out keine Eingabe gedruckt wird. Versuchen Sie in diesem Fall, den Emulator zu schließen und neu zu starten. Das hat bei mir funktioniert.
Byron Gavras
1

Um das Ergebnis in logcat zu sehen, sollten Sie natürlich die Protokollstufe mindestens auf "Info" ( Protokollstufe in logcat ) setzen. Andernfalls, wie es mir passiert ist, werden Sie Ihre Ausgabe nicht sehen.

Marc
quelle
1

Wenn Sie System.out.println wirklich zum Arbeiten benötigen (z. B. wird es von einer Drittanbieter-Bibliothek aufgerufen). Sie können einfach die Reflexion verwenden, um das Feld in System.class zu ändern:

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(); 
}

RedirectLogOutputStream-Klasse:

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;
        }
    }
}
7Himmel
quelle
1

Es wird in Ihrer Anwendung nicht angezeigt. Es befindet sich unter dem Logcat Ihres Emulators

ALSP
quelle
1
Dies ist der allererste Satz des OP "Ich möchte etwas in der Konsole drucken"
Farid
0

Es gibt keinen Ort auf Ihrem Telefon, an dem Sie das lesen können System.out.println();

Wenn Sie stattdessen das Ergebnis von etwas sehen möchten, schauen Sie entweder in Ihr logcat/consoleFenster oder lassen Sie ein Toastoder ein Snackbar(wenn Sie sich auf einem neueren Gerät befinden) auf dem Bildschirm des Geräts mit der Meldung erscheinen :) Das ist, was ich tue, wenn ich überprüfen muss Zum Beispiel, wo es in einem switch caseCode geht! Viel Spaß beim Codieren! :) :)

Valentin Filyov
quelle
1
Wenn ich auf Android Monitorund dann logcatklicke, werden ständig viele, viele Nachrichten gedruckt ... Soll es so sein? Wie würde ich dann meine eigenen Debug-Meldungen sehen?
Ich
scrolle
0

System.out.println ("...") wird auf dem Android-Monitor in Android Studio angezeigt

Wesos de Queso
quelle
0

Ich überlasse dies weiteren Besuchern, da es für mich etwas war, was der Haupt-Thread nicht konnte 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;
}
}

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

Nussfresser
quelle
-5

Kürzlich habe ich das gleiche Problem in Android Studio 3.3 bemerkt. Ich schloss die anderen Android Studio-Projekte und Logcat begann zu arbeiten. Die oben akzeptierte Antwort ist überhaupt nicht logisch.

Ronak Desai
quelle