ทำไม“ 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
Samuh

1
ก่อน 0.9 System.out หายไปฉันคิดว่า หลังจากที่มันถูกส่งผ่านไปยังการส่งออก logcat นี้: code.google.com/p/android/issues/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ด้วย

คุณสามารถใช้คลาสAndroid แทนได้Log :

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

จากนั้นคุณสามารถดูบันทึกในมุมมองLogcatใน Eclipse หรือโดยเรียกใช้คำสั่งต่อไปนี้:

adb logcat

มันเป็นการดีที่จะเข้าสู่นิสัยของการดูผลลัพธ์ของ logcat ซึ่งเป็นที่ซึ่ง Stack Traces ของข้อยกเว้นที่ไม่ได้ตรวจสอบจะแสดงขึ้นมา

รายการแรกในทุกการบันทึกการโทรคือแท็กบันทึกซึ่งระบุแหล่งที่มาของข้อความบันทึก สิ่งนี้มีประโยชน์เนื่องจากคุณสามารถกรองผลลัพธ์ของบันทึกเพื่อแสดงเฉพาะข้อความของคุณ เพื่อให้แน่ใจว่าคุณสอดคล้องกับแท็กบันทึกของคุณก็อาจดีที่สุดในการกำหนดที่มันเคยเป็นstatic final Stringที่ไหนสักแห่ง

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

มีวิธีหนึ่งตัวอักษรห้าวิธีที่Logสอดคล้องกับระดับต่อไปนี้:

  • e() - ข้อผิดพลาด
  • w() - คำเตือน
  • i() - ข้อมูล
  • d() - แก้ไขข้อบกพร่อง
  • v() - verbose
  • wtf() - ความล้มเหลวแย่เหลือเกิน

เอกสารกล่าวว่าต่อไปนี้เกี่ยวกับระดับที่ :

ไม่ควรรวบรวมข้อมูล verbose ลงในแอปพลิเคชันยกเว้นในระหว่างการพัฒนา บันทึกการดีบักจะถูกคอมไพล์ แต่ถูกตัดออกตอนรันไทม์ บันทึกข้อผิดพลาดคำเตือนและข้อมูลจะถูกเก็บไว้เสมอ


30
จริง - System.out พิมพ์ไปที่ LogCat ผ่าน Log.i ()
kaspermoerch

7
@JosephEarl - อย่าลังเลที่จะใช้ปุ่มแก้ไข
Dave Webb

10
นอกจากนี้ยังมี Log.wtf () :-)
Zorb

2
System.out.println ไม่แสดงใน Android Studio ภายใต้ Android Monitor สิ่งเหล่านี้แสดงเป็น "I / System.out"
PVS

ไลบรารี Add-in Console ใหม่นี้มีประโยชน์อย่างมาก
PaulMcG


13

ใช่แล้ว. หากคุณใช้อีมูเลเตอร์มันจะแสดงในมุมมอง Logcat ใต้System.outแท็ก เขียนอะไรสักอย่างแล้วลองในอีมูเลเตอร์ของคุณ


2
เพิ่มเติมจากคำตอบนี้โปรดจำไว้ว่าบางครั้ง "บางสิ่งบางอย่างเกิดขึ้น" และไม่มีการป้อนข้อมูลที่พิมพ์ด้วยการใช้ System.out หากเป็นกรณีนี้ให้ลองปิดและรีสตาร์ทตัวจำลอง สิ่งนี้ใช้ได้สำหรับฉัน
Byron Gavras

1

แน่นอนเพื่อดูผลลัพธ์ใน logcat คุณควรตั้งระดับ Log อย่างน้อยเป็น "Info" ( ระดับ 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

ไม่ปรากฏในแอปพลิเคชันของคุณ ... อยู่ภายใต้ logcat ของอีมูเลเตอร์


1
นี่เป็นประโยคแรกของ OP "ฉันต้องการพิมพ์บางอย่างในคอนโซล"
Farid

0

ไม่มีสถานที่ในโทรศัพท์ของคุณที่คุณสามารถอ่าน System.out.println();

แต่ถ้าคุณต้องการเห็นผลลัพธ์ของบางสิ่งบางอย่างอาจมองที่logcat/consoleหน้าต่างของคุณหรือสร้างToastหรือ a Snackbar(หากคุณใช้อุปกรณ์ที่ใหม่กว่า) ปรากฏบนหน้าจอของอุปกรณ์พร้อมกับข้อความ :) นั่นคือสิ่งที่ฉันต้องทำเมื่อฉันต้องตรวจสอบ ตัวอย่างเช่นมันจะไปในswitch caseรหัส! ขอให้สนุกกับการเข้ารหัส! :)


1
เมื่อฉันคลิกAndroid Monitorและจากนั้นlogcatฉันเห็นข้อความจำนวนมากที่ถูกพิมพ์อย่างต่อเนื่อง ... มันควรจะเป็นเช่นนี้หรือไม่? จากนั้นฉันจะเห็นข้อความแก้ไขข้อบกพร่องของตัวเองได้อย่างไร

ฉันเพียงแค่เลื่อนผ่านสิ่งอื่น ๆ และค้นหา: D
Valentin Filyov


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 เริ่มทำงาน คำตอบที่ยอมรับข้างต้นไม่สมเหตุสมผลเลย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.