Ни одна платформа или язык не идеальны, у каждого есть свои проблемы, подводные камни и свои загадочные ошибки. Благодаря наследию Java, Android обычно предлагает плавную, легко обучаемую кривую с огромной базой данных блогов, форумов и ответов на вопросы stackoverflow.
После двухнедельного запуска и обучения серии Study Jam я решил собрать ряд распространенных ошибок, с которыми сталкиваются разработчики, которые, как правило, загадочны или не подходят для Google.
Ошибка: метод Gradle DSL не найден: ‘runProguard ()’
Возможные причины: <ul> <li> Проект ‘XX’ может использовать версию Gradle, которая не содержит метод.
<a href=otedopen.wrapper.fileveloper> Открыть файл оболочки Gradle </a> </ li> <li> В файле сборки может отсутствовать плагин Gradle.
<a href= обработкаapply.gradle.plugintivation> Плагин Apply Gradle </a> </ li>
Это одна из самых загадочных ошибок, с которыми вы можете столкнуться на Android. Если вы использовали Android Studio из бета-версии, вы вероятно столкнулись с этой ошибкой после обновления до версии 0.14.0 (Android Studio 0.9). Просто команда Android Tools решила переименовать runProguard в minifyEnabled. Аналогичным образом zipAlign был включен для zipAlignEnabled. Вы можете найти полный список изменений здесь .
Ошибка: в проекте используется неподдерживаемая версия плагина Android Gradle (XXX). Рекомендуемая версия XXX
<a href=otedfixGradleElementsаный> Исправить версию плагина и повторно импортировать проект </a>
Подобно предыдущей проблеме, эта проблема возникает каждый раз, когда вы получаете обновление для Android Studio и Gradle. В отличие от предыдущего, это легко решить, щелкнув ссылку «Исправить версию плагина» в окне сообщений Gradle.
android.os.NetworkOnMainThreadException
Вы можете столкнуться с этой ошибкой, если это ваш первый сетевой вызов или вы обновляете старое приложение для публикации Honeycomb. Начиная с версии 4.0 (Ice Cream Sandwich) ОС Android не позволяет выполнять сетевые операции в главном потоке (пользовательском интерфейсе), который должен был выполняться таким образом со дня 0. Основной обязанностью основного потока является бесперебойная работа пользовательского интерфейса. Работа в сети, файловый ввод-вывод или любая другая длительная операция блокирует обновления пользовательского интерфейса, что приводит к нестабильному пользовательскому интерфейсу / UX. Сеть может быть худшим из всех, так как скорость соединения может зависеть от множества различных факторов.
Решение простое. Все, что не является частью пользовательского интерфейса, не должно выполняться в основном потоке. Android предлагает простой способ использования потоков, который называется AsyncTask. Просто используйте AsyncTask для выполнения длительных операций.
Я использую AsyncTask, но все еще получаю android.os.NetworkOnMainThreadException
Чтобы запустить Asynctask, вам нужно вызвать метод .execute для объекта Asynctask. Вызов метода .doInBackground пропустит создание нового потока и запустит сетевую операцию в основном потоке.
java.lang.SecurityException: отказ в разрешении:… требуется Android.permission.X
Android основан на Linux, и каждое приложение работает в собственной песочнице с очень ограниченными разрешениями. Если вам нужен доступ к общему системному ресурсу, такому как камера, Bluetooth, Интернет или файловая система, вам нужно спросить разрешения пользователя. Разрешение добавляется в AndroidManifest.xml между тегами манифеста и приложения. Вы можете сослаться на это для полного набора разрешений, которые могут быть добавлены с помощью тега-полномочий Я добавил разрешение java.lang.SecurityException: Отказ в разрешении:… требуется Android.permission.X
Наличие действующего AndroidManifest.xml не обязательно означает, что он просто работает. Добавление тегов использования-разрешений в тег приложения не нарушает структуру XML, но также не оставляет за собой запрошенные вами разрешения. Перечислите свои теги-разрешения-разрешения из тега приложения.
Отказ в разрешении:… требуется android.permission.WRITE_EXTERNAL_STORAGE
Если вы уверены, что просмотрели два предыдущих пункта, но все еще получаете сообщение об ошибке, это должно быть связано со свойством android: maxSdkVersion = ”18 ″ внутри тега Использования-разрешения. Чтобы ваше приложение могло использовать разрешение на запись выше версии 18, вам нужно удалить maxSdkProperty.
1
|
<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE"/> |
В меню переполнения моего фрагмента отображается пункт меню (настройки), которого нет в menu.xml
Фрагменты могут добавлять свои собственные пункты меню, переопределяя onCreateOptionsMenu (). Однако это не означает очистку пунктов меню, добавленных действием. Поскольку фрагмент всегда размещается в действии и использует контекст действия, он наследовал бы такие вещи от действия хостинга. Элемент, который, по вашему мнению (настройки задаются как элемент меню по умолчанию), не имеет отношения к деятельности. Перейдите к menu.xml, который принадлежит деятельности, и удалите ненужные элементы. Метод замены или фиксации в типе FragmentTransaction не применим для аргументов
Вы передаете объект фрагмента методу, который ожидает объект фрагмента, но все еще жалуетесь? Ну, не все фрагменты одинаковы. Дизайн Java позволяет классам с одинаковыми именами, если они находятся в разных пакетах. Команда Android SDK решила представить пакет поддержки фрагментов с тем же именем класса (Fragment), но в другом пакете ( android.support.v4.app.Fragment vs android.app.Fragment). Перейдите к импорту, удалите неправильный импорт и добавьте соответствующий.
onOptionsItemsSelected (), onCreateOptionMenu (), afterTextChange (Editable s), onPostExecute () или любой другой метод, который должен был быть вызван, не вызывается?!?
Аннотация @Override, должно быть, была самой недооцененной. Это существует по очень конкретной причине. В отличие от C ++ каждый метод является виртуальным в Java. Таким образом, если он не является окончательным, любой метод может быть переопределен. @Override просто проверяет, действительно ли реализация переопределяет метод из родительского класса. У всех методов выше есть опечатка, которую может сделать любой уровень разработчика. Удаление аннотации переопределения также устраняет возможность компилятора обнаруживать любые опечатки в так называемых переопределенных методах. Эти опечатки могут встречаться в методе или даже в списке параметров. Просто если слушатель или метод, который должен был быть вызван, молча не будет выполнен. Вы можете легко обнаружить такие ошибки, поместив @Override в каждый переопределяющий метод.
Ссылка: | Руководство автостопом по современной разработке Android: подводные камни и загадочные ошибки от нашего партнера по JCG Мурата Йенера в блоге Developer Chronicles . |