Почему бы и нет " системы.из.println " работа в Android?


Я хочу напечатать что-то в консоли, так что я могу отладить его. Но по какой-то причине в моем 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");
    }
7 166

7 ответов:

устранение:

На эмуляторе и большинстве устройств 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, как это также, где отображаются следы стека любых неперехваченных исключений.

первая запись в каждом вызове журнала является тегом журнала, который идентифицирует источник сообщения журнала. Это полезно, Так как вы можете отфильтровать вывод журнала, чтобы показать только ваши сообщения. Чтобы убедиться, что вы согласуетесь с тегом журнала, вероятно, лучше всего определить его один раз как static final String куда-то.

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

есть пять однобуквенных методов в Log соответствует следующим уровням:

  • e() ошибка
  • w() предупреждения
  • i() - Информация
  • d() - Debug
  • v() - многословный
  • wtf() - какой ужасный провал

The документация говорит следующее об уровнях:

подробный никогда не должен быть скомпилирован в приложение, кроме как во время разработки. Журналы отладки компилируются, но удаляются во время выполнения. Журналы ошибок, предупреждений и информации всегда хранятся.

использовать Log class. Вывод виден с помощью LogCat

Да, это делает. Если вы используете эмулятор, он будет отображаться в представлении Logcat под System.out тег. Напишите что-нибудь и попробуйте в своем эмуляторе.

конечно, чтобы увидеть результат в logcat, вы должны установить уровень журнала по крайней мере на" Info" (уровень журнала в logcat); в противном случае, как это случилось со мной, вы не увидите свой выход.

там нет места на вашем телефоне, что вы можете прочитать System.out.println();

вместо этого, если вы хотите увидеть результат чего-то либо посмотрите на ваш

Если вам действительно нужна система.из.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(); 
}

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