Почему бы и нет " системы.из.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 ответов:
устранение:
На эмуляторе и большинстве устройств
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()
- Debugv()
- многословный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; } } }