Статическая Linkedhashmap или Sharedpreference?

Android-приложение с двумя решениями для передачи данных между действиями (без намерений, пожалуйста!)

public class A { 
  public static LinkedHashMap<String,String> hashStore = new LinkedHasMap<String,String>(); 

  public void doHttp(){
    //Some HTTP call and store some json value
    hashStore.put("data","jsonKeyValue"); 
  }

  public void onDestroy(){
    hashStore.remove(key);// remove data key
    hashStore.clear();
  }
  }

public class B { 
public void getHttp(){
    //Some HTTP call 
    String extra = A.hashStore.get("data"); 
  }}


    //  SharedPreference Call 
public class A{
SharedPreference hashPref ; //declaration on onCreate 
public void dohttp(){
//Some Http and Store value in SharedPreferences
hashPref.put("data","jsonkeyvalue");
hashPref.apply();
}}



 public class B{
 SharedPreference hashPref ; //declaration on onCreate
 public void getHttp(){ 
    //Some HTTP call 
    String extra = hashPref.get("data"); 
  }}
  1. Какой из них лучше подходит для уменьшения утечек памяти?
  2. Если я храню более 30-40 ключей, какой из них предпочтительнее?
  3. Если я использую общие настройки, я не потеряю производительность при проверке и обновлении ключей ??
  4. Есть ли альтернатива, которую я мог бы использовать вместо этих двух решений? (Не упоминайте здесь Intent Extras.)

person Rizvan    schedule 03.01.2014    source источник


Ответы (2)


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

Я бы предпочел:

Если данные должны быть постоянными:

  • SharedPreferences для небольшого объема данных
  • База данных SQLite для большего объема данных

если вам не нужно сохранять данные

  • Служба, которая всегда работает, и вы привязываетесь ко всем своим действиям, где у вас есть все общие данные и функции.
  • Вспомогательный объект, в котором у вас есть данные.

Вы можете узнать больше на этой официальной странице часто задаваемых вопросов по Android или на этой отличный SO answer, основанный на этом часто задаваемые вопросы, но с некоторыми примерами кода

person Carlos Robles    schedule 03.01.2014
comment
Если я использую sharedPreferences, потребуется время для проверки, извлечения и применения ?? что ты говоришь @Карлос - person Rizvan; 03.01.2014
comment
если вас интересует производительность, она должна быть быстрее, чем sqlite для нескольких ключей, но у меня нет канонического ответа. После загрузки общие настройки хранятся в статическом HashMap, см. sSharedPrefs в (github.com/android/platform_frameworks_base/blob/master/core/) и останется там до завершения процесса. Так что это должно быть быстро. Конечно, вы не можете выполнять поиск, сортировать, фильтровать или сохранять коллекции или связанные записи простым способом, как в sql. Вот почему это означало только несколько ключей. - person Carlos Robles; 03.01.2014
comment
Кроме того, имейте в виду, что с помощью sqlite или sharedpreferences вы сохраняете данные, поэтому они будут там в следующий раз, когда пользователь откроет приложение, поэтому вам нужно подумать, действительно ли вы этого хотите, или вам нужно удалить все, когда приложение запускается, или вы можете выбрать другой подход, который не сохраняет данные. - person Carlos Robles; 03.01.2014

Как указано здесь,

Плюсы и минусы SQLite и общих настроек

для больших групп данных> 30-40 ключей я бы предложил вам использовать SQLite. Он более мощный, чем SharedPreferences, и дает вам возможность делать запросы на основе ключей, которые вы хотите найти.

С другой стороны, реализация SQLite немного сложнее и длиннее для кода, чем использование SharedPreferences.

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

Надеюсь, поможет. :)

person axierjhtjz    schedule 03.01.2014
comment
30-40 ключей, разделенных на разные активности @axierjhtjz - person Rizvan; 03.01.2014