#android #java-native-interface #hashmap #overflow
#Android #java-родной интерфейс #hashmap #переполнение
Вопрос:
Используя файл ресурсов, я создаю большую hashmap
HashMap<String, String> bigHash = new HashMap<String, String>();
public void createHash(){
String [] items = getResources().getStringArray(R.array.dual_strings);
String [] temp;
for ( String s : items ){
temp = s.split("@");
bigHash.put(temp[0],temp[1]);
}
}
dual_string.xml полно записей, таких как
«Спи @Лучше спать более 6 часов в день»
Тем не менее, я пробовал с большим (~ 1000 элементов) dual_strings.xml файл и приложение выходят из строя сразу после запуска. Просматриваю LogCag «dalvikvm не удалось добавить в локальную таблицу ссылок JNI (содержит 512 записей)»
Могу ли я что-нибудь сделать, чтобы создать и использовать большой хэш из моего длинного файла ресурсов? Спасибо
Ответ №1:
Это похоже на ошибку в собственном коде Android для getStringArrayResources. Я обнаружил, что в этом уже есть ошибка. Легко увидеть причину этого в машинном коде (ссылка создается в цикле, но не очищается).
На данный момент вам придется обойти эту ошибку. Вам придется разбить ваш массив строк на более мелкие фрагменты по <500 строк в каждом или написать свой собственный метод загрузки массива строк. Возможно, кто-то другой может предложить более приятное решение.
Комментарии:
1. Спасибо. Однако я не могу разделить на более мелкие фрагменты, поскольку я передаю хэш-ключи в адаптер AutoCompleteTextView. Ссылка говорит, что проблема была исправлена с Android 2.3, я попробую это. Интересно, какова политика Google в отношении таких ошибок Android, как эта: < версия 2.3 когда-нибудь будет исправлена?
2. Если код в вашем сообщении выше указывает на то, что вы делаете, вы должны иметь возможность разделить файл ресурсов на несколько ресурсов. Вы создаете хэш-таблицу, которую передаете адаптеру, поэтому просто создайте адаптер за 2 или 3 прохода из 2 или 3 разных файлов ресурсов. Сбой происходит из-за слишком большого количества элементов в методе getStringArray, а не из-за кода адаптера.