Как увидеть массив в LogCat для Android - PullRequest
9 голосов
/ 30 января 2012

Я бы хотел записывать необработанные данные, такие как массивы, в мой logcat, чтобы я знал, что выводится.Допустим, у меня есть массив ... вот так:

File[] mp3List = ...
Log.v("test", mp3List);

Почему я не могу просто записать массив в консоль?Как я могу это сделать?

Ответы [ 5 ]

14 голосов
/ 30 января 2012

Вы не можете записать массив, потому что это просто Объект. LogCat не имеет ни малейшего представления о том, как с ним работать или отображать его так, как вы хотите.

Если у каждого объекта File есть метод toString (), который отображает информацию, которую вы хотите использовать:

Log.v(Arrays.toString(mp3List));

В противном случае вам придется объединить свою собственную строку в журнал:

StringBuilder sb = new StringBuilder();
for(File f : mp3List) {
  sb.append(f.getName());
}

Log.v(sb.toString());
10 голосов
/ 30 января 2012

Причина, по которой это не работает, заключается в том, что второй аргумент Log.v - это String, а не File[].Java строго поддерживает типы аргументов.

Обновление :

Вы можете легко преобразовать информацию, содержащуюся в объекте File, в объект String.Все java-объекты реализуют toString(), который, если я правильно помню, возвращает комбинацию ClassName и address объекта.Однако это обычно не содержит полезной информации.Поэтому вам нужно определить преобразование самостоятельно.

Теперь преобразовать из File[] в String сложнее, потому что при вызове метода в массиве он работает с объектом массива, а не с членамимассив (который содержит информацию, которая, как я подозреваю, вас волнует).Поэтому вызов mp3List.toString() вернет единственную строку, которая описывает объект массива, а не информацию, содержащуюся в массиве.

Так что вы, вероятно, захотите написать такой метод:

String fileArrayToString(File[] f){
    String output = "";
    String delimiter = "\n" // Can be new line \n tab \t etc...
    for (int i=0; i<f.length; i++)
    {
        output = output + f[i].getPath() + delimiter;
    }

    return output;
}

А затем позвоните, сделайте ваш журнал вызовов следующим образом:

Log.v("MyTag", fileArraytoString(mp3List);

Однако это может быть трудно прочитать.

Я лично сделал бы это так:

for (int i=0; i<mp3List.legnth; i++)
    Log.v("MyTag", Integer.toString(i) + ":" + mp3List[i].getPath());

Это проще, производит более чистые сообщения журнала и легче понять, что происходит как программист.

1 голос
/ 30 января 2012

Если у вас есть массив String, вы можете просто добавить к нему toString (), и он будет отображен.

Для пользовательских объектов следует переопределить метод toString () и вывести то, что вы хотите увидетьдля этого объекта.Если у вас есть массив, он будет напечатан с выводом метода toString.

0 голосов
/ 24 марта 2014

Мне больше нравятся лайнеры:

for(File file:list) Log.d(TAG, "list: " + file.getPath());

0 голосов
/ 30 января 2012

Может быть, я неправильно понял, но я думаю, что это просто:

string sLog = "";
for(mp3List..)
{
    sLog += mp3List[i].getName();
}

Log.v(sLog);

не так ли?Потому что, я полагаю, когда вы попытаетесь напечатать такой массив, вы получите запись в журнале о том, что mp3List является System.Blah.Blah.File[] ..

Надеюсь, это поможет ..

...