-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ВСЕ ИССУЕСЫ #1
Comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Привет!
Подробный отчет ниже. Считаю его непредвзятым, в случае несогласия рекомендую обратиться к любому опытному разработчику Android, и поэтому вступать в дискуссию и обсуждать, как можно исправить указанные ошибки, я не собираюсь. Если что-то не понятно, все ответы можно найти в Google, так как ошибки тривиальные.
Ссылка на проект
Критически важные ошибки:
gradle build
. Это очень важно, так как в реально мире большинство проектов собираются автоматически билд-сервером без использования Android Studio. Проблема сборки на самом деле состоит в том, что проект не проходит синтаксическую проверку Lint. Проблема в зависимых библиотекахretrofit
иokio
. Для них необходимо настроить правильное исключение. Проблема описана здесь. Мое мнение — если программист решается использовать сторонние библиотеки, то он должен четко понимать как ими пользоваться и как настраивать сборку с их использованием.Это приводит к тому, что приложение на телефонах с версией Android меньше 5.0, падает при попытке отобразить список контактов:
Runtime Permission
на доступ к контактам. Код запроса Permission в проекте вроде как есть, но он не вызывается и не понятно, рабочий он или же нет. В итоге после проверки номера телефона и при следующем запуске приложение падает и исключением:Ошибки с высокой степенью важности:
Validate Phone
, то через несколько секунд в поле ввода кода появится слово"Some"
и информация о том, что код неверный. При этом попытка нажатия на ссылку Retry ни к чему не приводит и изменить номер введенного телефона в этот момент нельзя, даже нажав кнопку "Домой" и повторно запустив приложение.SplashScreenActivity.java
. ВызовgetSupportActionBar().hide();
даже AndroidStudio подсвечивает желтым и дает пояснение, что ф-цияgetSupportActionBar()
может вернутьnull
и это надо проверять, иначе это может привести к падению.SplashScreenActivity.java
. ПеременнаяbackPressed
используется в двух потоках (UI и ThreadSleep) однако доступ к ней не защищен, что может привести к проблеме, когда один поток не видит изменение закэшированных данных другого потока. Такие переменные стоит объявлять как минимумvolatile
, а лучше использоватьAtomic-классы
SplashScreenActivity.java
. Внутри потокаThreadSleep
хранится жестка ссылка на контекст (активити), что может привести утечке ресурсов. Причем, что странно, тут же ниже в классеActivityStarter
уже хранится ссылка черезWeakReference
. То ли разные люди код писали, то ли нет понимания для чего это надо.LoginActivity.java
. КодTelephonyManager tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
может вернутьnull
на некоторых сборках (например китайский планшет без радио-модуля), что приведет к падению приложенияUserLoginTask.java
. В методеdoInBackground
вызывается методenqueue
, который добавляет в очередь запрос. Причем этот метод асинхронный, это означает, что он вернет выполнение еще раньше, чем выполнится запрос. После чего методdoInBackground
вернетtrue
и в методеonPostExecute
вызоветсяmActivityRef.get().showProgress(false);
т.е. спрячетсяProgressBar
, в то время, как на очень медленном интернете запрос еще может выполнятся. Если уж программист использует сторонние библиотеки, то он должен четко понимать, как они работают.UserLoginTask.java
. ПеременнаяmActivityRef
объявлена какWeakReference
, однако везде вызовmActivityRef.get()
не проверяется на возвратnull
. Такое использование неправильно и может привести к падению. Странно что в классеSplashScreenActivity.java
WeakReference
используется корректно. У меня все больше подозрений, что код писали разные люди. Или же код брался с разных сайтов. Даже Android Studio подсвечивает желтым цветом вызов этих методов и указывает, что они могут вернутьnull
.ContactsListActivity.java
. В методеonCreate
вызывается методgetAllContactsList
который вычитывает все контакты в UI потоке. Если у пользователя большое число контактов (+10000), приложение будет на этом моменте тормозить, пользователь будет долгое время видеть белый экран и в лучшем случае в итоге увидит список, а в худшем приложение будет закрыто по ANR.ContactsListActivity.java
. Вызов методаcontentResolver.query
может вернутьnull
, однако это не проверяется. Даже Android Studio подсвечивает желтым цветом вызов этих методов и указывает, что они могут вернутьnull
.ContatcsListActivity.java
. Вызов методаcontentResolver.query
возвращает объектCursor
, который должен быть закрыт, после окончания работы с ним с помощью методаclose()
.ContactsListActivity.java
. ВызовCursor phoneCursor = contentResolver.query
так же может вернутьnull
.Ошибки средней важности:
LoginActivity.java
. ПеременныеmAuthTask
,validationPin
,mPasswordView
объявлены как паблик, что нарушает концепцию инкапсуляции.ContatcsListActivity.java
.List<Contact> contactList = new ArrayList();
используется создание массива объектов классаObject
. Правильная записьList<Contact> contactList = new ArrayList<>();
Незначительные проблемы:
SplashScreenActivity.java
. Мне не понятно, для чего поляbackPressed
иisValidated
объявлены какstatic
. Так же не понятно, почемуbackPressed
объявлен как простой типboolean
, аisValidated
уже как классBoolean
.LoginActivity.java
. ВызовgetApplicationContext().getSharedPreferences("ValidationData", MODE_PRIVATE);
. Ключи, как и любые другие захардкоженные значения необходимо выносить в константы. Это касается и вызовов такого планаeditor.putString("phone", "+7" + mPhoneView.getUnmaskedText());
Резюме:
Выполненное задание представляет из себя очень простое приложение, которое состоит буквально из трех Activity. Однако его невозможно собрать. Все сложные участки (сетевые запросы, кастомные view-элементы) реализованы с помощью сторонних библиотек. При этом основной функционал приложения — отображение списка контактов, которые можно провалидировать, не работает из-за падения приложения практически на любой версии Android. Так же несмотря на указания в задании, в приложение не использует
Fragments API
. В задании на сайте было указано, что приложение не должно быть стыдно выложить в Google Play. Могу сказать, что если выложить такое приложение, оно не наберет оценку выше 2 баллов.Не реализованы следующие пункты задания 2, 4, 6, 7, 8, 9, 10, 11. Так же не реализован ни один из дополнительных пунктов задания.
The text was updated successfully, but these errors were encountered: