Dlaczego nie " System.Wynocha.println " praca w Androidzie?

Chcę wydrukować coś w konsoli, aby móc to debugować. Ale z jakiegoś powodu nic nie drukuje w mojej aplikacji na Androida.

Jak więc debugować?

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");
    }
Author: nbro, 2010-02-08

11 answers

Korekta:

Na emulatorze i większości urządzeń System.out.println zostaje przekierowany do LogCat i wydrukowany za pomocą Log.i(). Może to nie być prawda w bardzo starych lub niestandardowych wersjach Androida.

Oryginalny:

Nie ma konsoli do wysyłania wiadomości, więc wiadomości System.out.println gubią się. W ten sam sposób dzieje się to, gdy uruchamiasz "tradycyjną" aplikację Java z javaw.

Zamiast tego możesz użyć Androida Log Klasa :

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

Możesz następnie wyświetlić dziennik w widoku Logcat w Eclipse, lub wykonując następujące polecenie:

adb logcat

Dobrze jest wczuć się w nawyk patrzenia na wyjście logcat, ponieważ tam również wyświetlane są ślady stosu wszelkich nieobciążonych WYJĄTKÓW.

Pierwszym wpisem każdego wywołania logowania jest znacznik dziennika, który identyfikuje źródło wiadomości dziennika. Jest to pomocne, ponieważ można filtrować wyjście dziennika, aby pokazać tylko wiadomości. Aby upewnić się, że jesteś zgodny ze swoim tagiem dziennika, prawdopodobnie najlepiej jest zdefiniować go raz jako static final String gdzieś.

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

Istnieje pięć metod jednoliterowych w Log odpowiadających następującym poziomom:

  • e() - Błąd
  • w() - Ostrzeżenie
  • i() - Informacje
  • d() - Debug
  • v() - Verbose
  • wtf() - co za straszna porażka

The dokumentacja mówi co następuje o poziomach :

Verbose nigdy nie powinien być kompilowany do aplikacji, z wyjątkiem okresu programowania. Dzienniki debugowania są kompilowane, ale usuwane w czasie wykonywania. Dzienniki błędów, ostrzeżeń i informacji są zawsze przechowywane.

 215
Author: Dave Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 14:20:54

Użyj klasy Log . Wyjście widoczne za pomocą LogCat

 18
Author: Maurits Rijk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-08 09:27:46

Tak. Jeśli używasz emulatora, będzie on widoczny w widoku Logcat pod tagiem System.out. Napisz coś i spróbuj w emulatorze.

 15
Author: kaushikSuman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 21:26:27

Oczywiście, aby zobaczyć wynik w logcat, powinieneś ustawić poziom dziennika co najmniej Na "Info" (poziom dziennika w logcat); w przeciwnym razie, jak to się stało, nie zobaczysz swojego wyniku.

 2
Author: Marc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 08:24:15

Jeśli naprawdę potrzebujesz Systemu.Wynocha.println do pracy (np. nazywa się z trzeciej biblioteki). możesz po prostu użyć reflection, aby zmienić pole w systemie.klasa:

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(); 
}

Klasa 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;
        }
    }
}
 2
Author: 7heaven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 09:16:40

Nie jest wyświetlany w Twojej aplikacji... jest pod logcat emulatora

 2
Author: ALSP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-25 00:20:14

W Twoim telefonie nie ma miejsca, gdzie możesz przeczytać System.out.println();

Zamiast tego, jeśli chcesz zobaczyć wynik czegoś, spójrz na swoje okno logcat/console lub ustaw Toast lub Snackbar (Jeśli używasz nowszego urządzenia) na ekranie urządzenia z Komunikatem :) To właśnie robię, gdy muszę sprawdzić na przykład, gdzie to idzie w kodzie switch case! Baw się dobrze kodując! :)

 0
Author: Valentin Filyov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-24 10:24:33

