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

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

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

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

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

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


person Redfox    schedule 14.11.2011    source источник
comment
Вы должны выбрать ответ, даже если это ваш собственный!   -  person AsTeR    schedule 15.11.2011
comment
Я жду, пока истечет время ожидания, чтобы иметь возможность выбрать свой ответ. Используя ваш код, я получаю сообщение об ошибке, что тип singleton неизвестен. Eclipse не смог найти импорт для этого класса. Но тем не менее спасибо за ваши усилия. (пожалуйста, прекратите плэнкинг [использование ненужных пробелов перед знаками препинания]) Я понял, что просто не знал, как это закодировать. К сожалению, я не мог понять ваше предложение.   -  person Redfox    schedule 16.11.2011
comment
Я забыл заменить некоторые слова после копирования, извините, если вы хотите попробовать еще раз. Я все еще думаю, что этот подход лучше всего.   -  person AsTeR    schedule 17.11.2011


Ответы (5)


Идеальное решение состоит в том, что действие уведомляет службу, которая запускает и обрабатывает оставшиеся запросы, сохраняет результат где-то, например, в sqlite-db, а затем служба уведомляет действие о выполнении транзакции, чтобы она могла запросить данные.

Но у вас есть только один запрос, и я не думаю, что вы будете выполнять все вышеперечисленное, поэтому я бы выбрал номер 3.

person josephus    schedule 14.11.2011
comment
да, сам стремлюсь к номеру 3 ;) - person Redfox; 14.11.2011
comment
Различные действия приведут к меньшему количеству кода в файле. Но я узнаю, если это все еще в порядке в одном действии. - person Redfox; 14.11.2011
comment
Неправильно то, что разделение кода, чтобы сделать его более явным, — это хорошо. Не делать этого грязно и лениво ;) - person AsTeR; 14.11.2011

Данные:

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();

В манифесте андроида:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:name="Data">

Данные класса должны быть помещены туда. Это было довольно просто. Форматирование немного запутано на этом форуме. Я не совсем понимаю формат кода. :( Спасибо за помощь.

person Redfox    schedule 15.11.2011

Во всех своих приложениях я использую класс контекста (вызывается через Singleton), которые хранят всю информацию и данные уровня приложения, которые по какой-либо причине могут использоваться совместно посредством различных действий.

Кстати, здесь представлен уровень модели (в 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: расширение приложения для достижения такой цели не кажется мне хорошей идеей. Предполагается, что расширение класса Application расширяет нормальное поведение приложения, а не является средством хранения общих данных.

PS2: ваша слабая справочная карта может быть добавлена ​​в объект Context для структурирования ваших данных.

person AsTeR    schedule 14.11.2011
comment
Синглтон будет использовать объект приложения? - person Redfox; 14.11.2011
comment
Нет одноэлементного класса, который был бы доступен везде в вашем приложении. Я думаю, что прикосновение к объекту приложения - плохая идея для вашей проблемы. - person AsTeR; 14.11.2011
comment
Проверьте на странице википедии, если вы не знаете, как сделать Singleton в java. - person AsTeR; 14.11.2011
comment
Я знаю идею синглтона, но я не знаю, как правильно использовать его в Android. Я использую класс приложения не для хранения общих данных, тогда что? :) - person Redfox; 14.11.2011
comment
Правильный способ использования вашего синглтона - просто добавить его атрибуты (это базовый объект данных). Например, если вы получаете имя пользователя из службы отдыха просто: AppContext.getInstance().username = ReceiveUsername; чтобы получить его где-нибудь еще AppContext.getInstance().username Это достаточно ясно? -› Я обновил свой ответ кодом - person AsTeR; 14.11.2011
comment
Большое спасибо за наши усилия. Я попробую это, как только опробую этот подход: stackoverflow.com/questions/708012/ - person Redfox; 14.11.2011
comment
Ах да, нет, я понял. Спасибо за вашу настойчивость. Таким образом, я могу отказаться от всех методов получения и установки. Это действительно лучший подход. Еще раз спасибо - person Redfox; 18.11.2011
comment
Но при таком подходе без геттера и сеттера переменные должны быть общедоступными, что довольно некрасиво. :( - person Redfox; 18.11.2011
comment
Это зависит от того, как вы планируете его использовать. Я отказываюсь от подхода о размещении геттера и сеттера повсюду. Eclipse Java предлагает довольно простое решение для рефакторинга, когда мне нужно что-то куда-то подключить, в этом случае класс Context является просто основным средством для обмена данными внутри вашего приложения, для некоторых нужд вы можете поместить в него метод или разработать другую политику доступа к свойствам. - person AsTeR; 18.11.2011

Попробуйте создать объект с помощью

общедоступный статический объект....

этот статический объект можно использовать для всех ваших классов, вы можете получить доступ к объекту по ClassName.objectName

person Maulik J    schedule 14.11.2011

В зависимости от данных существует несколько способов сделать это. Насколько велики данные? Если он состоит только из текста и не является безумно большим, может не возникнуть проблемы с его хранением в памяти на протяжении всего жизненного цикла приложения.

Если вы разделите свое приложение на разные действия, у вас есть два варианта:

  • Передача данных между действиями в качестве дополнительных намерений. Допустим, действие, отображаемое по умолчанию, извлекает данные. Если вы хотите просмотреть другие части данных, вы можете связать нужные данные с намерением и получить их во вновь созданной активности с помощью getIntent().getExtras().
  • Хранение данных в синглтоне или в виде переменной экземпляра подкласса Application. Я бы посоветовал не использовать синглтон, так как объекты, живущие сами по себе, без ссылок на другие объекты, делают ваш код более подверженным утечкам памяти. На мой взгляд, хранение данных в классе Application — лучший подход.

Как уже говорилось, правильное решение зависит от того, как выглядят ваши данные. Если бы все ваши действия отображали разные части данных, я бы, вероятно, оставил их в своем подклассе Application. Однако, если ваше приложение структурировано так же, как список контактов (одно действие для отображения контактов и одно действие для подробной информации о контакте), я, вероятно, буду иметь свои данные в основном действии и передавать только необходимые детали к другой моей деятельности.

person Bendik    schedule 14.11.2011
comment
Спасибо за ваш ответ. Это очень список контактов. Личная вкладка с несколькими значениями и двумя списками, содержащими дюжину строк по 3-4 записи в каждой. Но много значений для разбора с намерением, имхо. Я попытаюсь создать подкласс Application, который запускает мой подкласс TabActivity. - person Redfox; 14.11.2011