Android में "System.out.println" काम क्यों नहीं करता है?


191

मैं कंसोल में कुछ प्रिंट करना चाहता हूं, ताकि मैं इसे डीबग कर सकूं। लेकिन किसी कारण से, मेरे एंड्रॉइड एप्लिकेशन में कुछ भी प्रिंट नहीं होता है।

फिर मैं कैसे डिबग करूं?

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 । (यदि आप किसी मौजूदा लाइब्रेरी का उपयोग कर रहे हैं या ऐसे सिस्टम का उपयोग कर रहे हैं, जो सही या गलत है, तो यह एंड्रॉइड के दो संस्करणों के साथ लॉगकोट में दिखाई देगा।)
चार्ली कॉलिन्स

हम Logcat के अंदर System.out.printlns देख सकते हैं।
4

जवाबों:


211

भूल सुधार:

एमुलेटर पर और अधिकांश डिवाइस System.out.printlnलॉगकैट पर रीडायरेक्ट हो जाते हैं और प्रिंट करके उपयोग किए जाते हैं Log.i()। यह बहुत पुराने या कस्टम Android संस्करणों पर सही नहीं हो सकता है।

मूल:

संदेश भेजने के लिए कोई कंसोल नहीं है ताकि System.out.printlnसंदेश खो जाएं। उसी तरह से ऐसा होता है जब आप "पारंपरिक" जावा एप्लिकेशन को चलाते हैं javaw

इसके बजाय, आप Android Logवर्ग का उपयोग कर सकते हैं :

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

फिर आप लॉग को एक्लिप्स में लॉगकट दृश्य में देख सकते हैं, या निम्न कमांड चलाकर:

adb logcat

लॉगकैट आउटपुट को देखने की आदत डालना अच्छा है क्योंकि यह भी है जहां किसी भी बिना किसी अपवाद के स्टैक के निशान दिखाए जाते हैं।

हर लॉगिंग कॉल में पहली प्रविष्टि लॉग टैग है जो लॉग संदेश के स्रोत की पहचान करता है। यह मददगार है क्योंकि आप केवल अपने संदेश दिखाने के लिए लॉग के आउटपुट को फ़िल्टर कर सकते हैं। यह सुनिश्चित करने के लिए कि आप अपने लॉग टैग के अनुरूप हैं, इसे static final Stringकहीं एक बार परिभाषित करना सबसे अच्छा है।

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

Logनिम्न स्तरों के अनुरूप पाँच एक-अक्षर विधियाँ हैं:

  • e() - त्रुटि
  • w() - चेतावनी
  • i() - जानकारी
  • d() - डिबग
  • v() - क्रिया
  • wtf() - क्या एक भयानक विफलता

प्रलेखन स्तर के बारे में निम्नलिखित का कहना है :

वर्बोज़ को विकास के दौरान कभी भी एक आवेदन में संकलित नहीं किया जाना चाहिए। डिबग लॉग संकलित हैं, लेकिन रनटाइम पर छीन लिए गए हैं। त्रुटि, चेतावनी और सूचना लॉग हमेशा रखे जाते हैं।


30
दरअसल - System.out, Log.i के माध्यम से LogCat को प्रिंट करता है ()।
kaspermoerch

7
@JosephEarl - संपादित करें बटन का उपयोग करने के लिए स्वतंत्र महसूस करें।
डेव वेब

10
वहाँ भी Log.wtf () है :-)
Zorb

2
System.out.println एंड्रॉइड मॉनिटर के तहत एंड्रॉइड स्टूडियो में दिखाता है। इन्हें 16 I पर "I / System.out"
PVS

नया कंसोल ऐड-इन लाइब्रेरी भी बहुत उपयोगी है।
पॉलमैक्स


13

हाँ यह करता है। यदि आप एमुलेटर का उपयोग कर रहे हैं, तो यह System.outटैग के तहत लॉगकट दृश्य में दिखाई देगा । कुछ लिखें और इसे अपने एमुलेटर में आज़माएं।


2
इस उत्तर के अतिरिक्त यह ध्यान में रखते हैं कि कुछ समय "कुछ होता है" और कोई इनपुट System.out के उपयोग के साथ मुद्रित नहीं होता है। यदि यह मामला एमुलेटर को बंद करने और पुनः आरंभ करने का प्रयास करता है। इसने मेरे लिए काम किया।
बायरन गवरस

1

बेशक, लॉगकैट में परिणाम देखने के लिए, आपको लॉग स्तर को कम से कम "जानकारी" ( लॉग स्तर में लॉग स्तर ) पर सेट करना चाहिए ; अन्यथा, जैसा कि मेरे साथ हुआ है, आप अपना आउटपुट नहीं देखेंगे।


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

यह आपके एप्लिकेशन में प्रदर्शित नहीं होता है ... यह आपके एमुलेटर के लॉगकट के तहत है


1
यह ओपी का पहला वाक्य है "मैं कंसोल में कुछ प्रिंट करना चाहता हूं"
फरीद

0

आपके फोन पर कोई जगह नहीं है जिसे आप पढ़ सकते हैं System.out.println();

इसके बजाय, यदि आप किसी चीज़ का परिणाम देखना चाहते हैं, तो या तो अपनी logcat/consoleखिड़की को देखें Toastया एक Snackbar(यदि आप किसी नए डिवाइस पर हैं) संदेश के साथ डिवाइस की स्क्रीन पर दिखाई दें :) यही वह है जो मुझे जांचना है उदाहरण के लिए यह एक switch caseकोड में कहां जाता है ! मज़ा कोडिंग है! :)


1
जब मैं क्लिक करता हूँ Android Monitorऔर फिर logcat, मुझे कई सारे संदेश लगातार छपे हुए दिखाई देते हैं ... क्या ऐसा होना चाहिए? फिर मैं अपने स्वयं के डिबग संदेशों को कैसे देखूंगा?

मैं अन्य चीजों के माध्यम से स्क्रॉल करता हूं और इसे
पाता हूं


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

हाल ही में मैंने एंड्रॉइड स्टूडियो 3.3 में इसी मुद्दे को देखा। मैंने अन्य एंड्रॉइड स्टूडियो परियोजनाओं को बंद कर दिया और लॉगकैट ने काम करना शुरू कर दिया। ऊपर दिया गया स्वीकृत उत्तर बिल्कुल भी तर्कसंगत नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.