Почему в 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");
}
Ответы
Ответ 1
Исправление:
На эмуляторе и большинстве устройств 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, так как там также отображаются следы стека любых неперехваченных исключений.
![02.08.2010-09.37.55.png]()
Первый вход для каждого входа в журнал - это тег журнала, который идентифицирует источник сообщения журнала. Это полезно, поскольку вы можете фильтровать вывод журнала, чтобы показывать только ваши сообщения. Чтобы убедиться, что вы согласны с вашим тегом журнала, лучше всего определить его как-то как static final String
.
Log.d(MyActivity.LOG_TAG,"Application started");
В Log
имеется пять однобуквенных методов, соответствующих следующим уровням:
-
e()
- Ошибка
-
w()
- Предупреждение
-
i()
- Информация
-
d()
- Отладка
-
v()
- Подробный
-
wtf()
- Какая ужасная ошибка
Документация описывает следующие уровни:
Verbose никогда не следует компилировать в приложение, кроме как во время разработки. Журналы отладки компилируются, но удаляются во время выполнения. Журналы ошибок, предупреждений и информации всегда сохраняются.
Ответ 2
Используйте класс журнала. Выход, видимый с помощью LogCat
Ответ 3
Да, да. Если вы используете эмулятор, он отобразится в представлении Logcat под тегом System.out
. Напишите что-нибудь и попробуйте в эмуляторе.
Ответ 4
Конечно, чтобы увидеть результат в logcat, вы должны установить уровень журнала как минимум на "Info" (Уровень журнала в logcat); иначе, как это случилось со мной, вы не увидите свой выход.
Ответ 5
если вам действительно нужен 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;
}
}
}
Ответ 6
На вашем телефоне нет места, где вы можете прочитать System.out.println();
Вместо этого, если вы хотите увидеть результат чего-либо или посмотрите на окно logcat/console
или сделайте Toast
или Snackbar
(если вы находитесь на более новом устройстве), появится на экране устройства с помощью сообщение:)
Это то, что я делаю, когда я должен проверить, например, где он находится в коде switch case
! Получайте удовольствие от кодирования!:)
Ответ 7
он не отображается в вашем приложении... он находится под вашим эмулятором logcat
Ответ 8
System.out.println("...") отображается на мониторе Android в Android Studio
Ответ 9
Я оставлю это для дальнейших посетителей, так как для меня это было что-то из-за того, что основной поток не смог 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 already running
if(!started) {
start();
}
//Append a String to the log
log += s;
}
public static void println(String s) {
//Start the thread unless it 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");
Ответ 10
Недавно я заметил ту же проблему в Android Studio 3.3. Я закрыл другие проекты студии Android и Logcat начал работать. Принятый ответ выше не совсем логичен.