Чому “System.out.println” не працює в Android?


191

Я хочу надрукувати щось у консолі, щоб я міг налагодити це. Але чомусь у моєму додатку 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");
    }

4
Хоча ви отримали свою відповідь нижче, я хотів би додати, що вихід SOP-операторів спрямований також на LogCat: лише те, що ім'я тегу буде System.out
Самух

1
Перш ніж 0,9 System.out було втрачено, я думаю. Після його передачі до виходу logcat: code.google.com/p/android/isissue/detail?id=92 . (Якщо ви використовуєте наявну бібліотеку або таку, яка використовує System.out, правильно чи неправильно, вона з’явиться в logcat з пізнішими версіями Android.)
Charlie Collins

ми можемо бачити System.out.printlns всередині logcat.
rDroid

Відповіді:


212

Виправлення:

На емуляторі більшість пристроїв System.out.printlnпереспрямовується на LogCat та друкується за допомогоюLog.i() . Це може бути неправдою для дуже старих або користувальницьких версій Android.

Оригінал:

Немає консолі для надсилання повідомлень, щоб System.out.printlnповідомлення загубилися. Таким же чином це відбувається під час запуску "традиційного" додатку Java з javaw.

Натомість ви можете використовувати клас AndroidLog :

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() - Яка жахлива невдача

Документація говорить наступне про рівні :

Дослідний текст ніколи не повинен складатися в додаток, за винятком під час розробки. Журнали налагодження складаються у, але позбавлені під час виконання. Журнали помилок, попереджень та інформації завжди зберігаються.


30
Насправді - System.out друкує до LogCat через Log.i ().
kaspermoerch

7
@JosephEarl - Не соромтеся використовувати кнопку Правка.
Дейв Вебб

10
є також Log.wtf () :-)
Zorb

2
System.out.println відображається в Android Studio під Android Monitor. Вони показані як "I / System.out"
PVS

Нова бібліотека додатків для консолей також дуже корисна.
PaulMcG


13

Так. Якщо ви використовуєте емулятор, він відображатиметься у вікні Logcat під System.outтегом. Напишіть щось і спробуйте в своєму емуляторі.


2
Додатково до цієї відповіді майте на увазі, що іноді "щось трапляється", і жодне введення не друкується із використанням System.out. У цьому випадку спробуйте закрити та перезавантажте емулятор. Це працювало для мене.
Байрон Гаврас

1

Звичайно, щоб побачити результат у logcat, слід встановити рівень Журналу принаймні на "Інформація" ( Log log у logcat ); інакше, як це сталося зі мною, ви не побачите свого результату.


1

якщо вам дійсно потрібен 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;
        }
    }
}

1

він не відображається у вашій програмі ... він знаходиться під логкатами емулятора


1
Це найперше речення ОП "Я хочу надрукувати щось на консолі"
Фарид,

0

На вашому телефоні немає місця, на якому можна було б прочитати System.out.println();

Натомість, якщо ви хочете побачити результат чогось, або подивіться у своє logcat/consoleвікно, або зробіть на екрані пристрою повідомлення « Toastабо» Snackbar(якщо ви перебуваєте на більш новому пристрої) :) Це те, що я повинен робити, коли мені потрібно перевірити наприклад, де це йде в switch caseкоді! Веселіться кодування! :)


1
Коли я натискаю Android Monitorі потім logcat, я бачу багато друкуючих повідомлень, які постійно друкуються ... Це повинно бути таким? Тоді як я бачу власні повідомлення про налагодження?

Я просто прокручую інші речі і знаходжу це: D
Валентин Фільов


0

Я залишу це для подальших відвідувачів, оскільки для мене це було те, що головна нитка не змогла 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");


-5

Нещодавно я помітив той самий випуск в Android Studio 3.3. Я закрив інші проекти студій Android і Logcat почав працювати. Прийнята вище відповідь зовсім не логічна.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.