it-swarm.com.de

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

Korrektur:

Auf dem Emulator und den meisten Geräten wird System.out.println an LogCat umgeleitet und mit Log.i() gedruckt. Dies trifft möglicherweise nicht auf sehr alte oder benutzerdefinierte Android-Versionen zu. 

Original:

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

Stattdessen können Sie die Android Log-Klasse 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 die Gewohnheit anzueignen, sich die logcat-Ausgabe anzuschauen, da dort auch die Stack-Spuren von nicht erfassten Exceptions angezeigt werden.

 

Der erste Eintrag für jeden Protokollierungsaufruf ist das Protokollkennzeichen, das die Quelle der Protokollnachricht identifiziert. Dies ist hilfreich, da Sie die Ausgabe des Protokolls so filtern können, dass nur Ihre Nachrichten angezeigt werden. Um sicherzustellen, dass Sie mit Ihrem Protokolltag konsistent sind, ist es wahrscheinlich am besten, es einmal irgendwo als static final String zu definieren.

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

Es gibt fünf einbuchstabige Methoden in Log, die den folgenden Stufen entsprechen:

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

Die Dokumentation sagt folgendes über die Stufen :

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

191
Dave Webb

Verwenden Sie die Klasse Log . Ausgabe sichtbar mit LogCat

18
Maurits Rijk

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

12
kaushikSuman

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

2
Marc

wenn Sie wirklich brauchen, dass System.out.println funktioniert (z. B. wird es von einer Drittanbieter-Bibliothek aufgerufen). Sie können Reflection einfach 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;
        }
    }
}
2
7heaven

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

1
ALSP

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

Wenn Sie das Ergebnis von etwas anzeigen möchten, schauen Sie entweder in Ihr logcat/console-Fenster oder lassen Sie eine Toast oder eine Snackbar (wenn Sie sich auf einem neueren Gerät befinden) auf dem Bildschirm des Geräts die Meldung :) .__ tun, wenn ich zum Beispiel überprüfen muss, wo es in einem switch case-Code geht! Viel Spaß beim Codieren! :)

1
Valentin Filyov

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

0
Wesos de Queso

Ich lasse dies für weitere Besucher übrig, da es für mich etwas daran lag, dass der Haupt-Thread nicht in der Lage war, System.out.println zu ___.

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

0
Nut eater