2011-12-28 5 views
4

У меня есть класс, который расширяет приложение в приложении Android tabHost. В классе App я размещал методы и переменные, которые в противном случае мне нужно было бы воссоздать в каждом классе. Один метод считывает из БД и сохраняет результаты в ArrayList (имя, фамилия, например). Вместо повторного чтения этой базы данных и повторного создания кода для каждого вида табуляции, для которого требуется информация, я закрепил метод и ArrayList в классе, расширяющем Application (myAppClass). Таким образом, установив mAC = (myAppClass) getApplicationContext() из любого вида табуляции в onCreate(), я могу ссылаться на все методы get ..() и set ..() в myAppClass.Статические методы против расширения класса android.app.Application?

Мой первоначальный план состоял в том, чтобы использовать общий класс со статическими методами и переменными, но я прочитал много «не делаю этого» потоков, поэтому решил пойти по маршруту приложения. Теперь я столкнулся с ситуацией, когда я пытаюсь использовать myAppClass в библиотеке проектов, но получаю ошибки в отношении android.app.Application cannot be cast to.... Если я изменю myAppClass на статические методы/переменные (и не распространяю приложение), все будет работать, но это предполагается быть большим нет-нет. Есть ли другой способ сделать это? Не уверен, что Android передаст все по ссылке, но может ли я лучше реализовать все приложение, передав огромные (тысячи объектов/членов) ArrayLists обратно и вперед между методами/классами?

+0

Существует только один экземпляр приложения. Не нужно использовать геттер и сеттер. Просто используйте статические методы/переменные в вашем подклассовом приложении и используйте их таким образом: MyApplication.myMethod() ... –

ответ

6

Мой первоначальный план состоял в том, чтобы использовать общий класс со статическими методами и переменными, но я прочитал много потоков «не делаю этого», поэтому решил пойти по маршруту приложения.

«Не делай этого», как правило, является рекомендацией против чего-либо в глобальном масштабе и, следовательно, будет охватывать статические элементы данных, а также пользовательский Application. Оба являются вероятными источниками утечек памяти.

Теперь я столкнулся с ситуацией, когда я пытаюсь использовать myAppClass в библиотеке проекта, но получаю ошибки о android.app.Application не может быть приведен к ...

Ваш манифест в проекте хостинга, вероятно, не указывает на использование библиотеки Application.

это не должно быть большой нет-нет

Опять же, статические данные не хуже, чем обычай Application, и во многих случаях лучше.

Есть ли другой способ сделать это?

Не используйте ни один из Application или статических данных.

Могу ли я улучшить повторное внедрение всего приложения, передав огромные (тысячи объектов/членов) ArrayLists назад и вперед между методами/классами?

Вам будет лучше иметь постоянную модель данных, такую ​​как база данных. Использование статических элементов данных в качестве кеша для постоянной модели данных в порядке, если вы очень осторожны в управлении памятью.

+0

Спасибо за ответ. Вы прибили его с AndroidManifest. Что нужно сделать по-другому для управления памятью с помощью статического объекта ArrayList? Не удаляется ли Android при завершении работы приложения? – wufoo

+0

@wufoo: «Не очищается Android, когда приложение заканчивается?» - в то время как память будет очищена, когда процесс будет в конечном итоге завершен, утечки памяти до этого могут по-прежнему приводить к сбою вашего приложения из-за нехватки места для кучи. – CommonsWare

+1

Спасибо. Является ли анализатор памяти Eclipse хорошим инструментом для поиска утечек? Отправляем 2-кратный поток здесь: http://stackoverflow.com/questions/1147172/what-android-tools-and-methods-work-best-to-find-memory-resource-leaks – wufoo

Смежные вопросы