English 中文(简体)
共有 优惠 最佳做法
原标题:Android SharedPreferences Best Practices
  • 时间:2012-01-13 18:00:07
  •  标签:
  • java
  • android

在一项申请中,我一直依靠共同优惠,这在我看来是获得共同优惠方面的最佳做法。 例如,许多人说,通过这一呼吁,获得这一服务的适当途径是:

PreferenceManager.getDefaultSharedPreferences(Context context)

然而,这似乎是危险的。 如果你申请大量依靠共享优惠,你可能会出现重大重复,特别是在使用依赖共享优惠的某些第三方图书馆的情况下。 在我看来,更好的使用要求是:

Context.getSharedPreferences(String name, int mode)

这样,如果你有一个严重依赖共享优惠的阶层,那么你就能够建立一个只由你的阶层使用的优惠文件。 你可以使用完全合格的类别名称,确保档案很可能不会被他人重复。

Also based on this SO question: Should accessing SharedPreferences be done off the UI Thread?, it seems that accesses SharedPreferences should be done off the UI thread which makes sense.

是否有任何其他最佳做法,即“新颖者”应当知道何时在其应用中使用共同优惠?

最佳回答

如果你申请大量依靠共享优惠,你可能会出现重大重复,特别是在使用依赖共享优惠的某些第三方图书馆的情况下。

图书馆不得使用该特定条目<代码>。 共有项目。 缺省<代码>共享优惠/代码>只应在申请中使用。

这样,如果你有一个严重依赖共享优惠的阶层,那么你就能够建立一个只由你的阶层使用的优惠文件。

我们当然欢迎你这样做。 在申请一级,作为<代码>的主要原因 共有产品将在申请的各组成部分之间共享。 一个发展小组不应存在管理这一名称空间的问题,正如他们不应该对类别、包裹、资源或其他项目一级的名词加以管理。 此外,缺省<条码>共享参考码是<>参考代码将使用的。

However, going back to your libraries point, reusable libraries should use a separate SharedPreferences for their library only. I would not base it on a class name, because then you are one refactoring away from breaking your app. Instead, pick a name that is unique (e.g., based on the library name, such as "com.commonsware.cwac.wakeful.WakefulIntentService") but stable.

似乎应当从“共同参比”的深处进行。

理想的情况是,是。 最近,我发表了一份。 这有助于实现这一目标。

是否有任何其他最佳做法,即“新颖者”应当知道何时在其应用中使用共同优惠?

Don。 它们存放在XML档案中,不是交易。 数据库应当是你的主要数据储存,特别是对于你确实不想丢失的数据。

问题回答

我写了一篇文章,也见。 说明: 共同参比:

Best Practice: SharedPreferences

Android提供了储存应用数据的许多方法。 其中一种方式使我们得以进入。 共有项目,用于将私人原始数据储存在关键价值乳制品中。

All logic are based only on three simple classes:

SharedPreferences

http://www.un.org。 它负责接收(储存)存储数据,提供接口,以检索<条码>Editor的物体和接口,以添加和删除<条码>关于共享优惠ChangeListener<>。

  • To create SharedPreferences you will need Context object (can be an application Context)
  • getSharedPreferences method parses Preference file and creates Map object for it
  • 你们能够以根据具体情况提供的几种方式创建这一机制。 您应始终使用MODE_PRIVATE,因为所有其他模式都是从第17号计划开始的。

    // parse Preference file
    SharedPreferences preferences = context.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
    
    // get values from Map
    preferences.getBoolean("key", defaultValue)
    preferences.get..("key", defaultValue)
    
    // you can get all Map but be careful you must not modify the collection returned by this
    // method, or alter any of its contents.
    Map<String, ?> all = preferences.getAll();
    
    // get Editor object
    SharedPreferences.Editor editor = preferences.edit();
    
    //add on Change Listener
    preferences.registerOnSharedPreferenceChangeListener(mListener);
    
    //remove on Change Listener
    preferences.unregisterOnSharedPreferenceChangeListener(mListener);
    
    // listener example
    SharedPreferences.OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener
        = new SharedPreferences.OnSharedPreferenceChangeListener() {
      @Override
      public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
      }
    };
    

Editor

<代码>共享参考书:Editor是用于修改<编码>中的数值的界面。 共有项目。 你在编辑上所作的所有改动都是逐字的,而不是抄录在原来的<代码>上。 共同参比 直至您发出承诺或申请()

  • Use simple interface to put values in Editor
  • Save values synchronous with commit() or asynchronous with apply which is faster. In fact of using different threads using commit() is safer. Thats why I prefer to use commit().
  • 用<代码>remove()删除单一价值,或用<代码>clear()澄清所有价值。

    // get Editor object
    SharedPreferences.Editor editor = preferences.edit();
    
    // put values in editor
    editor.putBoolean("key", value);
    editor.put..("key", value);
    
    // remove single value by key
    editor.remove("key");
    
    // remove all values
    editor.clear();
    
    // commit your putted values to the SharedPreferences object synchronously
    // returns true if success
    boolean result = editor.commit();
    
    // do the same as commit() but asynchronously (faster but not safely)
    // returns nothing
    editor.apply();
    

