美文网首页Android进阶之路Android开发Android开发
弱网优化(SharePreference)原理+实战剖析

弱网优化(SharePreference)原理+实战剖析

作者: 码农的地中海 | 来源:发表于2022-07-22 17:03 被阅读0次

    概述

    SharedPreferences(以下统称为sp)是Android提供的数据持久化的一种手段,适合单进程、小批量的数据存储与访问。

    由于sharedPreferences是基于xml文件实现的,所有持久化数据都是一次性加载,如果数据过大是不适合采用SP存放。

    实际上是用xml文件存放数据,文件存保存放在 (/data/data/<package name>/shared_prefs/目录下面)

    SharedPreference详解原理

    SharedPreference 文件保存在/data/data/<package name>/shared_prefs 路径下(如/data/data/com.android.alarmclock/shared_prefs/com.android.text_preferences.xml),通过cat命令可以查看文件,如:


    image.png

    通过Activity自带的getSharedPreferences方法,可以得到SharedPreferences对象。

       public abstract SharedPreferences getSharedPreferences (String name, int mode);
    

    name:表示保存后 xml 文件的名称

    mode:表示 xml 文档的操作权限模式(私有,可读,可写),使用0或者MODE_PRIVATE作为默认的操作权限模式。

    **1.数据读取:
    **

    通过SharedPreferences对象的键key可以获取到对应key的键值。对于不同类型的键值有不同的函数:

    getBoolean,getInt,getFloat,getLong.
       public abstract String getString (String key, String defValue);
    

    2.数据存入:

    数据的存入是通过SharedPreferences对象的编辑器对象Editor来实现的。通过编辑器函数设置键值,然后调用commit()提交设置,写入xml文件。

       public abstract SharedPreferences.Editor edit ();
       public abstract SharedPreferences.Editor putString (String key, String value);
       public abstract boolean commit ();
    

    下面一个实例显示一个TextView,上面显示用户使用该应用的次数。

    效果图如下

    image.png

    【戳我获取】《Android性能优化核心解析》

    源代码如下

    main.xml:

    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
       
      <TextView  
        android:id="@+id/textview" 
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="@string/hello"/> 
       
    </LinearLayout> 
    

    TestSharedPreferences.java:

    package com.android.test; 
    import android.app.Activity; 
    import android.content.SharedPreferences; 
    import android.os.Bundle; 
    import android.preference.PreferenceManager; 
    import android.widget.TextView; 
    public class TestSharedPreferences extends Activity { 
      /** Called when the activity is first created. */ 
      @Override 
      public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        SharedPreferences mSharedPreferences = getSharedPreferences("TestSharedPreferences", 0); 
    //    SharedPreferences mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
         
        int counter = mSharedPreferences.getInt("counter", 0); 
         
        TextView mTextView = (TextView)findViewById(R.id.textview); 
        mTextView.setText("This app has been started " + counter + " times."); 
         
        SharedPreferences.Editor mEditor = mSharedPreferences.edit(); 
        mEditor.putInt("counter", ++counter); 
        mEditor.commit(); 
         
      } 
    } 
    

    几点说明:

    1.SharedPreferences的获取有两种方法:

    一是上面提到的通过Activity自带(本质来讲是Context的)的getSharedPreferences方法,可以得到SharedPreferences对象。这种方法的好处是可以指定保存的xml文件名。

    另一种是通过PreferenceManager.getSharedPreferences(Context)获取SharedPreferences对象。这种方法不能指定保存的xml文件名,文件名使用默认的:<package name>+"_preferences.xml"的形式,不过如果在一个包里面采用这种方式需要保存多个这样的xml文件,可能会乱掉。建议采用第一种指定xml文件名的形式。

    2.数据的存入必须通过SharedPreferences对象的编辑器对象Editor来实现,存入(put)之后与写入数据库类似一定要commit。

    存储特点:

    “SharedPreference”是Android的四大数据持久化技术之一,其他三个分别是SQLite、Content Provider 和 File。

    ①保存基本的数据类型:int、long、boolean、String、Float、Set和Map这些数据类型,不支持自定义数据类型;

    ②4.2之后只能用于应用内部数据存储和共享,4.2之前支持跨应用共享;

    ③key-value键值对数据,更新时,如果已经插入的key存在,那么将更新原来的key;那么将更新原key所对应的value;


    image.png

    ④用户应用程序一旦卸载,存在应用数据目录下的shared_prefs文件也会被删除。

    实践

    使用SharedPreferences的正确姿势

    1.1 创建SharedPreferences对象
    SharedPreferences spf = context.getSharedPreferences("xx",Context.MODE_PRIVATE);
    // MODE_PRIVATE,则该配置文件只能被自己的应用程序访问
    // MODE_WORLD_READABLE,则该配置文件除了自己访问外还可以被其它应该程序读取
    // MODE_WORLD_WRITEABLE,则该配置文件除了自己访问外还可以被其它应该程序读取和写入
    // MODE_APPEND,检查文件是否存在,存在就往文件追加内容,否则就创建新文件
    
    1.2 获得SharedPreferences.Editor对象。
    SharedPreferences.Editor editor = spf.edit();
    editor.putString(key, value);
    
    1.3 插入、删除、查找key-value数据
    editor.putString(key, value);
    editor.remove(key);
    editor.get(key,default-value);
    Map<String,?> key_Value=(Map<String, ?>)spf.getAll(); 
    // 获取所有保存在对应标识下的数据,并以Map形式返回
    
    1.4 保存key-value数据
    editor.apply(); // 异步
    editor.commit();  // 同步
    

    【戳我获取】《Android性能优化核心解析》

    营销优化图.png 02卡顿优化.png 03启动速度优化.png

    小结

    【戳我获取】《Android性能优化核心解析》

    SharePreferences是Android基于xml实现的一种数据持久化手段

    SharePreferences不支持多进程,不适合大数据量存储。

    SharePreferences的commit与apply前者同步方法、后者为异步

    相关文章

      网友评论

        本文标题:弱网优化(SharePreference)原理+实战剖析

        本文链接:https://www.haomeiwen.com/subject/gxomirtx.html