Мы уже привыкли к тому факту, что приложение Google I/O является фактическим стандартом архитектуры, кодирования и дизайна приложений.
Вот и в этот раз я решил посмотреть, что нового появилось в приложении.
С дизайном все понятно, точнее понятно, что людям нужно заново учиться делать это «правильно».
Но меня больше интересовал код — что там нового? Но ничего нового я не увидел, но понял, что приложение совершенно не подходит в качестве наглядного пособия для обучения начинающих разработчиков.
После быстрого просмотра кода я получил вот такой список комментариев.
Отказ от ответственности : Я не претендую на истину в последней инстанции; больше всего комментариев вокруг MySchedule
1. В пакете пользовательского интерфейса явно отсутствует структура.
Почему бы не разделить каждую часть на отдельные пакеты? Это замечание можно считать надуманным, но мне кажется, лишние сумки здесь не помешали бы.
2. Загрузка данных в MyScheduleActivity.java
Поиск метода обновление данных который собирает данные сразу за все дни, через Асинктаск почему это странно и неправильно? здесь есть несколько факторов- судя по тому, что они перезагружают данные по onresume их бы это устроило Погрузчик который будет делать это автоматически.
Не подходит КурсорЗагрузчик , вы можете использовать Асинктасклоадер .
Более того, это отменит загрузку, если пользователь покинет экран.
AsyncTask не может сделать это самостоятельно.
- фактически они хранят данные в адаптере.
В этой ситуации логичнее хранить данные с помощью модели в Activity (хотя мне это тоже не нравится), а адаптеры создавать по мере необходимости.
и только потом кормить им модель.
3. Ужасно МойScheduleAdapter.java
На самом деле это нормально Адаптер массива , ан нет, придётся всё писать самому и наследовать от СписокАдаптер .метод получить просмотр 5 размеров экрана! Серьезно, Гугл? как читать эту картину? Это явно написали несколько человек в лучших традициях — «не хочу рефакторить», «не хочу разбираться».
Иначе для меня загадка, зачем ставить в члены эти 3 цвета, которые используются в получить просмотр
но все остальные, которые там используются, нет.mDefaultSessionColor = mContext.getResources().
getColor(R.color.default_session_color); mDefaultStartTimeColor = mContext.getResources().
getColor(R.color.body_text_2); mDefaultEndTimeColor = mContext.getResources().
getColor(R.color.body_text_3);
4. Странное использование фрагмента — MyScheduleFragment
Пойдем MyScheduleActivity.java и посмотреть, как используется фрагмент. @Override
public void onFragmentViewCreated(ListFragment fragment) {
fragment.getListView().
addHeaderView(
getLayoutInflater().
inflate(R.layout.reserve_action_bar_space_header_view, null));
int dayIndex = fragment.getArguments().
getInt(ARG_CONFERENCE_DAY_INDEX, 0);
fragment.setListAdapter(mScheduleAdapters[dayIndex]);
fragment.getListView().
setRecyclerListener(mScheduleAdapters[dayIndex]);
}
Оказывается, ребятам нужно было Просмотр пейджера С Посмотреть список .
играть с ПейджерАдаптер И Посмотреть список они не хотели, потому что Фрагментпейджерадаптер Фрагменты управления уже есть и они отличные.
а также методы getListView И setListAdapter Фрагмент общедоступен, почему бы его не использовать.
(ко мне тоже пришел стажер с точно такими же аргументами, когда увидел в задаче пункт «использовать фрагменты»).
В чем ошибка? часть фрагмента управляется непосредственно из активности.
хотя по задумке фрагмент должен быть автономным.
Решение : если фрагмнет не может самостоятельно получать данные (для них они формируются одним массивом в активности), то нужно определить интерфейс Поставщик во фрагменте это действие реализует интерфейс и передает данные через него во фрагмент. fragmnet получит свои данные.
и вставьте их в адаптер.
Но это почти то же самое.
Что они делают, возразит читатель.
Почти! Это как котлеты есть с борщом, а не после.
в результате они окажутся в желудке, но вот процесс.
В чем разница.
Фрагмент — это автономный модуль со списком и адаптером внутри.
он может отображать данные.
Проблема только в самих данных — их нет. Именно через этот интерфейс мы их будем получать, а не нам их пихнут. вот еще одно решение , что лучше первого — фрагмент может загружать данные сам! те.
загрузчик в самом фрагменте.
и загружает столько данных, сколько необходимо.
5. Адаптеры не используют ViewHolders
во всех адаптерах просто тянут findViewById. хотя мы все знаем, как это сделать ПросмотрДержатель6. Куча ненужных наблюдателей
каждый класс считает своим долгом повесить наблюдателя Доходит до абсурда - перезапускают загрузчик из наблюдателя.хотя загрузчик сам должен узнать об изменении данных.
Вы можете сделать это самостоятельно, если введете необходимые URL-адреса.
«если» еще раз.
СеансыФрагмент.java mSessionsObserver = new ThrottledContentObserver(new ThrottledContentObserver.Callbacks() {
@Override
public void onThrottledContentObserverFired() {
onSessionsContentChanged();
}
});
activity.getContentResolver().
registerContentObserver(
ScheduleContract.Sessions.CONTENT_URI, true, mSessionsObserver);
7. Неправильное использование погрузчиков
очень часто ребята закрывают курсор в загрузчике, что противопоказано - Android-разработчики один пример mTagMetadata = new TagMetadata(cursor);
cursor.close();
- они полностью обошли курсор в пользовательском интерфейсе
- закрыл курсор
- затем они визуализируют теги (они раздувают представления и помещают их в LinearLayout)
но если им это нужно, чтобы вовремя перегрузить данные, то им нужно сделать кастомный AsyncTaskLoader + наблюдатель (здесь это будет уместно).
Загрузчик загрузит крейсер, обойдет его, закроет и выдаст модель.
8. Использование встроенной строки вместо констант
вы можете искать по коду "_uri" Возможно я придирчив, возможно код пережил несколько поколений разработчиков.но можно и в сервисы заглянуть - там тоже 10-20 действий перебираются через переключатель.
ИМХО, начинающему разработчику не стоит учиться у этого приложения.
Теги: #Android #разработка для Android #Google #разработка для Android
-
Митап Полностью Посвящен Распознаванию Речи
19 Oct, 24 -
Xml, Rdf И I.
19 Oct, 24