为什么“System.out.println”不能在Android中工作?

我想在控制台中打印一些东西,以便调试它。 但由于某种原因,我的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"); } 

更正:

在模拟器和大多数设备上, System.out.println被重定向到LogCat并使用Log.i()打印。 对于非常旧的或自定义的Android版本,这可能不是真的。

原版的:

没有控制台发送消息,以便System.out.println消息丢失。 用javaw运行“传统”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编译成应用程序。 调试日志被编译,但在运行时剥离。 错误,警告和信息日志始终保持不变。

使用日志类 。 输出与LogCat可见

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

当然,要在logcat中查看结果,应该至少将Log级别设置为“Info”( Logcat中的日志级别 ); 否则,正如它发生在我身上,你不会看到你的输出。

在手机上没有地方可以读取System.out.println();

相反,如果你想看看你的logcat/console窗口的结果,或者在设备的屏幕上显示一个Toast或一个Snackbar (如果你在一个较新的设备上),那么这个消息就是:)这就是我所做的当我必须检查例如它在switch case代码中去哪里! 玩得开心编码! 🙂

如果你真的需要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; } } }