Tại sao không System System.out.println đá hoạt động trong Android?


191

Tôi muốn in một cái gì đó trong giao diện điều khiển, để tôi có thể gỡ lỗi nó. Nhưng vì một số lý do, không có gì in trong ứng dụng Android của tôi.

Làm thế nào để tôi gỡ lỗi sau đó?

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
Mặc dù bạn đã có câu trả lời của mình bên dưới, tôi cũng muốn thêm rằng đầu ra của các câu lệnh SOP cũng được chuyển đến LogCat: chỉ có tên thẻ sẽ là System.out
Samuh

1
Trước khi 0.9 System.out bị mất, tôi nghĩ vậy. Sau khi nó được chuyển đến đầu ra logcat: code.google.com/p/android/issues/detail?id=92 . (Nếu bạn đang sử dụng một thư viện hiện có hoặc sử dụng System.out, đúng hay sai, nó sẽ hiển thị trong logcat với các phiên bản Android mới hơn.)
Charlie Collins

chúng ta có thể thấy System.out.printlns bên trong logcat.
rDroid

Câu trả lời:


211

Điều chỉnh:

Trên trình giả lập và hầu hết các thiết bị System.out.printlnđược chuyển hướng đến LogCat và được in bằng Log.i(). Điều này có thể không đúng trên các phiên bản Android rất cũ hoặc tùy chỉnh.

Nguyên:

Không có giao diện điều khiển để gửi tin nhắn đến để System.out.printlntin nhắn bị mất. Theo cách tương tự, điều này xảy ra khi bạn chạy một ứng dụng Java "truyền thống" javaw.

Thay vào đó, bạn có thể sử dụng lớp AndroidLog :

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

Sau đó, bạn có thể xem nhật ký trong khung nhìn Logcat trong Eclipse hoặc bằng cách chạy lệnh sau:

adb logcat

Thật tốt khi có thói quen nhìn vào đầu ra logcat vì đó cũng là nơi hiển thị Dấu vết ngăn xếp của bất kỳ trường hợp ngoại lệ nào.

Mục nhập đầu tiên cho mỗi cuộc gọi đăng nhập là thẻ nhật ký xác định nguồn của thông điệp tường trình. Điều này rất hữu ích vì bạn có thể lọc đầu ra của nhật ký để chỉ hiển thị các tin nhắn của bạn. Để đảm bảo rằng bạn phù hợp với thẻ nhật ký của mình, có lẽ tốt nhất là xác định nó một lần làstatic final String ở đâu đó.

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

Có năm phương thức một chữ cái Logtương ứng với các cấp độ sau:

  • e() - Lỗi
  • w() - Cảnh báo
  • i() - Thông tin
  • d() - Gỡ lỗi
  • v() - Rực rỡ
  • wtf() - Thật là một thất bại khủng khiếp

Các tài liệu nói sau đây về các cấp độ :

Verbose không bao giờ nên được biên dịch thành một ứng dụng trừ khi phát triển. Nhật ký gỡ lỗi được biên dịch trong nhưng bị tước khi chạy. Nhật ký lỗi, cảnh báo và thông tin luôn được lưu giữ.


29
Trên thực tế - System.out in ra LogCat thông qua Log.i ().
kaspermoerch

7
@JosephEarl - Hãy sử dụng nút Chỉnh sửa.
Dave Webb

10
Ngoài ra còn có Log.wtf () :-)
Zorb

2
System.out.println hiển thị trong Android Studio, dưới Màn hình Android. Chúng được hiển thị dưới dạng "I / System.out"
PVS

Thư viện bổ trợ Console mới cũng rất hữu ích.
PaulMcG


13

Có nó làm. Nếu bạn đang sử dụng trình giả lập, nó sẽ hiển thị trong chế độ xem Logcat bên dưới System.outthẻ. Viết một cái gì đó và thử nó trong trình giả lập của bạn.


2
Bổ sung cho câu trả lời này, hãy nhớ rằng đôi khi "điều gì đó xảy ra" và không có đầu vào nào được in bằng cách sử dụng System.out. Nếu trường hợp này cố gắng đóng và khởi động lại trình giả lập. Điều này làm việc cho tôi.
Byron Gavras

1

Tất nhiên, để xem kết quả trong logcat, bạn nên đặt mức Nhật ký ít nhất là "Thông tin" ( Mức nhật ký trong logcat ); mặt khác, như đã xảy ra với tôi, bạn sẽ không thấy đầu ra của mình.


1

nếu bạn thực sự cần System.out.println để hoạt động (ví dụ: nó được gọi từ thư viện bên thứ ba). bạn chỉ có thể sử dụng sự phản chiếu để thay đổi trường trong 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(); 
}

Lớp 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

nó không được hiển thị trong ứng dụng của bạn ... nó nằm dưới logcat của trình giả lập của bạn


1
Đây là câu đầu tiên của OP "Tôi muốn in một cái gì đó trong bảng điều khiển"
Farid

0

Không có chỗ nào trên điện thoại của bạn mà bạn có thể đọc System.out.println();

Thay vào đó, nếu bạn muốn xem kết quả của một cái gì đó nhìn vào logcat/consolecửa sổ của bạn hoặc làm cho một Toasthoặc Snackbar(nếu bạn đang ở trên một thiết bị mới hơn) xuất hiện trên màn hình của thiết bị với thông báo :) Đó là những gì tôi làm khi phải kiểm tra ví dụ nơi nó đi trong một switch casemã! Hãy vui vẻ viết mã! :)


1
Khi tôi nhấp vào Android Monitorvà sau đó logcat, tôi thấy nhiều tin nhắn liên tục được in ... Nó có phải là như thế này không? Sau đó, làm thế nào tôi có thể xem các thông báo gỡ lỗi của riêng tôi?

Tôi chỉ cần cuộn qua những thứ khác và tìm thấy nó: D
Valentin Filyov

0

System.out.println ("...") được hiển thị trên Màn hình Android trong Android Studio


0

Tôi sẽ để lại cho khách truy cập thêm vì đối với tôi đó là điều gì đó về chủ đề chính không thể 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;
}
}

Sử dụng: LogUtil.println("This is a string");


-5

Gần đây tôi nhận thấy vấn đề tương tự trong Android Studio 3.3. Tôi đã đóng các dự án studio Android khác và Logcat bắt đầu làm việc. Câu trả lời được chấp nhận ở trên là không hợp lý chút nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.