¿Por qué no funciona "System.out.println" en Android?


191

Quiero imprimir algo en la consola, para poder depurarlo. Pero por alguna razón, nada se imprime en mi aplicación de Android.

¿Cómo depuro entonces?

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

44
Aunque ha recibido su respuesta a continuación, me gustaría agregar que la salida de las declaraciones SOP también se dirige a LogCat: solo que el nombre de la etiqueta sería System.out
Samuh

1
Antes de 0.9 System.out se perdió, creo. Después de que se pasó a la salida de logcat : code.google.com/p/android/issues/detail?id=92 . (Si está utilizando una biblioteca existente o una que usa System.out, correcta o incorrecta, aparecerá en logcat con versiones posteriores de Android).
Charlie Collins,

podemos ver System.out.printlns dentro del logcat.
rDroid el

Respuestas:


211

Corrección:

En el emulador y la mayoría de los dispositivos System.out.printlnse redirige a LogCat y se imprime usando Log.i(). Esto puede no ser cierto en versiones de Android muy antiguas o personalizadas.

Original:

No hay una consola a la que enviar los mensajes, por lo que los System.out.printlnmensajes se pierden. De la misma manera, esto sucede cuando ejecuta una aplicación Java "tradicional" con javaw.

En cambio, puedes usar la clase de AndroidLog :

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

Luego puede ver el registro en la vista Logcat en Eclipse o ejecutando el siguiente comando:

adb logcat

Es bueno acostumbrarse a mirar la salida de logcat, ya que también es donde se muestran los rastros de pila de las excepciones no capturadas.

La primera entrada a cada llamada de registro es la etiqueta de registro que identifica la fuente del mensaje de registro. Esto es útil ya que puede filtrar la salida del registro para mostrar solo sus mensajes. Para asegurarse de que sea coherente con su etiqueta de registro, probablemente sea mejor definirla una vez como un static final Stringlugar.

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

Hay cinco métodos de una letra Logcorrespondientes a los siguientes niveles:

  • e() - Error
  • w() - Advertencia
  • i() - Información
  • d() - Depuración
  • v() - detallado
  • wtf() - Qué terrible falla

La documentación dice lo siguiente sobre los niveles :

Verbose nunca debe compilarse en una aplicación, excepto durante el desarrollo. Los registros de depuración se compilan pero se eliminan en tiempo de ejecución. Los registros de errores, advertencias e información siempre se mantienen.


30
En realidad: System.out imprime en LogCat a través de Log.i ().
kaspermoerch

77
@JosephEarl: siéntase libre de usar el botón Editar.
Dave Webb

10
también hay Log.wtf () :-)
Zorb

2
System.out.println se muestra en Android Studio, en Android Monitor. Estos se muestran como "I / System.out"
PVS

La nueva biblioteca de complementos de consola también es muy útil.
PaulMcG


13

Si lo hace Si está utilizando el emulador, se mostrará en la vista Logcat debajo de la System.outetiqueta. Escribe algo y pruébalo en tu emulador.


2
Además de esta respuesta, tenga en cuenta que algunas veces "algo sucede" y no se imprime ninguna entrada con el uso de System.out. Si este es el caso, intente cerrar y reiniciar el emulador. Esto funcionó para mí.
Byron Gavras

1

Por supuesto, para ver el resultado en logcat, debe establecer el nivel de registro al menos en "Información" ( nivel de registro en logcat ); de lo contrario, como me sucedió a mí, no verá su salida.


1

si realmente necesita System.out.println para trabajar (por ejemplo, se llama desde una biblioteca de terceros). simplemente puede usar la reflexión para cambiar el campo en 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(); 
}

Clase 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

no se muestra en su aplicación ... está debajo del logcat de su emulador


1
Esta es la primera oración del OP "Quiero imprimir algo en la consola"
Farid

0

No hay lugar en su teléfono donde pueda leer el System.out.println();

En cambio, si desea ver el resultado de algo, mire su logcat/consoleventana o haga que aparezca una Toasto una Snackbar(si está en un dispositivo más nuevo) en la pantalla del dispositivo con el mensaje :) Eso es lo que hago cuando tengo que verificar por ejemplo, donde va en un switch casecódigo! Diviértete codificando! :)


1
Cuando hago clic en Android Monitory luego logcat, veo muchos mensajes que se imprimen constantemente ... ¿Se supone que es así? Entonces, ¿cómo vería mis propios mensajes de depuración?

Simplemente me desplazo por las otras cosas y lo encuentro: D
Valentin Filyov

0

System.out.println ("...") se muestra en el monitor de Android en Android Studio


0

Dejaré esto para otros visitantes, ya que para mí fue algo acerca de que el hilo principal no puede hacerlo 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

Recientemente noté el mismo problema en Android Studio 3.3. Cerré los otros proyectos de estudio de Android y Logcat comenzó a trabajar. La respuesta aceptada arriba no es lógica en absoluto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.