الیاس محمدی
الیاس محمدی
خواندن ۲ دقیقه·۵ سال پیش

من تو را می‌بینم...دیتا را لود کن:در باب متد SetUserVisibleHint

Photo by Shahadat Shemul on Unsplash
Photo by Shahadat Shemul on Unsplash

در اکثر برنامه‌های موبایل،از TabLayout و ViewPager استفاده می‌کنیم.بعضی پروژه‌‌ها تعداد تب‌های زیاد و بعضی دیگر تعداد تب‌های کمتری دارند.

مسئله

اگر تعداد تب‌ها زیاد باشد و بطور مثال در هر تب بخواهیم یک سری دیتا از وب‌ سرویس‌های مختلف بگیریم و نمایش دهیم،احتمالا با مشکل performance مواجه می‌شویم و شاهد بارگذاری‌های طولانی خواهیم بود.مشکلی که در پروژه‌ای با 12 تب مختلف برای من اتفاق افتاد.

راه حل

برای حل این مشکل لازم بود،اطلاعات زمانی دریافت شود که کاربر وارد تب مربوطه شده است.پس بریم ببینیم چطور میشود این راه حل را پیاده سازی کرد.

در حالت عادی،فرض کنیم ما 3 تب داریم.اگر MainActivity را باز کنیم،طبق تصویر زیر متوجه می‌شویم که FragmentOne و FragmentTwo همزمان در حالت OnCreateView هستند.یعنی اگر در OnCreateView بخواهیم دیتا بگیریم(کاری که من انجام دادم)،2 تب همزمان عملیات دریافت دیتا را انجام می‌دهند.

برای حل این مشکل از متدی به اسم setUserVisibleHint استفاده می‌کنیم.این متد توسط فریمورک اندروید صدا زده می‌شود و جز متد‌های کلاس Fragment می‌باشد.وظیفه این متد این است که مشخص می‌کند Fragment مورد نظر دیده شده است یا خیر!دقت شود که این متد قبل متد OnCreateView فراخوانی شده و اجرا می‌شود.

در تصویر زیر یک نمونه ساده از پیاده سازی این متد نمایش داده شده است.

اگر مقدار isVisibleToUser درست باشد عبارت "I'm Visible For User...Load Data Now" نمایش داده می‌شود و در غیر اینصورت عبارت "I'm not Visible" در لاگ نمایش داده می‌شود.

اگر برنامه را اجرا کنیم و در تب 1 باشیم،چون کاربر در حال مشاهده تب 1 است،با تصویر زیر مواجه می‌شویم:

حال اگر به تب 2 یا 3 بریم،دیگر تب 1 قابل مشاهده نیست و لاگ ما به فرم زیر درمی‌آید:

پس برای بهبود performance، من از این متد استفاده کردم و زمانی که مقدار isVisibleToUser برابر True بود،عملیات درخواست دیتا از Api را انجام دادم.با این روش خدا رو شکر پروژه به سرانجام رسید.

دوستان عزیز اگر تجربه مشابهی دارید با من به اشتراک بذارید.ممنون از توجه شما.


androidاندرویدfragmentsetuservisiblehintبرنامه نویسی
Android Developer With a Passion to Learn
شاید از این پست‌ها خوشتان بیاید