为什么“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; } } }