“System.out.println” Android'de neden çalışmıyor?


191

Konsolda bir şey yazdırmak istiyorum, böylece hata ayıklamak için. Ancak bazı nedenlerden dolayı, Android uygulamamda hiçbir şey yazdırılmıyor.

O zaman nasıl hata ayıklayabilirim?

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
Aşağıda cevabınızı almış olsanız da, SOP ifadelerinin çıktısının da LogCat'a yönlendirildiğini eklemek istiyorum: sadece etiket adı System.out
Samuh

1
0.9 System.out kaybedilmeden önce, sanırım. Logcat çıktısına geçtikten sonra: code.google.com/p/android/issues/detail?id=92 . (Varolan bir kitaplığı veya System.out kullanan bir kitaplığı kullanıyorsanız, doğru veya yanlış, daha sonraki Android sürümleriyle logcat'te görünecektir.)
Charlie Collins

logcat içinde System.out.printlns dosyasını görebiliriz.
rDroid

Yanıtlar:


212

Düzeltme:

Emülatörde ve çoğu cihaz System.out.printlnLogCat'e yönlendirilir ve kullanılarak yazdırılır Log.i(). Bu çok eski veya özel Android sürümlerinde doğru olmayabilir.

Orijinal:

İletilerin gönderileceği bir konsol yoktur, böylece System.out.printlniletiler kaybolur. Aynı şekilde bir "geleneksel" Java uygulaması ile çalıştırdığınızda da olur javaw.

Bunun yerine Android Logsınıfını kullanabilirsiniz :

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

Daha sonra günlüğü Eclipse'deki Logcat görünümünde veya aşağıdaki komutu çalıştırarak görüntüleyebilirsiniz:

adb logcat

Yakalanmamış İstisnaların Yığın İzleri'nin görüntülendiği yer olduğu için logcat çıktısına bakma alışkanlığına girmek de iyidir.

Her günlük çağrısına ilk Giriş, günlük iletisinin kaynağını tanımlayan günlük etiketidir. Yalnızca iletilerinizi göstermek için günlük çıktısına filtre uygulayabileceğiniz için bu yararlıdır. Günlük etiketinizle tutarlı olduğunuzdan emin olmak için büyük olasılıkla etiketi bir kez bir static final Stringyerde tanımlamak en iyisidir .

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

LogAşağıdaki düzeylere karşılık gelen beş tek harfli yöntem vardır :

  • e() - Hata
  • w() - Uyarı
  • i() - Bilgi
  • d() - Hata ayıklama
  • v() - Ayrıntılı
  • wtf() - Ne Korkunç Bir Hata

Dokümantasyon düzeyleri hakkında şunları söylüyor :

Verbose, geliştirme haricinde asla bir uygulamada derlenmemelidir. Hata ayıklama günlükleri derlenir, ancak çalışma zamanında çıkarılır. Hata, uyarı ve bilgi günlükleri her zaman saklanır.


30
Aslında - System.out, Log.i () aracılığıyla LogCat'e yazdırır.
kaspermoerch

7
@JosephEarl - Düzenle düğmesini kullanmaktan çekinmeyin.
Dave Webb

10
ayrıca Log.wtf () :-)
Zorb

2
System.out.println, Android Studio'da Android Monitor altında gösterilir. Bunlar "I / System.out" olarak gösterilir
PVS

Yeni Konsol eklenti kütüphanesi de çok kullanışlıdır.
PaulMcG


13

Evet öyle. Öykünücüyü kullanıyorsanız, System.outetiketin altındaki Logcat görünümünde gösterilir . Bir şeyler yazın ve öykünücünüzde deneyin.


2
Bu yanıta ek olarak, bazı zamanlarda "bir şeyler" meydana geldiğini ve System.out kullanımı ile hiçbir girdi yazdırılmadığını unutmayın. Bu durumda öykünücüyü kapatıp yeniden başlatmayı deneyin. Bu benim için çalıştı.
Byron Gavras

1

Tabii ki, sonucu logcat'te görmek için, Log seviyesini en azından "Info" olarak ayarlamanız gerekir ( logcat'te log seviyesi ); aksi halde, başıma gelince, çıktınızı göremezsiniz.


1

gerçekten çalışmak için System.out.println gerekiyorsa (örn. üçüncü taraf kitaplığından çağrılır). System.class içindeki alanı değiştirmek için yansımayı kullanabilirsiniz:

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 sınıfı:

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

uygulamanızda görüntülenmiyor ... emülatörünüzün logcat'inin altında


1
Bu OP "Konsolda bir şey yazdırmak istiyorum" ilk cümlesidir
Farid

0

Telefonunuzda okuyabileceğiniz bir yer yok System.out.println();

Bunun yerine, bir şeyin sonucunu görmek istiyorsanız, logcat/consolepencerenize bakın veya cihazın ekranında mesajla birlikte bir Toastveya a Snackbar(daha yeni bir cihazdaysanız) görünmesini sağlayın :) Kontrol etmek zorunda kaldığımda yaptığım şey bu örneğin bir switch casekod nereye gidiyor ! Eğlenceli kodlama! :)


1
Ben tıkladığımda Android Monitorsonra logcat, ben sürekli basılıyor birçok sayıda ileti bakın ... böyle olması gerekiyordu? O zaman kendi hata ayıklama mesajlarımı nasıl görebilirim?

Sadece diğer şeyleri
kaydırıyorum

0

System.out.println ("..."), Android Studio'daki Android Monitör'de görüntülenir


0

Benim için ana iş parçacığı olmak hakkında bir şey olduğu gibi bu daha fazla ziyaretçi için bırakacağım 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;
}
}

Kullanımı: LogUtil.println("This is a string");


-5

Son zamanlarda Android Studio 3.3'te de aynı sorunu fark ettim. Diğer Android stüdyo projelerini kapattım ve Logcat çalışmaya başladı. Yukarıdaki kabul edilen cevap hiç mantıklı değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.