Почему 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" />
  1. Добавьте в код 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);