پیاده سازی بهینه فرگمنت ها در اندروید


پیاده سازی بهینه فرگمنت ها

در برنامه های متعددی ممکن است با فرگمنت های زیادی سر و کار داشته باشیم. برای مثال در برنامه ای که bottom navigation کاربرد دارد، تعدادی fragment در برنامه خواهیم داشت نحوه استفاده از این فرگمنت ها، می تواند به پرفورمنس بهتر برنامه بیانجامد. هم چنین از بروز memory leak نیز جلوگیری کند.

با هربار انتخاب کاربر از میان آیتم های bottom navigation، جریانی از fragment ها در برنامه شکل می گیرد. این جریان باید به شکل بهینه مدیریت شود تا تجربه کاربری روانی ایجاد کند.

پیاده سازی صفر تا صد فرگمنت ها موضوع این آموزش نیست. هدف پیاده سازی بهینه جریان fragment ها در برنامه ست. هم چنین برای یادگیری نحوه پیاده سازی bottom navigation می توانید به این مقاله مراجعه نمایید. 

طرح یک مثال

همان طور که در ابتدا اشاره شد، با وجود bottom navigation حتما تعدادی فرگمنت داریم. با جابجایی کاربر بین آیتم های bottom navigation چه اتفاقی می افتد؟

با هر بار انتخاب فرگمنت مربوط به آن آیتم از نو ساخته می شود. یعنی در برنامه تعداد زیادی شی از فرگمنت ها بوجود می آید.

این روش اصلا بهینه نیست. چرا که object های متعددی از فرگمنت ها داریم که بی استفاده می مانند و کار garbage collector بیشتر می شود. در نتیجه می تواند منجر به memory leak گردد.

توضیح راه حل

روش کار ایجاد ارجاعی از فرگمنت های ساخته شده ست. به این ترتیب به تنها نمونه ای که از یک fragment ساخته شده همیشه دسترسی داریم. هر fragment، در صورت نیاز، تنها یک بار ساخته می شود. به جای ساخته شدن چندباره fragment، از همان یک نمونه مجدد استفاده می شود.

هر fragment با تگی مختص خود، در back stack قرار می گیرد. پس ارجاعی که گفتیم به کمک همین تگ ایجاد می شود. پیش از ساخته شدن فرگمنت، این تگ را در back stack جستجو می کنیم.

Fragment Transaction

چنین روندی با استفاده از Fragment Transaction عملی می شود. Fragment Transaction برای عملیاتی مثل افزودن، اجرای انیمیشن، حذف یا جابجایی فرگمنت ها در حین اجرا در اکتیویتی استفاده می شود. با کمک Fragment Transaction می توان layout هایی پویا و سازگار با نیاز برنامه ساخت.

در واقع تعامل با back stack از طریق Fragment Transaction میسر می گردد.

راه حل در کد

private fun showFirstFragment() {
        if (activeFragment is FirstFragment) return

        val fragmentTransaction = supportFragmentManager.beginTransaction()

        var fragment = supportFragmentManager.findFragmentByTag(FirstFragment.TAG) as FirstFragment?

        if (fragment == null) {
            fragment = FirstFragment.newInstance()
            fragmentTransaction.add(R.id.containerFragment, fragment, FirstFragment.TAG)
        } else {
            fragmentTransaction.show(fragment)
        }

        if (activeFragment != null) fragmentTransaction.hide(activeFragment as Fragment)

        fragmentTransaction.commit()

        activeFragment = fragment
    }

روند کار به صورت توضیحی ست که قبل تر بیان شد. چنین متدی مسئول مدیریت کار با فرگمنتی به نام FirstFragment است.

قبل از هر کاری چک می کند تا اگر فرگمنت انتخاب شده، فرگمنتی باشد که برنامه در حال نمایش آن است بدون انجام کاری متد را ترک می کند. اگر چنین حالتی نباشد، به کمک FragmentManager کار با FragmentTransaction را آغاز می کند تا به back stack دسترسی یابد.

در ادامه با جستجوی تگِ FirstFragment در back stack مسیر کار را مشخص می کند. اگر وجود داشته باشد همان را با متد show نمایش می دهد. اگر وجود نداشته باشد نمونه ای از fragment می سازد و به back stack اضافه می نماید.

لازم است فرگمنتی که پیش از این انتخاب در حال نمایش بود محو شود. این کار بر عهده متد hide می باشد. هم چنین مقدار ارجاع (activeFragment) روی این فرگمنت ست می شود.

 

به این پست امتیاز دهید

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

میانگین امتیاز / 5. تعداد:

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *




Enter Captcha Here : *

Reload Image