Static Linkedhashmap或Sharedpreference?

时间:2014-01-03 13:07:44

标签: java android performance sharedpreferences linkedhashmap

Android应用程序,提供两种在活动之间传递数据的解决方案(No Intent Extras Please!)

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。)

2 个答案:

答案 0 :(得分:2)

根据许多原则(high cohesion, decoupling, minimice dependency, Protected Variations...),将您的活动用作静态数据源,让您的其他活动依赖它(甚至知道此活动存在)是一种不好的做法,但是android团队已经你可以依赖一些类似的方法,但出于同样的原因,它们不应该是第一个选择。

我更喜欢的是:

如果数据必须是持久的:

  • 少量数据的SharedPreferences
  • 用于更大量数据的SQLite数据库

如果你不需要持久化数据

  • 一个始终在运行的服务,您绑定到所有活动,其中包含所有常用数据和功能。
  • 您拥有数据的辅助对象。

你可以在这个Android官方faq page或这个伟大的SO answer中找到更多信息,这是基于该常见问题,但有一些代码示例

答案 1 :(得分:1)

如上所述,

  

Pros and Cons of SQLite and Shared Preferences

对于大型数据组&gt; 30-40键我建议你使用SQLite。它比SharedPreferences更强大,并且可以根据您要搜索的键进行查询。

另一方面,实现SQLite比使用SharedPreferences更复杂,代码更长。

拥有静态的LinkedHashMap或任何其他静态变量对于代码维护和可读性来说绝不是一个好的选择,只有在没有其他选项时才应该使用它。

希望它有所帮助。 :)