Отладчик Android скрывает локальную переменную
У меня странное поведение с использованием отладчика Android при выполнении следующего кода. Значение переменной исчезает сразу после инициализации виджета. Я перевел его на часы, но он говорит "Cannot find local variable value"
. Неважно, где я помещаю переменную, перед циклом for или внутри, он ведет себя одинаково независимо от того, что. Я также напечатал переменную, как вы можете видеть в коде, и она говорит "value is null"
, но когда я проверяю ее на if (value == null)
, она не останавливается и, наконец, выдает ошибку при попытке передать ее целому числу.
Код:
for (int i=0; i < (view != null ? ((ViewGroup)view).getChildCount() : 0); i++)
{
// Get name of the widget for example field__id,
// Convert to field name replacing field__id for id
// or for example field_name to name
// Check if the field exists in the column name, if so, add the ContentValue
View widget = ((ViewGroup)view).getChildAt(i);
String widgetName = view.getResources().getResourceEntryName(widget.getId());
String fieldName = widgetName.replace(Model.fieldPrefix,"");
Object value = null;
if (columnNames.contains(fieldName)) {
// TableField on the table matches the field on the form
try {
if (widget instanceof TextView) {
value = ((TextView) widget).getText().toString();
} else if (widget instanceof Spinner) {
value = ((SpinnerRow) ((Spinner) widget).getSelectedItem()).getId();
} else if (widget instanceof DatePicker) {
String date = AppDatabase.formatDateTime( getContext(), ((DatePicker) widget).getYear() + "-" + ((DatePicker) widget).getMonth() + "-" + ((DatePicker) widget).getDayOfMonth());
contentValues.put(fieldName, date ) ;
} else {
throw new ClassCastException("Could not cast the widget"+widget.getClass().toString());
}
Log.d(AppController.DEBUG_TAG, "Widget "+widgetName+" value is " + value.toString());
} catch (NullPointerException e) {
// Ignore exception:
value = null;
}
TableField tableField = this.getTable().getFieldByName(fieldName);
if ( (tableField.isPrimaryKey() && (value.equals("-1") || value.equals("")))
|| !tableField.getNotNull() && value.toString().length()==0 )
value = null;
if ( value == null || tableField.getType() == SQLiteCursor.FIELD_TYPE_NULL ) {
contentValues.putNull(fieldName);
} else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_STRING || tableField.getType() == SQLiteCursor.FIELD_TYPE_VARCHAR) {
contentValues.put(fieldName, String.valueOf(value));
} else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_INTEGER) {
contentValues.put(fieldName, Integer.valueOf(value.toString()) );
} else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_FLOAT) {
contentValues.put(fieldName,Float.valueOf(value.toString()));
} else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_BLOB) {
contentValues.put(fieldName,String.valueOf(value));
}
}
}
Ответы
Ответ 1
Используете ли вы proguard с обфускацией?
Если да, это может быть проблема - отключите его с помощью
-dontobfuscate
который вы должны поместить в свой файл с помощью правил proguard (обычно proguard-rules.txt, проверьте конфигурацию proguard в файле build.gradle, как в примере ниже:
buildTypes {
debug {
runProguard true
zipAlign true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.debug
testCoverageEnabled true
}
}
Ответ 2
У меня была та же проблема. Наконец, разрешено удалением 'testCoverageEnabled true' из файла сборки gradle.
Ответ 3
Аналогичная проблема, вызванная ошибкой в gradle version 1.0.0
, которая была решена в более позднем version 1.0.1
Найдите проект 'com.android.tools.build:gradle:1.0.0'
, который будет найден в файлах build.gradle
. вы можете иметь более одного файла build.gradle
, если вы включаете модули.
если у вас есть:
'com.android.tools.build: gradle: 1.0.0
Измените его на:
'com.android.tools.build: gradle: 1.0.1
Затем синхронизируйте gradle. Android Studio загрузит новый jar файл gradle и скомпилирует его.
Ответ 4
Имея ту же проблему: Cannot find local variable '[variable_name]'
, и единственное различие заключается в том, что мое приложение полностью отлаживается, в то время как проблема возникает с кодом библиотеки.
У меня minifyEnabled false
для debug buildTypes
в библиотеке и приложении. И во время отладки, Build Variant
являются debug
для обоих модулей. Даже сгенерированное значение BuildConfig.java
имеет правильное значение:
public static final boolean DEBUG = Boolean.parseBoolean("true");
Причина
Gradle не распространяется тип сборки (отладка или выпуск) приложения в зависимую библиотеку. Он всегда использует release
сборку библиотеки независимо от того, какой тип сборки выбран в приложении (зависимость библиотеки указана как compile project(':library')
в приложении build.gradle).
Решение
build.gradle
в библиотеке модуль
android {
defaultConfig {
defaultPublishConfig 'release'
publishNonDefault true
}
}
build.gradle
в приложении модуль
dependencies {
debugCompile project(path: ':library', configuration: "debug")
releaseCompile project(path: ':library', configuration: "release")
}
вместо выполнения:
compile project(':library')
![снимок экрана]()
Ответ 5
Если ваша сборка использует jack toolchain, это может стать источником проблемы. В моем случае, отключение гнезда решает проблему:
buildTypes {
...
debug {
jackOptions {
enabled false
}
}
}
Примечание. Для совместимости с исходным кодом 1.8 требуется гнездо!
Ответ 6
Это то, что сработало для меня.
Студия Android не может отображать локальные переменные при использовании с Proguard.
При отладке необходимо использовать следующие настройки:
1.
Либо добавьте свойство -donotobfuscate в файл proguard-rules.pro,
-dontobfuscate
ИЛИ
2.
Внутри отладки buildtypes внутри build.grade,
minifyEnabled false
shrinkResources false
Опция Latter больше рекомендуется, так как ур-производство apk многие должны быть сжаты.
buildTypes {
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
Ответ 7
э-э... В моем случае , Я просто перестроил проект, чтобы исправить это!