为什么“ System.out.println”在Android中不起作用?


191

我想在控制台中打印某些内容,以便对其进行调试。但是由于某种原因,我的Android应用程序中没有任何内容。

那我该如何调试?

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
尽管您在下面得到了答案,但我想补充一下,SOP语句的输出也直接指向LogCat:仅标记名称为System.out
Samuh,2010年

1
我认为在0.9 System.out丢失之前。传递到logcat输出后:code.google.com/p/android/issues/detail ? id= 92。(如果您使用的是现有库或使用System.out的库(对或错),它将显示在logcat中以及更高版本的Android。)
Charlie Collins

我们可以在logcat中看到System.out.printlns。
rDroid

Answers:


211

更正:

在仿真器上,大多数设备System.out.println都重定向到LogCat并使用进行打印Log.i()。在非常旧的或自定义的Android版本上可能并非如此。

原版的:

没有将消息发送到的控制台,因此System.out.println消息丢失。当您使用来运行“传统” Java应用程序时,也会以同样的方式发生这种情况javaw

相反,您可以使用Android Log

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

然后,您可以在Eclipse 的Logcat视图中查看日志,也可以通过运行以下命令来查看日志:

adb logcat

养成查看logcat输出的习惯是一件好事,因为这也是显示任何未捕获的异常的堆栈跟踪的地方。

每个日志记录调用的第一个条目是日志标记,用于标识日志消息的来源。这很有用,因为您可以过滤日志的输出以仅显示您的消息。为了确保您与日志标签一致,最好将它一次定义为static final String某个地方。

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

有五个单字母方法,分别Log对应于以下级别:

  • e() -错误
  • w() - 警告
  • i() -信息
  • d() -调试
  • v() -详细
  • wtf() -多么可怕的失败

文档说明了有关级别的以下内容

除非在开发过程中,否则切勿将Verbose编译到应用程序中。调试日志在其中编译,但在运行时剥离。错误,警告和信息日志始终保留。


29
实际上-System.out通过Log.i()打印到LogCat。
kaspermoerch 2011年

7
@JosephEarl-随时使用“编辑”按钮。
戴夫·韦伯

10
还有Log.wtf():-)
Zorb

2
System.out.println确实在Android Studio的Android Monitor下显示。这些显示为“ I / System.out”
PVS

新的控制台加载项库也非常有用。
PaulMcG '16


13

是的,它确实。如果您使用的是模拟器,它将显示在Logcat视图的System.out标记下。写点东西,然后在模拟器中尝试一下。


2
除此答案外,还请记住,有时“某些事情会发生”,并且使用System.out的使用不会打印任何输入。如果是这种情况,请尝试关闭并重新启动仿真器。这对我有用。
拜伦·加夫拉斯

1

当然,要在logcat中查看结果,您应该将Log级别至少设置为“ Info”(logcat中的Log级别);否则,就像我发生的那样,您将看不到您的输出。


1

如果您确实需要System.out.println来工作(例如,从第三方库调用)。您可以简单地使用反射更改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(); 
}

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

它没有显示在您的应用程序中...它在模拟器的logcat下


1
这是OP的第一句话“我想在控制台中打印内容”
Farid

0

手机上没有可以阅读的位置 System.out.println();

相反,如果您想查看某物的结果,请在logcat/console窗口中查看,或者在设备的屏幕上显示一条消息Toast或一条消息Snackbar(如果您使用的是较新的设备):)例如它在switch case代码中的位置!祝您编码愉快!:)


1
当我单击Android Monitor,然后logcat看到不断打印着许多消息...应该是这样吗?那我怎么看我自己的调试信息?

我只是滚动浏览其他内容并找到它:D
Valentin Filyov


0

我将其留给其他访问者,因为对我而言,这是主线程无法执行的操作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;
}
}

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


-5

最近,我注意到Android Studio 3.3中存在相同的问题。我关闭了其他Android Studio项目,Logcat开始工作。上面接受的答案根本不合逻辑。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.