Совместное использование объекта между вкладками (разные действия)

#android #class #android-activity #tabs

#Android #класс #android-активность #вкладки

Вопрос:

Я пытаюсь найти наилучшее решение проблемы: я разрабатываю приложение с 3 вкладками. Я получаю xml-данные из службы rest и преобразую их в объект (есть только один запрос). На 3 вкладках теперь отображаются разные части этих данных. Я думал о разделении приложения на разные действия, чтобы сделать код более читаемым. Как мне разделить дату между действиями? Я знаю, что этот вопрос задавался миллион раз, но я все еще не могу найти решение.

  1. объект приложения должен быть производным от класса Application, но мое основное действие уже является производным от класса TabActivity. использовать другой основной класс, а затем запускать мой класс tab с намерением?

  2. Хэш-карта слабых ссылок на объекты. Кажется пустой тратой памяти, но это было бы возможно.

  3. Поместите весь код в одно действие и покончите с этим.

Спасибо за любую помощь 🙂

Комментарии:

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.