فرگمنت امکان بسیار جالبی برای استفاده ازکد و رابط کاربری به صورت چندباره در اندروید است. فرایند افزودن و یا حذف کردن یک فرگمنت از یک activity در قالب یک تراکنش انجام میشود که درانتهای تراکنش باید تراکنش را commit کنیم. در اندروید ۷ به بعد متدهای مختلفی برای commit کردن معرفی شده است که در این مطلب هر کدام را توضیح میدهیم و تفاوت آن را با دیگری بررسی می کنیم.
در آموزش برنامهنویسی اندروید، برای مدیریت تغییرات در Fragment ها از انواع مختلف commit استفاده میشود. commit()
تغییرات را به صورت غیر همزمان اعمال میکند، در حالی که commitNow()
به طور همزمان تغییرات را اجرا میکند. همچنین، برای جلوگیری از از دست دادن وضعیت، میتوان از commitAllowingStateLoss()
یا commitNowAllowingStateLoss()
استفاده کرد. در آموزش برنامه نویسی ، انتخاب مناسب این commit ها میتواند به بهبود عملکرد و جلوگیری از مشکلات در توسعه اپلیکیشن کمک کند.
این متد همان متد قبلی است که بعد از انجام عملیات بر روی یک یا چند فرگمنت برای تأیید تراکنش آن را فراخوانی می کردیم.
این متد همان کار متد commit را انجام میدهد با این تفاوت که زمان در فراخوانی این متد مؤثر است. اگر شما با فرگمنت ها سروکار دارید ممکن است که بعضی اوقات به خطای زیر برخورد کرده باشید.
این اتفاق زمانی میافتد که شما دستور commit را بعد از ذخیره کردن state مربوط به فرگمنت صدا کرده باشید. این خطا اعلام میکند که چون state مربوط به فرگمنت ذخیره شده است عمل commit امکانپذیر نیست. حال برای حل این مشکل میتوانید از متدCommitAllowingStateLoss استفاده کنید. البته این کار ممکن است مشکلاتی را به دنبال داشته باشد. فرایند commit کردن به این شکل است که وقتی که شما متد commit را فراخوانی میکنید FragmentManager بررسی میکند که آیا state ذخیره شده است یا خیر. اگر ذخیره شده بود خطا میدهد. حال اگر متد CommitAllowingStateLoss صدا بزنیم دیگر بررسی ذخیره شدن state انجام نمیشود.
در این حالت ممکن است که دو حالت پیش بیاید.
پس دیدیم که تفاوت این دو متد در زمان فراخوانی است. اگر فراخوانی متد commit بعد از فراخوانی onSaveInstanceState مربوط به اکتیویتی باشد خطا میدهد. ولی در همین حالت به جای فراخوانی commit متد CommitAllowingStateLoss را صدا بزنیم خطا نمیدهد ولی ممکن است که تغییرات مورد نظر اتفاق نیفتاده باشد. همچنین اگر شما در گوشی خود در بخش تنظیمات گزینه Dont Keep Activities را( که در بخش developer options است و به صورت پیشفرض غیر فعال است) فعال کرده باشید حالت اول پیش میآید. دقت داشته باشید که استفاده از هر دو متد با توجه به محل استفاده ممکن است مفید باشد ولی باید دقت کنیم که به صورت نادرست استفاده نکنیم.
شما وقتی که تغییرات یک فرگمنت را commit میکنید در همان لحظه و به سرعت ممکن است تغییرات شما انجام نشود. این مسأله به thread اصلی برنامه مربوط میشود. وقتی عمل commit انجام میشود. دستورات لازم برای thread اصلی برنامه در قالب یک صف اجرا ارسال میشود. حال هر بار thread اصلی هر وقت که بیکار شد دستورات را از صف برداشته و اجرا میکند. حال اگر به جای commit از commitNow استفاده شود عمل کامیت کردن فرگمنت بلافاصله و به صورت realtime انجام میشود. مشکلی که متد commitNow دارد این است که نمیتوان با آن از backstack استفاده کرد. دلیل آن هم این است که کامیت هایی که در صف اجرا هستند ممکن است هنوز در پشته backstack درج نشده باشند و در صورت اجرای commitNow و اعمال آن بر روی پشته یک ناسازگاری در ترتیب درج در پشته صورت بگیرد. به همین خاطر نباید از backstack با این متد استفاده نمود. برای اینکه یک یا چند کامیت را در یک زمان مشخص به برنامه اعمال کنیم میتوانیم از متد executePendingTransactions استفاده کنیم این باعث میشود که برنامه همه کامیت هایی را که در صف هستند را اجرا کند. در این صورت میتوان بدون مشکل از پشته backstack نیز استفاده کرد.
این دوره آموزش برنامه نویسی اندروید | Android Programming در دو سطح آموزش برنامه نویسی اندروید | Android مقدماتی و آموزش برنامه نویسی اندروید | Android پیشرفته ارائه شده است. شما در دوره آموزش برنامه نویسی اندروید پیشرفته یا Advanced Android Programming را آموزش خواهید دید. شما بدون داشتن دانش خاصی می توانید این دوره آموزش برنامه نویسی موبایل در سیستم عامل اندروید را یاد بگیرید.
بدون شک برای یادگیری زبان برنامه نویسی جاوا و آموزش برنامه نویسی Java ، این دوره آموزشی شما را از هر نوع آموزش دیگری در خصوص یادگیری زبان Java بی نیاز می کند. با استفاده از یادگیری این دوره آموزش جاوا وارد بازار کار برنامه نویسی شده اند و تبدیل به یک برنامه نویس حرفه ای جاوا شده اند.