Почему "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");
}
12 ответов
Исправление:
На эмуляторе и большинстве устройств 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");
Есть пять однобуквенных методов в Log
соответствует следующим уровням:
e()
- Ошибкаw()
- предупреждениеi()
- Информацияd()
- отладкаv()
- Подробныйwtf()
- Какой ужасный провал
В документации сказано следующее об уровнях:
Подробно никогда не следует компилировать в приложение, кроме как во время разработки. Журналы отладки компилируются, но удаляются во время выполнения. Журналы ошибок, предупреждений и информации всегда сохраняются.
Да, это так. Если вы используете эмулятор, он отобразится в представлении Logcat под System.out
тег. Напишите что-нибудь и попробуйте в своем эмуляторе.
Он не отображается в вашем приложении... он находится в logcat вашего эмулятора
Если вам действительно нужен 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;
}
}
}
Конечно, чтобы увидеть результат в logcat, вы должны установить уровень Log как минимум на "Info" ( уровень журнала в logcat); в противном случае, как это случилось со мной, вы не увидите свой вывод.
На вашем телефоне нет места для чтения System.out.println();
Вместо этого, если вы хотите увидеть результат чего-либо, посмотрите на logcat/console
окно или сделать Toast
или Snackbar
(если вы используете более новое устройство) на экране устройства появляется сообщение:) Это то, что я делаю, когда мне нужно, например, проверить, куда оно идет. switch case
код! Веселого программирования!:)
Решение, которое сработало для меня:
Под логкатом . (Чтобы отобразить Logcat, если он еще не показан. Выберите меню «Вид» -> «Инструменты Windows» -> «Logcat»). Он отображается как System.out, а не как System.out.println, как можно было ожидать. Пересоберите приложение, если вы еще этого не сделали.
На картинке, выделенной желтым цветом, показан System.out и вывод «Hello Again».
System.out.println("...") отображается на мониторе Android в Android Studio
Я оставлю это для дальнейших посетителей, так как для меня это было что-то из-за неспособности основного потока 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");
У меня нет необычной IDE для использования LogCat, поскольку я использую мобильную IDE.
Мне пришлось использовать различные другие методы, и у меня есть классы и утилиты, которые вы можете использовать, если вам нужно.
класс jav.android.Msg. Имеет набор статических методов. A: методы печати ТОСТОВ Android. B: методы для открытия диалогового окна. Каждый метод требует действительного контекста. Вы можете установить контекст по умолчанию.
Более амбициозный способ - Android Console. Вы создаете дескриптор консоли в своем приложении, которое запускает консоль (если она установлена), и вы можете писать в консоль. Недавно я обновил консоль, чтобы реализовать чтение ввода с консоли. Что не возвращается, пока не будет получен ввод, как на обычной консоли. A: Загрузите и установите консоль Android (получите ее у меня) B: Вместе с ней поставляется файл java (jav.android.console.IConsole). Поместите его в соответствующий каталог. Он содержит методы работы с консолью Android. C: вызвать конструктор, завершающий инициализацию. D: прочтите<*> и напишите в консоль. Еще есть над чем поработать. А именно, поскольку OnServiceConnected не вызывается немедленно, вы не можете использовать IConsole в той же функции, которую вы создали.
Перед созданием Android Console я создал Console Dialog, который был диалоговым окном, работающим в том же приложении и напоминающим консоль. Плюс: не нужно ждать OnServiceConnected, чтобы использовать его. Против: при сбое приложения вы не получаете сообщение о сбое приложения.
Поскольку Android Console - это отдельное приложение в отдельном процессе, если ваше приложение выйдет из строя, вы обязательно увидите ошибку. Кроме того, IConsole устанавливает обработчик неперехваченных исключений в вашем приложении, если вы не заинтересованы в обработке исключений. Он в значительной степени выводит трассировки стека и сообщения об исключениях в консоль Android. Наконец, если консоль Android выходит из строя, она отправляет вам трассировку стека и исключения, и вы можете выбрать приложение для чтения. На самом деле AndroidConsole не требуется для сбоя.
Edit Extras Я заметил, что у моего пока APK Builder нет LogCat; АИДЕ делает. Потом я понял, что все равно пользуюсь моей консолью Android.
Консоль Android спроектирована так, чтобы занимать только часть экрана, поэтому вы можете видеть как свое приложение, так и данные, отправленные из вашего приложения на консоль. Это невозможно с AIDE. Итак, я хочу прикоснуться к экрану и увидеть координаты, консоль Android упрощает это.
Консоль Android спроектирована так, чтобы всплывать, когда вы пишете в нее.
Консоль Android скроется при нажатии.
Недавно я заметил ту же проблему в Android Studio 3.3. Я просто закрыл другие проекты студии Android, и Logcat начал работать. Выше принятый ответ совсем не логичен.