Je veux imprimer quelque chose dans la console afin de pouvoir le déboguer. Mais pour une raison quelconque, rien ne s'imprime dans mon application Android.
Comment puis-je déboguer alors?
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");
}
Correction:
Sur l'émulateur et la plupart des périphériques, System.out.println
est redirigé vers LogCat et imprimé avec Log.i()
. Cela peut ne pas être vrai sur les versions très anciennes ou personnalisées d'Android.
Original:
Il n’existe pas de console où envoyer les messages, les messages System.out.println
sont donc perdus. De la même manière, cela se produit lorsque vous exécutez une application Java "traditionnelle" avec javaw
.
À la place, vous pouvez utiliser la classe Android Log
:
Log.d("MyApp","I am here");
Vous pouvez ensuite afficher le journal dans la vue Logcat dans Eclipse ou en exécutant la commande suivante:
adb logcat
Il est bon de prendre l'habitude de regarder la sortie de logcat car c'est également là que sont affichées les traces de pile de toutes les exceptions non interceptées.
La première entrée de chaque appel de journalisation est la balise de journal qui identifie la source du message de journal. Cela est utile car vous pouvez filtrer la sortie du journal pour afficher uniquement vos messages. Pour vous assurer que vous êtes cohérent avec votre balise de journal, il est probablement préférable de le définir une fois comme un static final String
quelque part.
Log.d(MyActivity.LOG_TAG,"Application started");
Il existe cinq méthodes à une lettre dans Log
correspondant aux niveaux suivants:
e()
- Erreurw()
- Warningi()
- Informationd()
- Debugv()
- Verbosewtf()
- Quel terrible échecLa documentation dit ce qui suit à propos des niveaux :
Verbose ne doit jamais être compilé dans une application, sauf pendant le développement. Les journaux de débogage sont compilés dans mais supprimés au moment de l'exécution. Les journaux d’erreurs, d’avertissements et d’informations sont toujours conservés.
Utilisez la classe Log . Sortie visible avec LogCat
Oui. Si vous utilisez l'émulateur, il apparaîtra dans la vue Logcat sous la balise System.out
. Ecrivez quelque chose et essayez-le dans votre émulateur.
Bien entendu, pour voir le résultat dans logcat, vous devez au moins définir le niveau de journalisation sur "Info" ( Niveau de journalisation dans logcat ); sinon, comme cela m'est arrivé, vous ne verrez pas votre sortie.
si vous avez vraiment besoin que System.out.println fonctionne (par exemple, il est appelé depuis une bibliothèque tierce). vous pouvez simplement utiliser la réflexion pour changer de champ dans 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();
}
Classe 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;
}
}
}
il n'est pas affiché dans votre application ... il se trouve sous le logcat de votre émulateur
Vous ne pouvez pas lire le System.out.println();
sur votre téléphone.
Au lieu de cela, si vous voulez voir le résultat de quelque chose, regardez votre fenêtre logcat/console
ou faites apparaître une Toast
ou une Snackbar
(si vous utilisez un périphérique plus récent) sur l'écran du périphérique avec le message :) faire quand je dois vérifier par exemple où il va dans un code switch case
! Amusez-vous à coder! :)
System.out.println ("...") est affiché sur le moniteur Android dans Android Studio.
Je laisserai cela à d'autres visiteurs, car pour moi, le thread principal était incapable de 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;
}
}
Usage: LogUtil.println("This is a string");