System.Wynocha.println("...") jest wyświetlany na monitorze Androida w Android Studio

 0
Author: Wesos de Queso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-24 20:56:24

Zostawię to dla dalszych odwiedzających, ponieważ dla mnie było to coś o tym, że główny wątek nie jest w stanie 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;
}
}

Użycie: LogUtil.println("This is a string");

 0
Author: Nut eater,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-14 18:53:16

Nie mam fantazji IDE, aby używać LogCat, ponieważ używam mobilnego IDE.

Musiałem użyć różnych innych metod i mam klasy i narzędzia, z których możesz korzystać, jeśli potrzebujesz.

  1. Klasa jav.android.Msg. Posiada zbiór metod statycznych. O: metody drukowania toastów na Androida. B: metody wyświetlania okna dialogowego. Każda metoda wymaga poprawnego kontekstu. Możesz ustawić domyślny kontekst.

  2. Bardziej ambitny sposób, konsola z Androidem. Tworzysz uchwyt do konsoli w aplikacji, która uruchamia konsolę(jeśli jest zainstalowana), i można pisać na konsoli. Niedawno zaktualizowałem konsolę, aby zaimplementować odczyt danych wejściowych z konsoli. Który nie zwraca dopóki wejście nie zostanie odebrane, jak zwykła konsola. Odp: Pobierz i zainstaluj konsolę Android (pobierz ją ode mnie) B: wraz z nim dostarczany jest plik java (jav.android.konsola.IConsole). Umieść go w odpowiednim katalogu. Zawiera metody obsługi konsoli Android. C: zadzwoń do konstruktora który kończy inicjalizację. D: Przeczytaj i napisz konsolę. Jest jeszcze coś do zrobienia. Mianowicie, ponieważ OnServiceConnected nie jest wywoływany natychmiast, nie można użyć IConsole w tej samej funkcji, którą utworzyłeś.

  3. Przed utworzeniem konsoli Android, utworzyłem okno dialogowe konsoli, które było dialogiem działającym w tej samej aplikacji, aby przypominało konsolę. Pro: nie trzeba czekać na OnServiceConnected, aby go użyć. Con: gdy aplikacja się zawiesza, nie dostajesz wiadomości, że rozbił się app.

Ponieważ konsola Android jest oddzielną aplikacją w oddzielnym procesie, jeśli aplikacja ulegnie awarii, zdecydowanie zobaczysz błąd. Ponadto IConsole ustawia uncaught exception handler w aplikacji okrywać nie są chętni w obsłudze WYJĄTKÓW. Praktycznie drukuje ślady stosu i komunikaty WYJĄTKÓW na konsolę Android. Wreszcie, jeśli konsola Android ulegnie awarii, wyśle do Ciebie swoją stacktrace i wyjątki, a Ty możesz wybrać aplikację, aby ją przeczytać. W rzeczywistości AndroidConsole nie jest wymagane do rozbicia.

Edytuj Dodatki Zauważyłem, że mój while APK Builder nie ma LogCat; AIDE tak. Potem zdałem sobie sprawę, że profesjonalista korzysta z mojej konsoli Android w każdym razie.

  1. Konsola Android zajmuje tylko część ekranu, dzięki czemu można zobaczyć zarówno aplikację, jak i dane emitowane z aplikacji do konsoli. To nie jest możliwe z AIDE. Więc chcę dotknąć ekranu i zobaczyć współrzędne, konsola Android sprawia, że to spokojnie.

  2. Konsola Android jest zaprojektowana tak, aby wyskakiwała podczas pisania na nią.

  3. Konsola Android ukryje się podczas backpress.

 0
Author: user13947194,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-16 15:50:02

Ostatnio zauważyłem ten sam problem w Android Studio 3.3. Zamknąłem inne projekty Android studio i Logcat zaczął działać. Przyjęta powyżej odpowiedź nie jest wcale logiczna.

 -5
Author: Ronak Desai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-24 09:39:56