Почему Active Android не работает с gradle 2.0?
Я использую Active Android в своем приложении. Он работал нормально, пока я не обновил свою версию Android Studio до версии 2.0 с версии 1.3. С этим обновлением мой gradle также получил обновление до 2.0, что вызывает некоторые проблемы с Active Android.
Я получаю эту ошибку при создании с помощью gradle 2.0.
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.activeandroid.TableInfo.getTableName()' on a null object reference
at com.activeandroid.Cache.getTableName(Cache.java:156)
at com.activeandroid.query.From.addFrom(From.java:169)
at com.activeandroid.query.From.toSql(From.java:250)
at com.activeandroid.query.From.execute(From.java:298)
Я попытался построить свою старую студию с gradle 1.3, она все еще работает нормально.
Любая помощь пожалуйста?
build.gradle файл, когда приложение дает указанную выше ошибку
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
classpath 'com.google.gms:google-services:2.0.0-beta2'
}
}
allprojects {
repositories {
jcenter()
}
}
build.gradle, когда приложение работает нормально
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath 'com.google.gms:google-services:2.0.0-beta2'
}
}
allprojects {
repositories {
jcenter()
}
}
gradle свойства оболочки
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
Ответы
Ответ 1
Я столкнулся с этой проблемой, я обнаружил, что это проблема только на устройствах Android 23+, и ее можно избежать, если вы включите Instant Run off (File- > Settings- > Build, Execution, Deployment- > Instant Run).
Если вы хотите сохранить Instant Run, вы можете попробовать "Отменить" "Перезапустить активность при изменении кода"
На Mac:
Предпочтения > Сборка, выполнение, развертывание > Мгновенный запуск > Снимите флажок "Перезапустить активность при изменении кода"
Ответ 2
Проблема с ActiveAndroid, которая не может получить поиск классов модели в DexFile при активации Instant run
Некоторая информация о DexFile и Instant run здесь
Существует три возможных варианта обхода:
- Отключить Intant запустить Android Studio → Настройки → Intant run
- Добавьте уже предложенный код в AndroidManifest:
<meta-data
android:name="AA_MODELS"
android:value="com.myapp.model.Item, com.myapp.model.Category" />
- Добавьте в код ActiveAndroid следующий код:
Configuration.Builder config = new Configuration.Builder(this);
config.addModelClasses(Model1.class, Model2.class);
ActiveAndroid.initialize(config.create());
Надеюсь, что это поможет
Ответ 3
Я встретил ту же проблему, но не знаю почему. Я четко определил классы Model в моем AndroidManifest:
<meta-data
android:name="AA_MODELS"
android:value="com.myapp.model.Item, com.myapp.model.Category" />
Это разрешено;
Ответ 4
У меня такая же проблема на gradle 2.0, но я не понимаю, почему эта ошибка присутствует
, наконец, я решил, понизив версию gradle до gradle 1.5.0
Ответ 5
У меня была такая же проблема с активным андроидным ORM. Не работает только на эмуляторе. Отключение моментального запуска. И полную переустановку приложения, очистил ошибку.
Ответ 6
Чтобы добавить ответ, предоставленный VictorG, вы можете избежать отключения мгновенного запуска. Поскольку основная проблема заключается в том, что Cache
не сохраняет значения ModelInfo
из-за изменений DexFile
, вызванных мгновенным запуском, вы можете проверить, содержит ли ModelInfo
любые данные таблицы и при необходимости повторно инициализирует ActiveAndroid
.
if (Cache.isInitialized() && Cache.getTableInfos().isEmpty()) {
ActiveAndroid.dispose();
}
ActiveAndroid.initialize(HOWEVER_YOU_BUILD_YOUR_CONFIG);