#android #class #android-activity #tabs
#Android #класс #android-активность #вкладки
Вопрос:
Я пытаюсь найти наилучшее решение проблемы: я разрабатываю приложение с 3 вкладками. Я получаю xml-данные из службы rest и преобразую их в объект (есть только один запрос). На 3 вкладках теперь отображаются разные части этих данных. Я думал о разделении приложения на разные действия, чтобы сделать код более читаемым. Как мне разделить дату между действиями? Я знаю, что этот вопрос задавался миллион раз, но я все еще не могу найти решение.
-
объект приложения должен быть производным от класса Application, но мое основное действие уже является производным от класса TabActivity. использовать другой основной класс, а затем запускать мой класс tab с намерением?
-
Хэш-карта слабых ссылок на объекты. Кажется пустой тратой памяти, но это было бы возможно.
-
Поместите весь код в одно действие и покончите с этим.
Спасибо за любую помощь 🙂
Комментарии:
1. Вы должны выбрать ответ, даже если это ваш собственный!
2. Я жду истечения тайм-аута, чтобы иметь возможность выбрать свой ответ. Используя ваш код, я получаю сообщение об ошибке, что тип «singleton» неизвестен. Eclipse не удалось найти импорт для этого класса. Но, тем не менее, спасибо за ваши усилия. (пожалуйста, прекратите заполнять [использование ненужных пробелов перед знаками препинания]) У меня возникла идея, я просто не знал, как это закодировать. К сожалению, я не смог понять ваше предложение.
3. Я забыл заменить некоторые слова после моей копипасты, извините, если вы хотите попробовать еще раз. Я все еще думаю, что этот подход является лучшим.
Ответ №1:
Идеальное решение заключается в том, что действие уведомляет службу, которая запускает и обрабатывает запрос rest, сохраняет результат где-нибудь, например, в sqlite-db, затем служба уведомляет действие о выполнении транзакции, чтобы оно могло запросить данные.
Но у вас есть только один запрос, и я не думаю, что вы стали бы выполнять все упомянутые выше, поэтому я бы выбрал номер 3.
Комментарии:
1. да, я сам стремлюсь к номеру 3 😉
2. Различные действия приведут к меньшему количеству кода на файл. Но я выясню, все ли в порядке в одном действии.
3. Неправильным является то, что разделение кода для придания ему более явного вида — это хорошо. Не делать этого грязно и лениво 😉
Ответ №2:
Данные:
import android.app.Application;
public class Data extends Application {
private int blupp = 0;
public void setBlupp(final int bla) {
blupp = bla;
}
public int getBlupp() {
return blupp;
}
}
Установка данных в методе oncreate() для одного действия:
final Data myData = ((Data) getApplicationContext());
myData.setBlupp(12);
Получение его методом oncreate() другого:
final Data myData = ((Data) getApplicationContext());
final int test = myData.getBlupp();
В манифесте Android:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name="Data">
Данные класса должны быть помещены туда. Это было довольно просто. Форматирование на этом форуме немного запутано. Я не совсем понимаю формат кода. 🙁 Спасибо за всю помощь.
Ответ №3:
Во всех моих приложениях я использую контекстный класс (вызываемый через Синглтон), который хранит всю информацию уровня приложения и данные, которые по какой-либо причине должны быть переданы через различные действия.
Кстати, это вводит уровень модели (в его смысле MVC) в вашем приложении, при разработке программного обеспечения эта часть должна использоваться для хранения данных, представляющих данные пользователя и состояние приложения.
Пример синглтона :
public class AppContext {
public String username = null;
//////////////////
// below the singleton implementation
//////////////////
private static final AppContext instance = new AppContext();
// Private constructor prevents instantiation from other classes
private AppContext() { }
public static AppContext getInstance() {
return instance;
}
}
Когда вы получили свои данные из Интернета (здесь имя пользователя) :
AppContext.getInstance().username = receivedUsername;
Чтобы получить его в одном из ваших действий :
myLabel.setText(AppContext.getInstance().username);
PS1: расширение приложения для удовлетворения такой цели мне не кажется хорошим решением. Предполагается, что расширение класса приложения расширяет обычное поведение приложения, а не является средством хранения общих данных.
PS2: ваша слабая справочная карта может быть добавлена в объект Context для структурирования ваших данных
Комментарии:
1. Синглтон будет использовать объект application?
2. Нет, одноэлементный класс просто написан так, чтобы быть доступным везде в вашем приложении. Я думаю, что прикосновение к объекту приложения — плохая идея для вашей проблемы
3. Проверьте на странице Википедии, если вы не знаете, как создать синглтон в java.
4. Я знаю идею, лежащую в основе singelton, но я не знаю, как правильно использовать ее в Android. Я использую класс application «не для того, чтобы быть средством хранения общих данных», тогда что это? 🙂
5. Правильный способ использования вашего синглтона — просто добавить к нему атрибуты (это базовый объект данных). Например, если вы получаете имя пользователя из своей службы rest, просто: AppContext.getInstance().username = receivedUsername; чтобы получить его где-то еще, AppContext.getInstance().username Это достаточно понятно? -> Я обновил свой ответ кодом
Ответ №4:
Попробуйте создать объект с
общедоступный статический объект….
этот статический объект может использоваться для всех ваших классов, вы можете получить доступ к объекту с помощью className.objectName
Ответ №5:
В зависимости от данных существует несколько способов сделать это. Насколько велики данные? Если он доступен только для текста и не слишком огромен, возможно, не составит труда сохранить его в памяти на протяжении всего срока службы приложения.
Если вы разделите свое приложение на разные действия, у вас есть два варианта:
- Передача данных между действиями в качестве дополнительных намерений. Допустим, что действие, отображаемое по умолчанию, извлекает данные. Когда вы хотите просмотреть другие части данных, вы можете объединить нужные вам данные в intent и извлечь их из вашего вновь созданного действия с помощью
getIntent().getExtras()
. - Сохранение данных в синглтоне или в качестве переменной экземпляра подкласса приложения. Я бы не советовал использовать синглтон, поскольку наличие объектов, живущих самостоятельно, без ссылок на другие объекты, делает ваш код более подверженным утечкам памяти. Хранение данных в вашем классе приложения, на мой взгляд, является лучшим подходом.
Как уже говорилось, правильное решение зависит от того, как выглядят ваши данные. Если все ваши действия отображают разные части данных, я бы, вероятно, сохранил их в своем подклассе Application. Однако, если ваше приложение структурировано аналогично списку контактов (одно действие для отображения контактов и одно действие для получения подробной информации о контакте), я, вероятно, разместил бы свои данные в основном действии и передал бы только необходимые сведения в другое действие.
Комментарии:
1. Спасибо за ваш ответ. Это больше похоже на список контактов. Личная вкладка с несколькими значениями и два списка, содержащие десяток строк по 3-4 записи в каждой. Но много значений для разбора с намерением, имхо. Я попытаюсь создать подкласс приложения, который запускает мой подкласс TabActivity.