Почему в Android не работает «System.out.println»?

Я хочу что-то напечатать на консоли, чтобы я мог его отладить. Но по какой-то причине ничего не печатает в моем приложении для 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"); } 

Solutions Collecting From Web of "Почему в Android не работает «System.out.println»?"

Исправление:

На эмуляторе и большинстве устройств System.out.println перенаправляется на LogCat и печатается с использованием Log.i() . Это может быть неверно на очень старых или пользовательских версиях Android.

Оригинал:

Нет консоли для отправки сообщений, чтобы сообщения System.out.println терялись. Точно так же это происходит, когда вы запускаете «традиционное» приложение Java с javaw .

Вместо этого вы можете использовать класс Android Log :

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

Затем вы можете просмотреть журнал либо в представлении Logcat в Eclipse, либо выполнив следующую команду:

 adb logcat 

Хорошо привык смотреть на вывод logcat, так как это также показывает, где отображаются следы стека любых неперехваченных исключений.

Первый вход для каждого входа в журнал – это тег журнала, который идентифицирует источник сообщения журнала. Это полезно, поскольку вы можете отфильтровать вывод журнала, чтобы показывать только ваши сообщения. Чтобы убедиться, что вы согласны с вашим тегом журнала, лучше всего определить его как static final String где-нибудь.

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

В журнале есть пять однобуквенных методов, соответствующих следующим уровням:

  • e() – Ошибка
  • w() – Предупреждение
  • i() – Информация
  • d() – Отладка
  • v() – Подробный
  • wtf() – Какая ужасная ошибка

В документации говорится о следующих уровнях :

Подробно не следует компилировать в приложение, кроме как во время разработки. Журналы отладки компилируются, но удаляются во время выполнения. Журналы ошибок, предупреждений и информации всегда сохраняются.

Используйте класс журнала . Выход, видимый с помощью LogCat

Да. Если вы используете эмулятор, он будет отображаться в представлении Logcat в теге System.out . Напишите что-нибудь и попробуйте в эмуляторе.

Конечно, чтобы увидеть результат в logcat, вы должны установить уровень журнала как минимум на «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; } } }