خانه » لایبرری های مفید و تجربیات شخصی خیلی مفید !!! » استفاده از HashMap برای کش کردن اطلاعات

استفاده از HashMap برای کش کردن اطلاعات

اخیرا در یکی از برنامه هایی که می نوشتم نیاز شد تا لیست هایی که از اینترنت به صورت json دریافت می کردم و با Gson اون هارو داخل کلاس ها میریختم رو به صورت موقت کش کنم .

یعنی قرارشد تا زمانی که برنامه باز هست وقتی وارد صفحه ای می شوند که یک لیست را از اینترنت می گرفت (مثلا لیست شهر های یک استان) فقط یک دفعه آن ها را از سرور بگیرد و دفعات بعدی از اطلاعات کش شده استفاده کند.

خوب یک راه حل استفاده از دیتابیس بود که زمان و دردستر های خاص خودش رو داشت.

راه حل دیگه ذخیره اطلاعات در یک فایل بود که اون هم سرعت پایینی داشت و هم دردسر های زیادی.

و اما راه حل بعدی استفاده از یک HashMap بود که تا زمانی که برنامه باز باشد اطلاعات را در مموری نگه دارد ( که البته اطلاعات هم اطلاعات سنگینی نبود لیست هایی از رشته بود)

 

من در اینجا یک کلاس زیر داشتم که با Gson پر میشد

public class CategoryResponse {
    public String status;
    public int count;
    public List<CategoryModel> items;

}

و لیست کتگوری ها داخل آن بود ، فقط تنها کاری که نیاز بود بکنم این بود که کل این کلاس رو در حافظه نگه دارم ، اما چون برای هر لینک یک دسته بندی جداگانه و لیست متفاوتی بود من چندین لیست داشتم که هر کدوم با لینک های مختلفی گرفته می شد ، و تفاوت این لینک ها categoryId بود ، در یک عدد از نوع int .

خوب راه حل اینجاس :

در اکتیویتی Main که اکتیویتی اول برنامه هست یک استاتیک درست کردم :

public static HashMap<Integer, IModel> cachedCategoryData = new HashMap<>();

و به صورت بالا از HashMap استفاده کردم .

روش استفاده اینگونه است که ۲ Object می گیرد ، اولین Object به عنوان کلید و دومین Object به عنوان داده .

اولین Object رو در اینجا Integer گذاشتم ، چون کلید من یک عدد از نوع int بود

و دومین Object رو IModel گذاشتم (این برای مرتب تر شدن کد زدن بود چون انواع مختلفی کلاس داشتم و می خواستم همه از یک نوع باشند به همین دلیل یک اینترفیس تعریف کردم و به کلاس های خودم اضافه کردم.

 

حالا این ساخته شد .

زمانی که اطلاعات رو از اینترنت دریافت می کنم بعد از نشون دادن اون ها در لیست ، در این استاتیک هم ذخیره می کنم به شکل زیر

Main.cachedCategoryData.put(categoryId, categoryResponse);

و زمانی که دوباره لینک درخواست میشه اول میتونم چک کنم :

CategoryResponse categoryResponse = (CategoryResponse) Main.cachedCategoryData.get(categoryId);
        if (categoryResponse != null) {
            // we have cached data
        } else {
            // need to get data
            getCategoryFromServer();
        }

در این کد با استفاده از کلید categoryId که از نوع Integer هست ، ابتدامقدار موجود در این کلید را می گیرم ، اگر null باشد یعنی مقدار ذخیره شده ای وجود نداشته و نیاز داریم که اطلاعات را از سرور بگیریم

اما اگر null نباشده اطلاعات ذخیره شده را در اختیار داریم.

 

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

برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

1 دیدگاه

  1. فکر قشنگیه! خوشم اومد٬ ممنون بابت به اشتراک گذاشتن ایده

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا