ورود

View Full Version : جلوگیری از ایجاد مکرر شیء SharedPreferences



SZsXsZS
دوشنبه 09 فروردین 1395, 03:46 صبح
اخیرا این سوال رو در stackoverflow مطرح کردم: http://stackoverflow.com/questions/35926112/creating-a-new-sharedpreferences-object-each-time-for-reading-config-vars

سوال اینه که اگر در جاهای زیادی از برنامه داریم از SharedPreferences استفاده میکنیم، اونوقت یعنی در نقاط متعددی از برنامه کد تکراری ای شبیه این داریم:

SharedPreferences prefs=PreferenceManager.getDefaultSharedPreference s(this);
خب این هم کدش تکراری هست و هم این سوال پیش میاد که آیا از نظر اصول و پرفورمنس به برنامه صدمه نمیزنه؟ منظورم اینه چرا مدام باید یک شیء SharedPreferences ایجاد کنیم، در صورتی که میشه فقط یک بار یکی ازش ایجاد کرد و بعد در سراسر برنامه فقط از همون instance استفاده کنیم!

پاسخهایی که دادن ظاهرا کسی با این مخالف نبود که ما بیایم و یک شیء SharedPreferences ایجاد کنیم و در سراسر برنامه اون رو به اشتراک بذاریم.
بخاطر همین بنده به این شکل عمل کردم که یک کلاس خیلی مختصر با یک فیلد استاتیک برای ذخیره سازی این شیء به برنامم اضافه کردم:

public class Prefs {

public static SharedPreferences p;

}
اونوقت فقط یک بار موقع ایجاد اکتیویتی اصلی برنامه، این کد در onCreate اجرا میشه:

Prefs.p=PreferenceManager.getDefaultSharedPreferen ces(this);
بعد هر وقت در سراسر برنامه میتونم براحتی از این کدی مشابه این برای خوندن تنظیمات برنامه استفاده کنم:

Prefs.p.getString("lang", "default");
کدش کوتاهتر و خواناتر هم هست بنظر بنده.

البته خودتون میدونید که بنده زیاد روی پرفورمنس و بهینه سازی حساس نیستم، ولی این روش مزیتی بیشتر از صرف بهینه سازی داره و باعث کاهش کدهای تکراری و کاهش حجم و پیچیدگی کد میشه که بنظر من خیلی مطلوبه.

slr560
دوشنبه 09 فروردین 1395, 04:15 صبح
به همین راحتی

PrefHelper{
private SharedPreferences pref;

public static SharedPreferences getPref(Context context){
if(pref==null){
pref = PreferenceManager.getDefaultSharedPreferences(cont ext);
}
return pref;
}
}

Nevercom
دوشنبه 09 فروردین 1395, 04:30 صبح
من هم به همین روش عمل کردم، البته بجای اینکه در یک کلاس مجزا قرارش بدم، در کلاس Application پیاده سازی شده و Context مورد استفاده هم Context مربوط به Application هست.
اینطوری خیالم راحت تره که حتماً با اجرای برنامه این شئ ساخته میشه و مقدار دهی میشه، طول عمرش به اندازه طول عمر Application هست و Context مورد استفاده هم ApplicationContext هست که چون بالاترین طول عمر در چرخه ی اجرای برنامه داره، احتمال بروز خطای مربوط به Context رو کمتر می کنه.