Dlaczego „System.out.println” nie działa w systemie Android?


191

Chcę wydrukować coś w konsoli, aby móc to debugować. Ale z jakiegoś powodu nic nie jest drukowane w mojej aplikacji na Androida.

Jak mam wtedy debugować?

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
Chociaż masz odpowiedź poniżej, chciałbym dodać, że dane wyjściowe instrukcji SOP są również kierowane do LogCat: tyle, że nazwa tagu to System.out
Samuh

1
Myślę, że zanim 0.9 System.out został utracony. Po przekazaniu go do wyjścia logcat: code.google.com/p/android/issues/detail?id=92 . (Jeśli korzystasz z istniejącej biblioteki lub takiej, która używa System.out, dobrze czy źle, pojawi się w logcat w późniejszych wersjach Androida.)
Charlie Collins

możemy zobaczyć System.out.printlns wewnątrz logcat.
rDroid

Odpowiedzi:


211

Korekta:

Na emulatorze i większości urządzeń System.out.printlnzostaje przekierowany do LogCat i wydrukowany przy użyciu Log.i(). Może to nie dotyczyć bardzo starych lub niestandardowych wersji Androida.

Oryginalny:

Nie ma konsoli, do której można wysyłać wiadomości, aby System.out.printlnsię zgubiły. W ten sam sposób dzieje się to po uruchomieniu „tradycyjnej” aplikacji Java javaw.

Zamiast tego możesz użyć klasy AndroidaLog :

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

Następnie możesz wyświetlić dziennik w widoku Logcat w Eclipse lub uruchamiając następujące polecenie:

adb logcat

Dobrze jest przyzwyczaić się do patrzenia na dane wyjściowe logcat, ponieważ tam również są wyświetlane ślady stosu wszelkich nieprzechwyconych wyjątków.

Pierwszym wpisem do każdego wywołania logowania jest tag dziennika, który identyfikuje źródło komunikatu dziennika. Jest to pomocne, ponieważ można filtrować dane wyjściowe dziennika, aby wyświetlać tylko wiadomości. Aby upewnić się, że jesteś zgodny ze swoim tagiem dziennika, prawdopodobnie najlepiej jest zdefiniować go static final Stringgdzieś.

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

Istnieje pięć jednoliterowych metod Logodpowiadających następującym poziomom:

  • e() - Błąd
  • w() - Ostrzeżenie
  • i() - Informacja
  • d() - Debugowanie
  • v() - Pełne
  • wtf() - Co za straszna porażka

Dokumentacja mówi o następujące poziomy :

Verbose nigdy nie powinien być kompilowany do aplikacji inaczej niż podczas programowania. Dzienniki debugowania są kompilowane, ale usuwane w czasie wykonywania. Dzienniki błędów, ostrzeżeń i informacji są zawsze przechowywane.


30
Właściwie - System.out drukuje do LogCat poprzez Log.i ().
kaspermoerch 30.09.11

7
@JosephEarl - Możesz użyć przycisku Edytuj.
Dave Webb

10
istnieje również Log.wtf () :-)
Zorb

2
System.out.println nie wyświetla się w Android Studio pod Android Monitor. Są one wyświetlane jako „I / System.out”
PVS

Nowa biblioteka dodatków do konsoli jest również bardzo przydatna.
PaulMcG,


13

Tak. Jeśli używasz emulatora, pojawi się on w widoku Logcat pod System.outtagiem. Napisz coś i spróbuj w emulatorze.


2
Oprócz tej odpowiedzi należy pamiętać, że czasami „coś się dzieje” i żadne dane wejściowe nie są drukowane przy użyciu System.out. W takim przypadku spróbuj zamknąć i ponownie uruchomić emulator. To zadziałało dla mnie.
Byron Gavras,

1

Oczywiście, aby zobaczyć wynik w logcat, powinieneś ustawić Poziom Logowania przynajmniej na „Info” ( Poziom Logu w logcat ); w przeciwnym razie, jak mi się przydarzyło, nie zobaczysz swoich wyników.


1

jeśli naprawdę potrzebujesz System.out.println do pracy (np. jest wywoływany z biblioteki innej firmy). możesz po prostu użyć odbicia, aby zmienić pole w 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(); 
}

Klasa 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

nie jest wyświetlany w aplikacji ... znajduje się pod logcat emulatora


1
To jest pierwsze zdanie OP „Chcę wydrukować coś w konsoli”
Farid

0

W telefonie nie ma miejsca, w którym można by przeczytać System.out.println();

Zamiast tego, jeśli chcesz zobaczyć wynik czegoś albo spojrzeć na logcat/consoleokno albo sprawić, że na ekranie urządzenia pojawi się a Toastlub a Snackbar(jeśli jesteś na nowszym urządzeniu) z komunikatem :) Tak właśnie robię, kiedy muszę sprawdzić na przykład, gdzie idzie w switch casekodzie! Miłego kodowania! :)


1
Kiedy klikam, Android Monitora potem logcatwidzę wiele wiadomości ciągle drukowanych ... Czy tak powinno być? Jak w takim razie mogę zobaczyć moje własne komunikaty debugowania?

Po prostu przewijam inne rzeczy i znajduję to: D
Valentin Filyov


0

Zostawię to kolejnym odwiedzającym, ponieważ dla mnie było to coś, czego główny wątek nie był w stanie 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;
}
}

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


-5

Ostatnio zauważyłem ten sam problem w Android Studio 3.3. Zamknąłem inne projekty studia na Androida i Logcat zaczął działać. Przyjęta powyżej odpowiedź w ogóle nie jest logiczna.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.