2013-11-15 3 views
0

В чем отличие статического поля и других способов хранения данных при запуске приложения? Я использую статические поля для данных проходят между деятельностью и работал отлично:Другой способ обмена данными между действиями

Я определил этот класс:

public class Info 
{ 
    public static int ID  = 0; 
    public static String NAME = "TEST"; 
    public static TestClass testclass = null; 
} 

и я могу хранить свои данные в любом месте:

Info.ID = 5; 
Info.NAME = "USER!"; 
Info.testclass = new TestClass(); 

и я могу получить мои данные в любом месте:

Info.ID 
Info.NAME 
Info.testclass 

ответ

3

Это обычно для передачи данных между различными видами деятельности с использованием дополнительных услуг в рамках намерения. Такие данные сохраняются в течение жизни принимающей активности (по окончании сборщик мусора может освободить память).

Или вы можете хранить значения, используя SharedPreferences. Они сохраняются между сеансами и сохраняются в виде пар ключ/значение в файле (поэтому не влияют на использование памяти как таковое).

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

http://android-developers.blogspot.fr/2009/01/avoiding-memory-leaks.html

Вы можете передать экземпляр класса в пределах умысла, если это Сериализуемое, например:

Intent intent = new Intent(this, whatever.class); 
Bundle b = new Bundle(); 
b.putSerializable("data", my_object); 
intent.putExtras(b); 
startActivity(intent); 

И в принимающей деятельности, бросьте обратно к тому, что класс вашего объект:

Bundle b = getIntent().getExtras(); 
my_object = (whatever class is it) b.getSerializable("data"); 

Многие классы Java реализуют Serializable, и очень просто сделать ваши собственные классы сериализуемыми.

+0

, но как я могу отправить [calss] или данные объекта в другую деятельность? – javadaskari

+0

См. Мое редактирование выше. – NigelK

0

Вы можете использовать намерения для передачи данных между activi связей. Ваш первый Activity.java

public void onClick(View v) 
    { 
     Intent timer = new Intent (FirstActivity.this,SecondActivity.class); 
     timer.putExtra("beefType", 5000); 
     startActivity(timer); 
    } 

Затем в файле SecondActivity.java сделать:

nt beefType = getIntent().getIntExtra("beefType", -1); 
+0

Я знаю, что.и хотите знать, что отличается от вашего решения и моего решения? – javadaskari

+0

Большая разница в вашей статической переменной может быть доступна из каждого класса, но моя не может. Вы также можете использовать другие функции, такие как startActivityForResult(), передавая значения конкретно. –

2

Если вы изменяете деятельность Я предполагаю, что вы используете intent с. Что вы можете сделать, это отправить данные с помощью intent с myIntent.putExtra("some string",someString);.

Тогда вы можете получить информацию в своей новой деятельности с использованием

Intent intent = getIntent(); 
String someString = intent.getExtra("some string"); 
+0

вы правы, но мой вопрос отличается между использованием putextra и использованием статических полей? – javadaskari

+0

Это безопаснее против 'NullPointerException', если ваше приложение вылетает или что-то происходит по этим строкам –

0

Вы хотите обмениваться данными между различными видами деятельности, вы можете использовать намерение или совместно prefernce. Разница в использовании этих буксирных и статических данных заключается в том, что намерение и совместное использование preffrence при некоторых статических данных могут быть пустыми или null.but, отправляя данные, используя выше двух методов gurantees, что вы получите данные в следующем действии, если вы не решительно удалите предпочтение вы можете сослаться на эту ссылку для получения дополнительной информации Static class in Java (Android) - use or not use

+0

, но я могу обрабатывать пустое или нулевое значение с помощью« if ». Я могу отправить объект между действиями по статическим полям тоже! – javadaskari

0

В андроиде есть что-то, что называется классом приложений. Это похоже на глобальный синглтон.

  • Другими словами, этот класс приложений будет общим для всего приложения.
  • Класс приложения будет загружен первым классом.

Таким образом, будет проще хранить некоторые случайно используемые значения в классе приложения.

public class Info extends Application 
{  
    public static int ID  = 0; 
    public static String NAME = "TEST"; 
} 

Затем вызовите его в какой-либо деятельности по:

Info info= ((YourApplication)this.getApplication()); 

И в манифесте:

<application 
android:name="<your package name>.GlobalApplication"> 

........ 
........ 

</application> 
+0

Почему я должен использовать приложение? Я думаю, мне это не нужно. – javadaskari

+0

Его до u .................. – amalBit

0

Ну, это не всегда работает в Android. Ваши статические значения сохраняются только во время работы вашего приложения. Представьте, что вы делитесь некоторым контентом с действием SEND, поэтому вы запускаете другое приложение, которое фактически передает ваш контент (Facebook, электронная почта и т. Д.). Android может решить полностью остановить ваше приложение, если ресурсов недостаточно для запуска другого приложения. В этом случае процесс вашего приложения полностью исчезнет, ​​а вместе с ним и ваши статические значения. Вернувшись в приложение из приложения, которое поделилось этим контентом, вы потеряли свои значения.

Лучше использовать дополнительные функции Intent в сочетании с Parcelable objects, если вам нужно сериализовать более сложные данные.

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

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