Por que "System.out.println" não funciona no Android?


191

Quero imprimir algo no console para poder depurá-lo. Mas, por alguma razão, nada é impresso no meu aplicativo Android.

Como eu depuro então?

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
Embora você tenha a sua resposta abaixo, eu gostaria de acrescentar que a saída das instruções SOP também é direcionada para o LogCat: apenas que o nome da tag seria System.out
Samuh

1
Antes do 0.9 System.out estar perdido, eu acho. Depois de passado para a saída do logcat: code.google.com/p/android/issues/detail?id=92 . (Se você estiver usando uma biblioteca existente ou de tal forma que usos System.out, certo ou errado, ele vai aparecer em logcat com versões posteriores do Android.)
Charlie Collins

podemos ver o System.out.printlns dentro do logcat.
RDroid 21/11

Respostas:


211

Correção:

No emulador e a maioria dos dispositivos System.out.printlné redirecionada para o LogCat e impressa usandoLog.i() . Isso pode não ser verdade nas versões Android muito antigas ou personalizadas.

Original:

Não há console para o qual enviar as mensagens, para que as System.out.printlnmensagens sejam perdidas. Da mesma forma, isso acontece quando você executa um aplicativo Java "tradicional" com javaw.

Em vez disso, você pode usar a classe AndroidLog :

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

É possível visualizar o log na visualização Logcat no Eclipse ou executando o seguinte comando:

adb logcat

É bom adquirir o hábito de analisar a saída do logcat, pois também é onde os Rastreamentos de pilha de qualquer exceção não capturada são exibidos.

A primeira entrada para cada chamada de log é a tag de log que identifica a origem da mensagem de log. Isso é útil, pois você pode filtrar a saída do log para mostrar apenas suas mensagens. Para garantir que você seja consistente com sua tag de log, provavelmente é melhor defini-la uma vez como um local static final String.

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

Existem cinco métodos de uma letra Logcorrespondentes aos seguintes níveis:

  • e() - Erro
  • w() - Aviso
  • i() - Em formação
  • d() - Depurar
  • v() - Verbose
  • wtf() - Que falha terrível

A documentação diz o seguinte sobre os níveis :

O verboso nunca deve ser compilado em um aplicativo, exceto durante o desenvolvimento. Os logs de depuração são compilados, mas removidos em tempo de execução. Os registros de erro, aviso e informações são sempre mantidos.


30
Na verdade - System.out imprime no LogCat através do Log.i ().
kaspermoerch

7
@JosephEarl - Sinta-se livre para usar o botão Editar.
Dave Webb

10
há também Log.wtf () :-)
Zorb

2
System.out.println aparece no Android Studio, no Android Monitor. Eles são mostrados como "I / System.out"
PVS 29/16

A nova biblioteca de suplementos do console também é muito útil.
PaulMcG


13

Sim. Se você estiver usando o emulador, ele será exibido na visualização Logcat sob a System.outtag. Escreva algo e tente no seu emulador.


2
Além desta resposta, lembre-se de que algumas vezes "algo acontece" e nenhuma entrada é impressa com o uso do System.out. Nesse caso, tente fechar e reiniciar o emulador. Isso funcionou para mim.
Byron Gavras

1

Obviamente, para ver o resultado no logcat, você deve definir o nível de log pelo menos como "Informações" ( nível de log no logcat ); caso contrário, como aconteceu comigo, você não verá sua saída.


1

se você realmente precisa do System.out.println para funcionar (por exemplo, é chamado de uma biblioteca de terceiros). você pode simplesmente usar a reflexão para alterar o campo 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(); 
}

Classe 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

ele não é exibido no seu aplicativo ... está no logcat do seu emulador


1
Esta é a primeira frase do OP "Quero imprimir algo no console"
Farid

0

Não há lugar no seu telefone que você possa ler o System.out.println();

Em vez disso, se você quiser ver o resultado de algo, olhe para a sua logcat/consolejanela ou faça com que a mensagem a Toastou a Snackbar(se você estiver em um dispositivo mais recente) apareça com a mensagem :) É isso que eu faço quando preciso verificar por exemplo, onde ele vai em um switch casecódigo! Divirta-se codificando! :)


1
Quando clico Android Monitore logcatvejo muitas mensagens constantemente sendo impressas ... Deveria ser assim? Então, como eu veria minhas próprias mensagens de depuração?

Eu apenas
percorro


0

Deixarei isso para outros visitantes, pois para mim era algo que o thread principal era incapaz de fazer 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

Recentemente, notei o mesmo problema no Android Studio 3.3. Fechei os outros projetos de estúdio do Android e o Logcat começou a funcionar. A resposta aceita acima não é lógica.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.