Почему "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, поскольку именно там отображаются следы стека любых необработанных исключений.

https://content.screencast.com/users/davweb/folders/Snagit/media/04ab3404-7d58-4e6f-97c3-27c0637d8050/02.08.2010-09.37.55.png

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

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

Есть пять однобуквенных методов в Log соответствует следующим уровням:

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

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

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

Используйте класс Log. Вывод видимый с LogCat

Да, это так. Если вы используете эмулятор, он отобразится в представлении 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.

Мне пришлось использовать различные другие методы, и у меня есть классы и утилиты, которые вы можете использовать, если вам нужно.

  1. класс jav.android.Msg. Имеет набор статических методов. A: методы печати ТОСТОВ Android. B: методы для открытия диалогового окна. Каждый метод требует действительного контекста. Вы можете установить контекст по умолчанию.

  2. Более амбициозный способ - Android Console. Вы создаете дескриптор консоли в своем приложении, которое запускает консоль (если она установлена), и вы можете писать в консоль. Недавно я обновил консоль, чтобы реализовать чтение ввода с консоли. Что не возвращается, пока не будет получен ввод, как на обычной консоли. A: Загрузите и установите консоль Android (получите ее у меня) B: Вместе с ней поставляется файл java (jav.android.console.IConsole). Поместите его в соответствующий каталог. Он содержит методы работы с консолью Android. C: вызвать конструктор, завершающий инициализацию. D: прочтите<*> и напишите в консоль. Еще есть над чем поработать. А именно, поскольку OnServiceConnected не вызывается немедленно, вы не можете использовать IConsole в той же функции, которую вы создали.

  3. Перед созданием Android Console я создал Console Dialog, который был диалоговым окном, работающим в том же приложении и напоминающим консоль. Плюс: не нужно ждать OnServiceConnected, чтобы использовать его. Против: при сбое приложения вы не получаете сообщение о сбое приложения.

Поскольку Android Console - это отдельное приложение в отдельном процессе, если ваше приложение выйдет из строя, вы обязательно увидите ошибку. Кроме того, IConsole устанавливает обработчик неперехваченных исключений в вашем приложении, если вы не заинтересованы в обработке исключений. Он в значительной степени выводит трассировки стека и сообщения об исключениях в консоль Android. Наконец, если консоль Android выходит из строя, она отправляет вам трассировку стека и исключения, и вы можете выбрать приложение для чтения. На самом деле AndroidConsole не требуется для сбоя.

Edit Extras Я заметил, что у моего пока APK Builder нет LogCat; АИДЕ делает. Потом я понял, что все равно пользуюсь моей консолью Android.

  1. Консоль Android спроектирована так, чтобы занимать только часть экрана, поэтому вы можете видеть как свое приложение, так и данные, отправленные из вашего приложения на консоль. Это невозможно с AIDE. Итак, я хочу прикоснуться к экрану и увидеть координаты, консоль Android упрощает это.

  2. Консоль Android спроектирована так, чтобы всплывать, когда вы пишете в нее.

  3. Консоль Android скроется при нажатии.

Недавно я заметил ту же проблему в Android Studio 3.3. Я просто закрыл другие проекты студии Android, и Logcat начал работать. Выше принятый ответ совсем не логичен.

Другие вопросы по тегам