"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
যদিও আপনি নীচে আপনার উত্তর পেয়েছেন, আমি যুক্ত করতে চাই যে এসওপি বিবৃতিগুলির আউটপুটটি লগগিকেটেও নির্দেশিত হয়েছে: কেবলমাত্র ট্যাগ নামটি System.out হবে
সামুহ

1
0.9 সিস্টেম.আউট হারিয়ে যাওয়ার আগে, আমার মনে হয়। এটি লগক্যাট আউটপুট এ যাওয়ার পরে: code.google.com/p/android/issues/detail?id=92 । (আপনি যদি বিদ্যমান লাইব্রেরি ব্যবহার করেন বা এমন সিস্টেম যা ডান বা ভুল ব্যবহার করে System.out ব্যবহার করে তবে এটি অ্যান্ড্রয়েডের পরবর্তী সংস্করণগুলির সাথে লগকটে প্রদর্শিত হবে))
চার্লি কলিন্স

আমরা লগকটের অভ্যন্তরে System.out.printlns দেখতে পাচ্ছি।
rDroid

উত্তর:


211

কারেকশন:

এমুলেটরটিতে এবং বেশিরভাগ ডিভাইসগুলি System.out.printlnলগগিকে পুনঃনির্দেশিত হয় এবং ব্যবহার করে মুদ্রিত হয় Log.i()। এটি খুব পুরানো বা কাস্টম অ্যান্ড্রয়েড সংস্করণে সত্য হতে পারে না।

মূল:

বার্তা প্রেরণের জন্য কোনও কনসোল নেই যাতে System.out.printlnবার্তাটি হারিয়ে যায় lost আপনি যখন "traditionalতিহ্যবাহী" জাভা অ্যাপ্লিকেশনটি চালান তখন একইভাবে এটি ঘটে javaw

পরিবর্তে, আপনি অ্যান্ড্রয়েড Logবর্গ ব্যবহার করতে পারেন :

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

তারপরে আপনি একটিলপসের লগক্যাট ভিউতে লগটি দেখতে পারেন বা নীচের কমান্ডটি চালিয়ে যেতে পারেন:

adb logcat

লগক্যাট আউটপুট দেখার অভ্যাসে প্রবেশ করা ভাল কারণ এটি হ'ল যেখানে কোনও অপ্রয়োজনীয় ব্যতিক্রমগুলির স্ট্যাক ট্রেসগুলি প্রদর্শিত হয়।

প্রতিটি লগিং কলটিতে প্রথম এন্ট্রিটি হ'ল লগ ট্যাগ যা লগ বার্তার উত্স চিহ্নিত করে। আপনি কেবল আপনার বার্তাগুলি দেখানোর জন্য লগের আউটপুট ফিল্টার করতে পারবেন এটি সহায়ক helpful আপনি নিজের লগ ট্যাগের সাথে সামঞ্জস্য রয়েছেন তা নিশ্চিত করার জন্য এটি একবার হিসাবে সংজ্ঞা দেওয়া ভালstatic final String কোথাও ।

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

এখানে পাঁচটি এক-বর্ণের পদ্ধতি রয়েছে Logনিম্নলিখিত স্তরের সাথে :

  • e() - ত্রুটি
  • w() - সতর্কতা
  • i() - তথ্য
  • d() - ডিবাগ
  • v() - ভার্বোজ
  • wtf() - কি ভয়ঙ্কর ব্যর্থতা

ডকুমেন্টেশন মাত্রা সম্পর্কে নিম্নলিখিত বলেছেন :

উন্নয়নের সময় ব্যতীত ভার্বোস কখনই কোনও অ্যাপ্লিকেশনে সংকলন করা উচিত নয়। ডিবাগ লগগুলি সংকলন করা হয় তবে রানটাইমের সময় ছিনতাই হয়। ত্রুটি, সতর্কতা এবং তথ্য লগ সর্বদা রাখা হয়।


30
প্রকৃতপক্ষে - System.out লগইগিকে লগ.ই () এর মাধ্যমে মুদ্রণ করে।
kaspermoerch

7
@ জোসেফারেল - সম্পাদনা বোতামটি নির্দ্বিধায় ব্যবহার করুন।
ডেভ ওয়েব

10
লগ.ইউটিএফ () :-)
জোর্ব

2
System.out.println অ্যান্ড্রয়েড মনিটরের অধীনে অ্যান্ড্রয়েড স্টুডিওতে প্রদর্শিত হয়। এগুলি "আই / সিস্টেম.আউট" হিসাবে দেখানো হয়েছে
পিভিএস

নতুন কনসোল অ্যাড-ইন গ্রন্থাগারটিও খুব দরকারী।
PaulMcG


13

হ্যাঁ এটা করে. আপনি যদি এমুলেটর ব্যবহার করছেন তবে এটি System.outট্যাগের নিচে লোগক্যাট ভিউতে প্রদর্শিত হবে । কিছু লিখুন এবং আপনার এমুলেটর এ চেষ্টা করুন।


2
এই উত্তরটি অতিরিক্ত মনে রাখবেন যে কিছু সময় "কিছু ঘটে" এবং সিস্টেম.আউট ব্যবহারের সাথে কোনও ইনপুট মুদ্রিত হয় না। যদি এই ক্ষেত্রেটি এমুলেটরটি বন্ধ এবং পুনরায় চালু করার চেষ্টা করে। এটি আমার পক্ষে কাজ করেছে।
বায়রন গাভ্রাস

1

অবশ্যই, লগকটের ফলাফলটি দেখতে আপনার লগ স্তরটি কমপক্ষে "ইনফো" তে সেট করা উচিত ( লগকটে লগ স্তর ); অন্যথায়, যেমনটি আমার কাছে হয়েছিল, আপনি নিজের আউটপুট দেখতে পাবেন না।


1

আপনার যদি সত্যই কাজ করার জন্য System.out.println দরকার হয় (উদাঃ এটি তৃতীয় পক্ষের লাইব্রেরি থেকে বলা হয়)। আপনি কেবল সিস্টেম.ক্লাসে ক্ষেত্র পরিবর্তন করতে প্রতিবিম্বটি ব্যবহার করতে পারেন:

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(); 
}

পুনর্নির্দেশ লগআউটপুট স্ট্রিম শ্রেণি:

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

সম্প্রতি আমি একই সমস্যাটি অ্যান্ড্রয়েড স্টুডিও ৩.৩ এ লক্ষ্য করেছি। আমি অন্যান্য অ্যান্ড্রয়েড স্টুডিও প্রকল্পগুলি বন্ধ করে দিয়েছিলাম এবং লগক্যাট কাজ শুরু করে। উপরে গৃহীত উত্তর মোটেই যৌক্তিক নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.