‫تفاوت commit ، commitAllowingStateLoss ، commitNow در عملیات ترنزکشن فرگمنت ؟

برای Fragment Transaction ها چهار راه وجود دارد:

خود commit چی هست؟؟؟

commit ترنسکشن رو برنامه ریزی و زمان بندی میکنه تا در زمان بعدی که MainThread آماده بود این ترنسکشن انجام بشه.

بیایید ببینیم تفاوت commit و commitAllowingStateLoss چیست؟

حالا فرض کنید یک اکتیویتی داریم که FragmentA رو داره. یک کالبکی هم هست که FragmentB رو قرار commit کنه. دکمه home رو میزنیم و onStop اکتیویتی صدا زده میشه و اکتیویتی به بکگراند میره. بعد از رفتن به بک گراند کالبک اجرا میشه و FragmentB:

commit میشه:

با stop شدن اکتیویتی onSavedInstanceState صدا زده میشه. با commit شدن خطای IllegalStateException شوت :) میشه وسط صفحه. چرا؟ چون state اکتیویتی save شده و نمیتونیم commit کنیم!

commitAllowingStateLoss میشه:

با استفاده از commitAllowingStateLoss به اکتیویتی میگیم اوکی، نخواستیم استیتت برای خودت. خب بنظرتون وقتی مموری کم بیاره و اکتیویتی رو تو بک گراند از بین ببره چی میشه؟ درسته، وقتی مجدد اپ رو باز می کنیم چون state ذخیره نشده FragmentB دیگه نمایش داده نمیشه و FragmentA نمایش داده میشه. ولی اگه اکتیویتی توسط مموری از بین نره هنگام باز شدن مجدد اپ FragmentB نمایش داده میشه.

 

خیلی ساده و راحت :)

حالا اگه گفتید تفاوت commitNow با commit چیه؟

commit که گفتیم زمان بندی می کنه و وقتی MainThread اوکی بود ترنسکشن رو انجام میده ولی commitNow بصورت همزمان انجام میده و فورا میخواد ترنسکشن رو انجام بده. قبلا بجای commitNow از executePendingTransactions استفاده میشد. ولی از نسخه ۲۴ کتابخونه support به بعد commitNow اضافه شد تا از این استفاده کنیم. اول commit میشد بعد executePendingTransactions صدا زده میشد.

نکته خیلی مهم اینکه اگه فرگمنت قرار به backStack اضافه بشه از commitNow استفاده نکنید. 

این سناریو رو در نظر بگیرید: FragmentA رو commit میکنیم و به back-stack اضافه می کنیم. بعد FragmentB رو commitNow می کنیم. و به back-stack اضافه می کنیم. خب ترنسکشن FragmentA که زمان بندی شد تا سر زمانش انجام بشه ولی FragmentB بصورت Sync انجام میشه! یعنی فورا اجرا میشه و حتی قبل اینکه FragmentA ترنسکشنش رو انجام بده FragmentB میاد ترنسکنش رو انجام میده. اینجا ترتیب قرار گیریشون تو back-stack چجوری میشه؟؟؟ پس بهتره استفاده نکنیم :)

A

popBackStack و  popBackStackImmediate هم مثل commit و commitNow هستند. اولی Async هست و دومی هم که Sync.

اگه میخوایید چند ترنسکشن همزمان در یک نقطه زمانی انجام بشن از executePendingTransactions استفاده کنید.

اگه جاییش سوتی دادم لطفا راهنمایی کنید.