web-dev-qa-db-ja.com

Androidで「System.out.println」が機能しないのはなぜですか?

デバッグできるように、コンソールに何かを印刷したい。しかし、何らかの理由で、私の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");
    }
179
TIMEX

修正:

エミュレータおよびほとんどのデバイスでは、System.out.printlnはLogCatにリダイレクトされ、Log.i()を使用して出力されます。これは、非常に古いバージョンまたはカスタムAndroidバージョンでは当てはまらない場合があります。

オリジナル:

メッセージを送信するコンソールがないため、System.out.printlnメッセージは失われます。同じように、javawを指定して「従来の」Javaアプリケーションを実行すると、これが起こります。

代わりに、 Android Log class を使用できます。

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

その後、EclipseのLogcatビューでログを表示するか、次のコマンドを実行します。

adb logcat

Logcatの出力を確認する習慣を身に付けるのは良いことです。これは、キャッチされていない例外のスタックトレースも表示される場所です。

すべてのロギングコールへの最初のエントリは、ログメッセージのソースを識別するログタグです。これは、ログの出力をフィルタリングしてメッセージだけを表示できるため便利です。ログタグと一貫性を保つために、おそらくどこかでstatic final Stringとして一度定義することをお勧めします。

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

Logには、次のレベルに対応する1文字のメソッドが5つあります。

  • e()-エラー
  • w()-警告
  • i()-情報
  • d()-デバッグ
  • v()-詳細
  • wtf()-なんというひどい失敗

ドキュメントはレベルについて次のように述べています

開発中を除いて、冗長をアプリケーションにコンパイルしないでください。デバッグログはコンパイルされますが、実行時に削除されます。エラー、警告、および情報ログは常に保持されます。

196
Dave Webb

ログクラス を使用します。 LogCatで表示される出力

18
Maurits Rijk

はい、そうです。エミュレータを使用している場合、System.outタグの下のLogcatビューに表示されます。何かを書いて、エミュレータで試してください。

12
kaushikSuman

もちろん、logcatで結果を表示するには、少なくとも「Info」にログレベルを設定する必要があります( logcatのログレベル );そうしないと、偶然にも、出力が表示されません。

2
Marc

本当に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;
        }
    }
}
2
7heaven

アプリケーションには表示されません...エミュレータのlogcatの下にあります

1
ALSP

あなたの電話にはSystem.out.println();を読むことができる場所がありません

代わりに、何かの結果を見たい場合は、logcat/consoleウィンドウを見るか、ToastまたはSnackbar(新しいデバイスを使用している場合)をデバイスの画面にメッセージとともに表示します:) switch caseコードのどこにあるかを確認する必要があります!コーディングを楽しんでください! :)

1
Valentin Filyov

System.out.println( "...")は、Android St​​udioのAndroidモニターに表示されます。

0
Wesos de Queso

これは、メインスレッドが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");

0
Nut eater