Performance & Tips

Anders Guide.

Sample Code

public class PreferencesManager {

    private static final String PREF_NAME = "com.example.app.PREF_NAME";
    private static final String KEY_VALUE = "com.example.app.KEY_VALUE";

    private static PreferencesManager sInstance;
    private final SharedPreferences mPref;

    private PreferencesManager(Context context) {
        mPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    }

    public static synchronized void initializeInstance(Context context) {
        if (sInstance == null) {
            sInstance = new PreferencesManager(context);
        }
    }

    public static synchronized PreferencesManager getInstance() {
        if (sInstance == null) {
            throw new IllegalStateException(PreferencesManager.class.getSimpleName() +
                    " is not initialized, call initializeInstance(..) method first.");
        }
        return sInstance;
    }

    public void setValue(long value) {
        mPref.edit()
                .putLong(KEY_VALUE, value)
                .commit();
    }

    public long getValue() {
        return mPref.getLong(KEY_VALUE, 0);
    }

    public void remove(String key) {
        mPref.edit()
                .remove(key)
                .commit();
    }

    public boolean clear() {
        return mPref.edit()
                .clear()
                .commit();
    }
}

在Kotlin,使用 共有项目可通过以下方式简化。

class Prefs(context: Context) {

    companion object {
        private const val PREFS_FILENAME = "app_prefs"

        private const val KEY_MY_STRING = "my_string"
        private const val KEY_MY_BOOLEAN = "my_boolean"
        private const val KEY_MY_ARRAY = "string_array"
    }

    private val sharedPrefs: SharedPreferences =
        context.getSharedPreferences(PREFS_FILENAME, Context.MODE_PRIVATE)

    var myString: String
        get() = sharedPrefs.getString(KEY_MY_STRING, "") ?: ""
        set(value) = sharedPrefs.edit { putString(KEY_MY_STRING, value) }

    var myBoolean: Boolean
        get() = sharedPrefs.getBoolean(KEY_MY_BOOLEAN, false)
        set(value) = sharedPrefs.edit { putBoolean(KEY_MY_BOOLEAN, value) }

    var myStringArray: Array<String>
        get() = sharedPrefs.getStringSet(KEY_MY_ARRAY, emptySet())?.toTypedArray()
            ?: emptyArray()
        set(value) = sharedPrefs.edit { putStringSet(KEY_MY_ARRAY, value.toSet()) }

此处,commdprefs.edit{...}由roid岩心kt图书馆提供,并通过在座标<条码>上添加“依赖代码”执行“androidx.分:核心-ktx:1.0.2”

You can get the instance of SharedPreferences by using code:

val prefs = Prefs(context)

此外,您可创建<条码>Singleton,<条码>,并在附件内任何地方使用。

val prefs: Prefs by lazy {
    Prefs(App.instance)
}

App

App.kt

class App:Application() {
    companion object {
        lateinit var instance: App
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest .....

   <application
        android:name=".App"
        ....

www.un.org/Depts/DGACM/index_spanish.htm 例:

// get stored value
val myString = prefs.myString

// store value
prefs.myString = "My String Value"

// get stored array
val myStringArray = prefs.myStringArray

// store array
prefs.myStringArray = arrayOf("String 1","String 2","String 3")

这是我的方法。

页: 1

SharedPreferences settings = context.getSharedPreferences("prefs", 0);
SharedPreferences.Editor editore = settings.edit();
editore.putString("key", "some value");
editore.apply();

to read

SharedPreferences settings = getSharedPreferences("prefs", 0);
Strings value = settings.getString("key", "");

在多个开发商参与的项目中,他们正在将共享优惠界定为一项类似活动:

SharedPreferences sharedPref = context.getSharedPreferences("prefName", 0);

在某一点或另一个点,两个开发商可以用同一名称界定共享优惠,或插入等值。 关键 价值乳制品,这将导致在使用钥匙方面产生问题。

解决办法取决于两种选择,是否使用;

  1. 共有优惠 单一吨,使用强食钥匙。

  2. 共有优惠 使用Enum钥匙的单一州。

个人资料和根据SharepvisDocument,我更喜欢使用Enum keys,当有多个方案人员从事一个项目时,它会实行更严格的控制。 方案主管别无选择,只能宣布适当级别的新关键人物,因此所有关键人物都处于同一地位。

And to avoid boilerplate code writing create the SharedPreference singleton. This SharedPreferences singleton Class help to centralize and simplify reading and writing of SharedPreferences in your Android app.

提供的两种解决办法的源代码见Git





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签