معرفي انواع Commit در Fragment هاي اندرويد
فرگمنت امكان بسيار جالبي براي استفاده ازكد و رابط كاربري به صورت چندباره در اندرويد است. فرايند افزودن و يا حذف كردن يك فرگمنت از يك activity در قالب يك تراكنش انجام ميشود كه درانتهاي تراكنش بايد تراكنش را commit كنيم. در اندرويد ۷ به بعد متدهاي مختلفي براي commit كردن معرفي شده است كه در اين مطلب هر كدام را توضيح ميدهيم و تفاوت آن را با ديگري بررسي مي كنيم.
- 1- Commit
- 2- CommitAllowingStateLoss
- يك مثال براي درك مطلب
- 3- CommitNow
1- 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 نيز استفاده كرد.
مطالعه بيشتر نسخه هاي مختلف اندرويد و برنامه نويسي براي نسخه هاي مختلف
با وب سايت tosinso همراه باشيد.
برچسب: X آموزش اندرويد. آموزش Android. دوره اندرويد. دوره آموزشي اندرويد،