Mengapa "System.out.println" tidak berfungsi di Android?


191

Saya ingin mencetak sesuatu di konsol, sehingga saya bisa men-debugnya. Tapi untuk beberapa alasan, tidak ada yang tercetak di aplikasi Android saya.

Bagaimana cara saya debug?

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
Meskipun Anda sudah mendapatkan jawaban Anda di bawah ini, saya ingin menambahkan bahwa output dari pernyataan SOP diarahkan ke LogCat juga: hanya bahwa nama tag akan menjadi System.out
Samuh

1
Sebelum 0,9 System.out hilang, saya pikir. Setelah itu diteruskan ke keluaran logcat: code.google.com/p/android/issues/detail?id=92 . (Jika Anda menggunakan pustaka yang ada atau yang menggunakan System.out, benar atau salah, itu akan muncul di logcat dengan versi Android yang lebih baru.)
Charlie Collins

kita bisa melihat System.out.printlns di dalam logcat.
rDroid

Jawaban:


211

Koreksi:

Pada emulator dan sebagian besar perangkat System.out.printlnakan dialihkan ke LogCat dan dicetak menggunakan Log.i(). Ini mungkin tidak benar pada versi Android yang sangat lama atau khusus.

Asli:

Tidak ada konsol untuk mengirim pesan sehingga System.out.printlnpesan hilang. Dengan cara yang sama ini terjadi ketika Anda menjalankan aplikasi Java "tradisional" denganjavaw .

Sebagai gantinya, Anda dapat menggunakan kelas AndroidLog :

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

Anda kemudian dapat melihat log di tampilan Logcat di Eclipse, atau dengan menjalankan perintah berikut:

adb logcat

Adalah baik untuk membiasakan diri melihat keluaran logcat karena itu juga tempat Stack Traces dari setiap Pengecualian yang tidak tertangkap ditampilkan.

Entri pertama untuk setiap panggilan logging adalah tag log yang mengidentifikasi sumber pesan log. Ini bermanfaat karena Anda dapat memfilter keluaran log untuk hanya menampilkan pesan Anda. Untuk memastikan bahwa Anda konsisten dengan tag log Anda, mungkin yang terbaik adalah mendefinisikannya sekali sebagai suatu static final Stringtempat.

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

Ada lima metode satu huruf yang Logterkait dengan level berikut:

  • e() - Kesalahan
  • w() - Peringatan
  • i() - Informasi
  • d() - Debug
  • v() - Verbose
  • wtf() - Kegagalan yang Mengerikan

The dokumentasi mengatakan berikut tentang tingkat :

Verbose tidak boleh dikompilasi ke dalam aplikasi kecuali selama pengembangan. Debug log dikompilasi tetapi dilucuti saat runtime. Kesalahan, peringatan dan log info selalu disimpan.


30
Sebenarnya - System.out mencetak ke LogCat melalui Log.i ().
kaspermoerch

7
@ JosephEarl - Jangan ragu untuk menggunakan tombol Edit.
Dave Webb

10
ada juga Log.wtf () :-)
Zorb

2
System.out.println ditampilkan di Android Studio, di bawah Monitor Android. Ini ditampilkan sebagai "I / System.out"
PVS

Pustaka tambahan Konsol baru juga sangat berguna.
PaulMcG


13

Ya itu. Jika Anda menggunakan emulator, itu akan ditampilkan di tampilan Logcat di bawah System.outtag. Tulis sesuatu dan coba di emulator Anda.


2
Tambahan untuk jawaban ini perlu diingat bahwa beberapa kali "terjadi sesuatu" dan tidak ada input yang dicetak dengan penggunaan System.out. Jika demikian, coba tutup dan mulai ulang emulator. Ini berhasil untuk saya.
Byron Gavras

1

Tentu saja, untuk melihat hasilnya di logcat, Anda harus mengatur level Log setidaknya ke "Info" ( Level log di logcat ); jika tidak, seperti yang terjadi pada saya, Anda tidak akan melihat hasil Anda.


1

jika Anda benar-benar membutuhkan System.out.println untuk bekerja (mis. ini dipanggil dari perpustakaan pihak ketiga). Anda cukup menggunakan refleksi untuk mengubah bidang di 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(); 
}

Kelas 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

itu tidak ditampilkan di aplikasi Anda ... itu di bawah logcat emulator Anda


1
Ini adalah kalimat pertama OP "Saya ingin mencetak sesuatu di konsol"
Farid

0

Tidak ada tempat di ponsel Anda yang dapat Anda baca System.out.println();

Sebaliknya, jika Anda ingin melihat hasil dari sesuatu yang terlihat di logcat/consolejendela Anda atau membuat Toastatau Snackbar(jika Anda menggunakan perangkat yang lebih baru) muncul di layar perangkat dengan pesan :) Itulah yang saya lakukan ketika saya harus memeriksa misalnya di mana ia pergi dalam switch casekode! Selamat coding! :)


1
Ketika saya mengklik Android Monitordan kemudian logcat, saya melihat banyak pesan yang terus-menerus dicetak ... Apakah seharusnya seperti ini? Lalu bagaimana saya melihat pesan debug saya sendiri?

Saya hanya menggulirkan hal-hal lain dan menemukannya: D
Valentin Filyov


0

Saya akan meninggalkan ini untuk pengunjung lebih lanjut karena bagi saya itu adalah sesuatu tentang utas utama yang tidak dapat 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;
}
}

Pemakaian: LogUtil.println("This is a string");


-5

Baru-baru ini saya perhatikan masalah yang sama di Android Studio 3.3. Saya menutup proyek studio Android lainnya dan Logcat mulai bekerja. Jawaban yang diterima di atas sama sekali tidak logis.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.