Какова Ваша философия входа?

Измените <view на <View, потому что view не находится в пустом представлении. Это для пользовательского представления, определенного через class attr, как показано ниже:

<view
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    class="com.your.package.YourCustomView" />

И вы получили

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

из-за LayoutInflater пытается разобрать class attr:

LayoutInflater Исходный код

//...
View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,
        boolean ignoreThemeAttr) {
    if (name.equals("view")) { // line 724
        name = attrs.getAttributeValue(null, "class"); // line 725
    }

    // Apply a theme wrapper, if allowed and one is specified.
    if (!ignoreThemeAttr) {
        final TypedArray ta = context.obtainStyledAttributes(attrs, ATTRS_THEME);
        final int themeResId = ta.getResourceId(0, 0);
        if (themeResId != 0) {
            context = new ContextThemeWrapper(context, themeResId);
        }
        ta.recycle();
    }

    if (name.equals(TAG_1995)) { // line 738
        // Let's party like it's 1995!
        return new BlinkLayout(context, attrs);
    }
//...
  • В строке 724 он проверяет, что ваш тэг view и получает true
  • Вкл. строка 725 пытается получить класс через class attr и получает null
  • В строке 738 он пытается проверить тэг blink и получает сбой

Кроме того, есть любопытная вещь, разработчики Android добавили пасхальное яйцо, вы можете попробовать:

<view
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    class="blink">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Some text" />
</view>
22
задан Yuval Adam 14 February 2009 в 05:13
поделиться

10 ответов

Моя философия входа довольно легко получена в итоге в четырех частях:

Аудит или бизнес-логика, регистрирующаяся

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

, Поскольку это - часть требований программы, многие не включают его в их общие обсуждения входа, однако в этих областях существует перекрытие, и для некоторых приложений полезно рассмотреть все операции входа вместе.

Программа, регистрирующаяся

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

В целом этот вход включается и выключается по мере необходимости для сеансов отладки.

Производительность, регистрирующаяся

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

безопасность, регистрирующаяся

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

21
ответ дан Adam Davis 29 November 2019 в 04:29
поделиться

Я работаю с безопасностью, критические системы реального времени и вход часто являются единственным способом поймать редкие ошибки, которые только поднимают каждый 53-й вторник, когда это - полная луна при ловле моего дрейфа. Это отчасти делает Вас одержимыми предметом, таким образом, я принесу извинения теперь, начинаю ли я вскипать во рту.

я разрабатываю системы, которые способны к входу в значительной степени всего, но я не включаю все по умолчанию. Отладочная информация отправляется в скрытое диалоговое окно отладки, которое добавляет метку времени к ней и производит ее к полю списка (ограниченный приблизительно 500 строками перед удалением), и диалоговое окно позволяет мне останавливать ее, сохранять ее к файлу журнала автоматически или отклонять ее к приложенному отладчику, такому как DBWin32. Та диверсия позволяет мне видеть вывод отладки из нескольких приложений все аккуратно сериализированные, который может иногда быть жизненным средством сохранения. Файлы журнала автоматически очищены каждый дни N. Я использовал для использования числовых уровней входа (чем выше Вы устанавливаете уровень, тем больше Вы получаете):

  • прочь
  • ошибки только
  • основной
  • детализировали
  • , все

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

Поэтому теперь я нахожусь в процессе переключения на вход на основе системы флага. Все, что зарегистрировано, имеет детализацию флага, какая операция это, и существует ряд флажков, разрешающих мне определить то, что зарегистрировано. Обычно тот список похож на это:

#define DEBUG_ERROR          1
#define DEBUG_BASIC          2
#define DEBUG_DETAIL         4
#define DEBUG_MSG_BASIC      8
#define DEBUG_MSG_POLL       16
#define DEBUG_MSG_STATUS     32
#define DEBUG_METRICS        64
#define DEBUG_EXCEPTION      128
#define DEBUG_STATE_CHANGE   256
#define DEBUG_DB_READ        512
#define DEBUG_DB_WRITE       1024
#define DEBUG_SQL_TEXT       2048
#define DEBUG_MSG_CONTENTS   4096

Эта система регистрации поставлется со сборкой конечных версий, включенной и сохраняющий в файл по умолчанию. Слишком поздно, чтобы узнать, что необходимо было регистрироваться ПОСЛЕ ТОГО, КАК ошибка произошла, если та ошибка только происходит один раз в шесть месяцев в среднем, и у Вас нет способа воспроизвести его.

программное обеспечение обычно поставлется с ОШИБКОЙ, ОСНОВНОЙ, STATE_CHANGE и включенное ИСКЛЮЧЕНИЕ, но это может быть изменено в поле через диалоговое окно отладки (или установка registry/ini/cfg, где эти вещи сохраняются).

, О, и одна вещь - моя система отладки генерирует один файл в день. Ваши требования могут отличаться. Но удостоверьтесь, что Ваш код отладки запускается каждый файл с датой, версией кода, который Вы выполняете, и, если возможно некоторый маркер для идентификатора клиента, местоположения системы или что бы то ни было. Можно вложить путаницу файлов журнала, прибывающих из поля, и Вам нужна некоторая запись того, что прибыло из того, где и какую версию системы они выполняли, это находится на самом деле в самих данных, и Вы не можете доверять клиенту/наладчику, чтобы сказать Вам, какую версию они имеют - они могут просто сказать Вам, какая версия они ДУМАЮТ, что имеют. Хуже, они могут сообщить о exe версии, это находится на диске, но старая версия все еще работает, потому что они забыли перезагружать после замены. Имейте свой код, говорят Вам сам.

Это - мой выведенный мозг...

15
ответ дан Bob Moore 29 November 2019 в 04:29
поделиться

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

я часто пытаюсь только добавить вход в систему критических мест, где то, что я регистрирую, должно очень редко совершать нападки, иначе Вы получаете проблему как, он упомянул журналов, которые становятся слишком большими..., это - то, почему вход ошибочных случаев является идеальной вещью всегда зарегистрироваться (и замечательно быть в состоянии видеть, когда эти ошибочные случаи на самом деле поражаются так, можно осмотреть проблему далее).

Другие хорошие вещи зарегистрироваться состоят в том, если Вы имеете утверждения и Ваш сбой утверждений, затем регистрируете его... такой как, этот запрос должен находиться под 10 результатами, если это больше может быть проблема, так зарегистрируйте его. Конечно, если оператор журнала заканчивает тем, что заполнил журналы, это - вероятно, подсказка, чтобы или поместить его в своего рода уровень "отладки", или скорректировать или удалить оператор журнала. Если журналы станут слишком большими, Вы будете часто заканчивать тем, что игнорировали их.

4
ответ дан Mike Stone 29 November 2019 в 04:29
поделиться

Я беру то, что я рассматриваю традиционным подходом; некоторый вход, окруженный условным выражением, определяет. Для производственных сборок я выключаю определение.

1
ответ дан JosephStyons 29 November 2019 в 04:29
поделиться

Я принимаю решение зарегистрироваться сознательно, когда я иду, поскольку это означает, что данные логов значимы:

  • В зависимости от платформы журналирования можно добавить информацию об уровне/серьезности/категории так, чтобы данные логов могли быть фильтрованы
  • , можно удостовериться, что правильный уровень информации присутствует, не слишком много, не слишком мало
  • Вы знаете при записи кода, который самые важные вещи и могут поэтому гарантировать, что они зарегистрированы

Используя некоторую форму инжекции кода, представление или прослеживание инструмента для генерации журналов, скорее всего, генерировали бы подробные, менее полезные журналы, которые будут более тверды погрузиться в. Они могут быть полезными как помощь для отладки, как бы то ни было.

1
ответ дан Simon Steele 29 November 2019 в 04:29
поделиться

Я запускаю путем утверждения большого количества условий в моем коде (в C#, с помощью System.Diagnostics.Assert), но я добавляю вход только там, где я нахожу при отладке или подвергании системы напряжению, что у меня действительно должен быть способ следовать за тем, что происходит в моем коде, не имея отладчика, постоянно присоединенного.

Иначе, я предпочитаю использовать поддержку Visual Studio поместить трассировки в код как специальные точки останова (т.е. Вы вставляете точку останова и щелкаете правой кнопкой по ней, затем выбираете, "Когда поражено..." и говорите ее, что отобразиться в этом случае). Нет никакой потребности перекомпилировать, и легко позволить/запретить трассировки на лету.

1
ответ дан Pierre Arnaud 29 November 2019 в 04:29
поделиться

Если Вы пишете программу, которая будет использоваться многими людьми, лучше иметь некоторый механизм для выбора то, что будет зарегистрировано и что не будет. Один аргумент в пользу .logthis () функции состоят в том, что они могут быть превосходной заменой для встроенных комментариев в некоторых случаях (если сделано правильно).

Плюс, это помогает Вам сузить ТОЧНО, где ошибка происходит.

1
ответ дан Jason Baker 29 November 2019 в 04:29
поделиться

Зарегистрируйте их всех и позвольте Grep уладить их.

1
ответ дан Ed Guiness 29 November 2019 в 04:29
поделиться

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

0
ответ дан Thomas Owens 29 November 2019 в 04:29
поделиться

Я определяю множество уровней и передаю в установке с конфигурацией / вызов.

0
ответ дан neoice 29 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: