فرگمنت امکان بسیار جالبی برای استفاده ازکد و رابط کاربری به صورت چندباره در اندروید است. فرایند افزودن و یا حذف کردن یک فرگمنت از یک activity در قالب یک تراکنش انجام میشود که درانتهای تراکنش باید تراکنش را commit کنیم. در اندروید ۷ به بعد متدهای مختلفی برای commit کردن معرفی شده است که در این مطلب هر کدام را توضیح میدهیم و تفاوت آن را با دیگری بررسی می کنیم.
- Commit
این متد همان متد قبلی است که بعد از انجام عملیات بر روی یک یا چند فرگمنت برای تأیید تراکنش آن را فراخوانی می کردیم.
2- CommitAllowingStateLoss
این متد همان کار متد commit را انجام میدهد با این تفاوت که زمان در فراخوانی این متد مؤثر است. اگر شما با فرگمنت ها سروکار دارید ممکن است که بعضی اوقات به خطای زیر برخورد کرده باشید.
این اتفاق زمانی میافتد که شما دستور commit را بعد از ذخیره کردن state مربوط به فرگمنت صدا کرده باشید. این خطا اعلام میکند که چون state مربوط به فرگمنت ذخیره شده است عمل commit امکانپذیر نیست. حال برای حل این مشکل میتوانید از متدCommitAllowingStateLoss استفاده کنید. البته این کار ممکن است مشکلاتی را به دنبال داشته باشد. فرایند commit کردن به این شکل است که وقتی که شما متد commit را فراخوانی میکنید FragmentManager بررسی میکند که آیا state ذخیره شده است یا خیر. اگر ذخیره شده بود خطا میدهد. حال اگر متد CommitAllowingStateLoss صدا بزنیم دیگر بررسی ذخیره شدن state انجام نمیشود.
یک مثال برای درک مطلب
- اکتیویتی شما در حال حاضر فرگمنت A را نمایش میدهد.
- شما اکتیویتی را به پس زمینه میفرستید (یا برنامه دیگری اجرا میکنید و یا اتفاقی میافتد که onStop برای اکتیویتی شما اجرا می شود).
- رویدادی رخ میدهد و در پاسخ به رویداد مورد نظر برنامه شما فرگمنت A را با فرگمنت B جایگزین میکند و متد CommitAllowingStateLoss را صدا می زند.
در این حالت ممکن است که دو حالت پیش بیاید.
- اگر سیستم حافظه(RAM) کافی برای برنامه شما نداشته باشد برنامه شما را از حافظه بیرون میبرد تا یک برنام دیگری حافظه مورد نیازش را به دست بیاورد. حال در این صورت اگر به برنامه خودتان برگردید به خاطر اینکه کامیت بعد از ذخیره حالت برنامه اتفاق افتاده بود فرگمنت B نمایش داده نمیشود.
- سیستم برنامه شما را خارج از حافظه نبرده است پس وقتی به برنامه برگردید خواهید دید که فرگمنت B نمایش داده میشود.
پس دیدیم که تفاوت این دو متد در زمان فراخوانی است. اگر فراخوانی متد commit بعد از فراخوانی onSaveInstanceState مربوط به اکتیویتی باشد خطا میدهد. ولی در همین حالت به جای فراخوانی commit متد CommitAllowingStateLoss را صدا بزنیم خطا نمیدهد ولی ممکن است که تغییرات مورد نظر اتفاق نیفتاده باشد. همچنین اگر شما در گوشی خود در بخش تنظیمات گزینه Dont Keep Activities را( که در بخش developer options است و به صورت پیشفرض غیر فعال است) فعال کرده باشید حالت اول پیش میآید. دقت داشته باشید که استفاده از هر دو متد با توجه به محل استفاده ممکن است مفید باشد ولی باید دقت کنیم که به صورت نادرست استفاده نکنیم.
3- CommitNow
شما وقتی که تغییرات یک فرگمنت را commit میکنید در همان لحظه و به سرعت ممکن است تغییرات شما انجام نشود. این مسأله به thread اصلی برنامه مربوط میشود. وقتی عمل commit انجام میشود. دستورات لازم برای thread اصلی برنامه در قالب یک صف اجرا ارسال میشود. حال هر بار thread اصلی هر وقت که بیکار شد دستورات را از صف برداشته و اجرا میکند. حال اگر به جای commit از commitNow استفاده شود عمل کامیت کردن فرگمنت بلافاصله و به صورت realtime انجام میشود. مشکلی که متد commitNow دارد این است که نمیتوان با آن از backstack استفاده کرد. دلیل آن هم این است که کامیت هایی که در صف اجرا هستند ممکن است هنوز در پشته backstack درج نشده باشند و در صورت اجرای commitNow و اعمال آن بر روی پشته یک ناسازگاری در ترتیب درج در پشته صورت بگیرد. به همین خاطر نباید از backstack با این متد استفاده نمود. برای اینکه یک یا چند کامیت را در یک زمان مشخص به برنامه اعمال کنیم میتوانیم از متد executePendingTransactions استفاده کنیم این باعث میشود که برنامه همه کامیت هایی را که در صف هستند را اجرا کند. در این صورت میتوان بدون مشکل از پشته backstack نیز استفاده کرد.
این دوره آموزش برنامه نویسی اندروید | Android Programming در دو سطح آموزش برنامه نویسی اندروید | Android مقدماتی و آموزش برنامه نویسی اندروید | Android پیشرفته ارائه شده است. شما تا ویدیوی آموزشی شماره 39 در واقع دوره آموزش Android Programming مقدماتی را آموزش می بینید و در ادامه از ویدیوی شماره 40 تا ویدیوی آموزشی شماره 66 دوره آموزش برنامه نویسی اندروید پیشرفته یا Advanced Android Programming را آموزش خواهید دید. شما بدون داشتن دانش خاصی می توانید این دوره آموزش برنامه نویسی موبایل در سیستم عامل اندروید را یاد بگیرید.
بدون شک برای یادگیری زبان برنامه نویسی جاوا و آموزش برنامه نویسی Java ، این دوره آموزشی شما را از هر نوع آموزش دیگری در خصوص یادگیری زبان Java بی نیاز می کند. بیش از 100 دانشجو با استفاده از یادگیری این دوره آموزش جاوا وارد بازار کار برنامه نویسی شده اند و تبدیل به یک برنامه نویس حرفه ای جاوا شده اند.
فرگمنت امکان بسیار جالبی برای استفاده ازکد و رابط کاربری به صورت چندباره در اندروید است. فرایند افزودن و یا حذف کردن یک فرگمنت از یک activity در قالب یک تراکنش انجام میشود که درانتهای تراکنش باید تراکنش را commit کنیم. در اندروید ۷ به بعد متدهای مختلفی برای commit کردن معرفی شده است که در این مطلب هر کدام را توضیح میدهیم و تفاوت آن را با دیگری بررسی می کنیم.
- Commit
این متد همان متد قبلی است که بعد از انجام عملیات بر روی یک یا چند فرگمنت برای تأیید تراکنش آن را فراخوانی می کردیم.
2- CommitAllowingStateLoss
این متد همان کار متد commit را انجام میدهد با این تفاوت که زمان در فراخوانی این متد مؤثر است. اگر شما با فرگمنت ها سروکار دارید ممکن است که بعضی اوقات به خطای زیر برخورد کرده باشید.
این اتفاق زمانی میافتد که شما دستور commit را بعد از ذخیره کردن state مربوط به فرگمنت صدا کرده باشید. این خطا اعلام میکند که چون state مربوط به فرگمنت ذخیره شده است عمل commit امکانپذیر نیست. حال برای حل این مشکل میتوانید از متدCommitAllowingStateLoss استفاده کنید. البته این کار ممکن است مشکلاتی را به دنبال داشته باشد. فرایند commit کردن به این شکل است که وقتی که شما متد commit را فراخوانی میکنید FragmentManager بررسی میکند که آیا state ذخیره شده است یا خیر. اگر ذخیره شده بود خطا میدهد. حال اگر متد CommitAllowingStateLoss صدا بزنیم دیگر بررسی ذخیره شدن state انجام نمیشود.
یک مثال برای درک مطلب
- اکتیویتی شما در حال حاضر فرگمنت A را نمایش میدهد.
- شما اکتیویتی را به پس زمینه میفرستید (یا برنامه دیگری اجرا میکنید و یا اتفاقی میافتد که onStop برای اکتیویتی شما اجرا می شود).
- رویدادی رخ میدهد و در پاسخ به رویداد مورد نظر برنامه شما فرگمنت A را با فرگمنت B جایگزین میکند و متد CommitAllowingStateLoss را صدا می زند.
در این حالت ممکن است که دو حالت پیش بیاید.
- اگر سیستم حافظه(RAM) کافی برای برنامه شما نداشته باشد برنامه شما را از حافظه بیرون میبرد تا یک برنام دیگری حافظه مورد نیازش را به دست بیاورد. حال در این صورت اگر به برنامه خودتان برگردید به خاطر اینکه کامیت بعد از ذخیره حالت برنامه اتفاق افتاده بود فرگمنت B نمایش داده نمیشود.
- سیستم برنامه شما را خارج از حافظه نبرده است پس وقتی به برنامه برگردید خواهید دید که فرگمنت B نمایش داده میشود.
پس دیدیم که تفاوت این دو متد در زمان فراخوانی است. اگر فراخوانی متد commit بعد از فراخوانی onSaveInstanceState مربوط به اکتیویتی باشد خطا میدهد. ولی در همین حالت به جای فراخوانی commit متد CommitAllowingStateLoss را صدا بزنیم خطا نمیدهد ولی ممکن است که تغییرات مورد نظر اتفاق نیفتاده باشد. همچنین اگر شما در گوشی خود در بخش تنظیمات گزینه Dont Keep Activities را( که در بخش developer options است و به صورت پیشفرض غیر فعال است) فعال کرده باشید حالت اول پیش میآید. دقت داشته باشید که استفاده از هر دو متد با توجه به محل استفاده ممکن است مفید باشد ولی باید دقت کنیم که به صورت نادرست استفاده نکنیم.
3- CommitNow
شما وقتی که تغییرات یک فرگمنت را commit میکنید در همان لحظه و به سرعت ممکن است تغییرات شما انجام نشود. این مسأله به thread اصلی برنامه مربوط میشود. وقتی عمل commit انجام میشود. دستورات لازم برای thread اصلی برنامه در قالب یک صف اجرا ارسال میشود. حال هر بار thread اصلی هر وقت که بیکار شد دستورات را از صف برداشته و اجرا میکند. حال اگر به جای commit از commitNow استفاده شود عمل کامیت کردن فرگمنت بلافاصله و به صورت realtime انجام میشود. مشکلی که متد commitNow دارد این است که نمیتوان با آن از backstack استفاده کرد. دلیل آن هم این است که کامیت هایی که در صف اجرا هستند ممکن است هنوز در پشته backstack درج نشده باشند و در صورت اجرای commitNow و اعمال آن بر روی پشته یک ناسازگاری در ترتیب درج در پشته صورت بگیرد. به همین خاطر نباید از backstack با این متد استفاده نمود. برای اینکه یک یا چند کامیت را در یک زمان مشخص به برنامه اعمال کنیم میتوانیم از متد executePendingTransactions استفاده کنیم این باعث میشود که برنامه همه کامیت هایی را که در صف هستند را اجرا کند. در این صورت میتوان بدون مشکل از پشته backstack نیز استفاده کرد.
این دوره آموزش برنامه نویسی اندروید | Android Programming در دو سطح آموزش برنامه نویسی اندروید | Android مقدماتی و آموزش برنامه نویسی اندروید | Android پیشرفته ارائه شده است. شما تا ویدیوی آموزشی شماره 39 در واقع دوره آموزش Android Programming مقدماتی را آموزش می بینید و در ادامه از ویدیوی شماره 40 تا ویدیوی آموزشی شماره 66 دوره آموزش برنامه نویسی اندروید پیشرفته یا Advanced Android Programming را آموزش خواهید دید. شما بدون داشتن دانش خاصی می توانید این دوره آموزش برنامه نویسی موبایل در سیستم عامل اندروید را یاد بگیرید.
بدون شک برای یادگیری زبان برنامه نویسی جاوا و آموزش برنامه نویسی Java ، این دوره آموزشی شما را از هر نوع آموزش دیگری در خصوص یادگیری زبان Java بی نیاز می کند. بیش از 100 دانشجو با استفاده از یادگیری این دوره آموزش جاوا وارد بازار کار برنامه نویسی شده اند و تبدیل به یک برنامه نویس حرفه ای جاوا شده اند.