فرگمنت امکان بسیار جالبی برای استفاده ازکد و رابط کاربری به صورت چندباره در اندروید است. فرایند افزودن و یا حذف کردن یک فرگمنت از یک activity در قالب یک تراکنش انجام میشود که درانتهای تراکنش باید تراکنش را commit کنیم. در اندروید ۷ به بعد متدهای مختلفی برای 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 نیز استفاده کرد.
مطالعه بیشتر نسخه های مختلف اندروید و برنامه نویسی برای نسخه های مختلف
با وب سایت tosinso همراه باشید.
پاسخ ها