Warum funktioniert “System.out.println” nicht in Android?

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

Wie kann ich dann debuggen?

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

   

Korrektur:

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

Original:

Es gibt keine Konsole, an die die Nachrichten gesendet werden, damit die System.out.println Nachrichten verloren gehen. Auf die gleiche Weise geschieht dies, wenn Sie eine Java-Anwendung mit “Java” javaw .

Stattdessen können Sie die Android Log class verwenden :

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

Sie können das Protokoll dann entweder in der Ansicht ” Logcat” in Eclipse anzeigen oder indem Sie den folgenden Befehl ausführen :

 adb logcat 

Es ist gut, sich an die Gewohnheit zu gewöhnen, die Logcat-Ausgabe zu betrachten, da dort auch die Stack-Traces aller nicht erfassten Exceptions angezeigt werden.

Der erste Eintrag für jeden 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 konsistent sind, ist es wahrscheinlich am besten, es einmal als static final String zu definieren.

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

Es gibt fünf Ein-Buchstaben-Methoden in Log entsprechend den folgenden Ebenen:

  • e() – Fehler
  • w() – Warnung
  • i() – Informationen
  • d() – Debuggen
  • v() – Ausführlich
  • wtf() – Was für ein schreckliches Versagen

Die Dokumentation sagt folgendes über die Ebenen :

Verbose sollte nur während der Entwicklung in eine Anwendung kompiliert werden. Debug-Protokolle werden zur Laufzeit kompiliert, aber entfernt. Fehler-, Warn- und Info-Logs werden immer gespeichert.

Verwenden Sie die Protokollklasse . Ausgabe sichtbar mit LogCat

Ja tut es. Wenn Sie den Emulator verwenden, wird er in der Ansicht Logcat unter dem Tag System.out angezeigt. Schreib etwas und probiere es in deinem Emulator.

Um das Ergebnis in logcat zu sehen, sollten Sie Loglevel mindestens auf “Info” setzen ( Log-Level in logcat ); Ansonsten, wie es mir passiert ist, werden Sie Ihre Ausgabe nicht sehen.

Es gibt keinen Platz auf Ihrem Telefon, an dem Sie die System.out.println();

Wenn Sie das Ergebnis von etwas sehen wollen, schauen Sie entweder in Ihr logcat/console oder machen Sie einen Toast oder eine Snackbar (wenn Sie auf einem neueren Gerät sind) erscheint auf dem Bildschirm des Geräts mit der Nachricht 🙂 Das ist, was ich tue wenn ich zum beispiel prüfen muss wo es in einen switch case code geht! Viel Spaß beim Programmieren! 🙂

wenn Sie wirklich System.out.println brauchen um zu arbeiten (zB es wird von der Third Party Library aufgerufen). Sie können einfach Reflektion 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-class:

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

System.out.println (“…”) wird auf dem Android-Monitor in Android Studio angezeigt