مدیریت کارآمد وضعیت WebView

هنگام مدیریت چرخه حیات برنامه Android، حفظ وضعیت کاربر درطول بازیابی منابع پس‌زمینه مؤلفه اصلی تجربه کاربری یکپارچه است. برای برنامه‌هایی که گردش کار وب را دربرمی‌گیرند، WebView.saveState(Bundle) به شما امکان می‌دهد سابقه پیمایش و وضعیت WebView را در Bundle سریالی کنید. این داده‌ها را می‌توان بعداً بااستفاده از WebView.restoreState(Bundle) بازیابی کرد.

بااین‌حال، پیاده‌سازی‌های استاندارد ممکن است در جلسه‌های مرور سنگین با محدودیت‌های اندازه تراکنش مواجه شوند. این صفحه این محدودیت‌های معماری را شرح می‌دهد و راهبردهایی برای جلوگیری از استثناهای مربوط به حافظه درحین حفظ سابقه پیمایش ارائه می‌دهد.

محدودیت تراکنش ۱ مگابایتی و پاک کردن وضعیت

‫Android محدودیت سخت‌گیرانه ۱ مگابایتی را بر حجم کل داده‌هایی که می‌توانند در savedInstanceState ذخیره شوند اعمال می‌کند. این بودجه ۱ مگابایتی در سراسر فرایند برنامه مشترک است. اگر برنامه‌ای چندین نمونه WebView را دربرمی‌گیرد، وضعیت و سابقه پیمایش جمعی آن‌ها باید در این تخصیص مشترک واحد قرار گیرد. فراتر رفتن از این مرز باعث راه‌اندازی TransactionTooLargeException می‌شود، که منجر به ازکارافتادن برنامه می‌شود.

یک استراتژی کاهش رایج اما مشکل‌ساز شامل نظارت بر اندازه بسته حالت WebView و پاک کردن کامل سابقه WebView درصورت عبور از یک آستانه ایمنی دلخواه (مانند ۳۰۰ کیلوبایت) است. اگرچه این کار از خرابی جلوگیری می‌کند، اما باعث پس‌رفت‌های شدیدی در تجربه کاربری می‌شود:

  • ازدست رفتن پیمایش برگشتی: Android اغلب فرایندهای برنامه پس‌زمینه را خاتمه می‌دهد تا حافظه را برای کارهای دیگر بازیابی کند. می‌توانید از saveState(Bundle) در فراخوانی چرخه حیات onSaveInstanceState() برای حفظ سابقه پیمایش استفاده کنید. اگر این سابقه را برای جلوگیری از حد تراکنش ۱ مگابایتی پاک کنید، کل پشته پیمایش ازدست می‌رود. وقتی کاربر به برنامه برمی‌گردد، دکمه برگشتن سیستم بلافاصله از مؤلفه یا برنامه خارج می‌شود زیرا هیچ بافت تاریخی برای پشتیبانی از پیمایش برگشتی باقی نمی‌ماند، صرف‌نظر از اینکه بازراه‌اندازی فرایند رخ داده باشد یا نه.

  • نامعتبرسازی BFCache: پاک کردن سابقه مانع از استفاده برنامه از «حافظه نهان ناوبری بین صفحات» (BFCache) می‌شود و توانایی ارائه فوری صفحه‌های بازدیدشده قبلی را ازبین می‌برد.

  • افزایش تأخیر: کاربران وضعیت فعلی خود را در «وب‌نما» ازدست می‌دهند، که این امر مستلزم پیمایش مجدد و راه‌اندازی اولیه مجدد است. این فرایند به‌طور قابل‌توجهی سربار شبکه و تأخیر تراکنش را افزایش می‌دهد.

راهبردهای کاهش معماری

برای جلوگیری از ازکارافتادن TransactionTooLargeException بدون کاهش کیفیت تجربه کاربری ازطریق حذف کامل سابقه، باید توازن دقیقی بین حفظ وضعیت و کارایی حافظه برقرار کنید. با پیاده‌سازی استراتژی‌های بهینه‌سازی زیر، می‌توانید بودجه تراکنش ۱ مگابایتی را به‌طور ایمن مدیریت کنید و درعین‌حال سابقه پیمایش ضروری و یکپارچگی جلسه را حفظ کنید.

اعمال محدودیت‌های اندازه بر سریال‌سازی وضعیت

به‌جای پاک کردن کامل پشته پیمایش وقتی بیش‌ازحد بزرگ می‌شود، الگوی مؤثرتر این است که داده‌های قدیمی را کوتاه کنید:

  • خط‌مشی حذف هدفمند: از WebViewCompat.saveState() برای سریال‌سازی وضعیت استفاده کنید و درعین‌حال محدودیت بایت خاصی را اعمال کنید (برای مثال، WebViewCompat.saveState(webView, outState, maxSizeBytes)). این API به‌طور خودکار ورودی‌های پیمایش قدیمی‌تر را به‌صورت متوالی حذف می‌کند تا زمانی که کل بار مفید در تخصیص تعریف‌شده شما قرار گیرد. نکته مهم این است که این کار فقط Bundle سریالی‌شده را کوتاه می‌کند، بدون اینکه سابقه زنده WebView فعال را تغییر دهد یا پاک کند، و این اطمینان را می‌دهد که پیمایش فوری به عقب کاملاً دست‌نخورده باقی می‌ماند.

  • برداشتن ورودی بازارسال: اگر میانای برنامه دکمه برگشتن دارد اما دکمه پیمایش به جلو اختصاصی ندارد، می‌توانید با تنظیم پارامتر includeForwardState در میانای برنامه‌سازی کاربردی saveState روی false، همه ورودی‌های پیمایش به جلو را حذف کنید. این کار اندازه بار مفید را به‌طور قابل‌توجهی کاهش می‌دهد بدون اینکه بر مسیرهای ناوبری دردسترس کاربر تأثیر بگذارد.

مدیریت تأخیر منابع با HTTP Cache Quota API

درحالی‌که saveState محدودیت ۱ مگابایتی Bundle را برای سابقه پیمایش زودگذر مدیریت می‌کند، HTTP Cache Quota API کنترل دستی منابع وب پایدار (حافظه نهان دیسک) را به‌صورت هر نمایه ارائه می‌دهد. این کار تمایز واضحی بین بافت پیمایش کوتاه‌مدت و دارایی‌های ذخیره‌شده در حافظه نهان بلندمدت ایجاد می‌کند.

انتخاب سهمیه مناسب شامل موازنه عملکرد است:

  • سهمیه‌های بالاتر با نگهداری دارایی‌های بیشتر در دیسک، دردسترس بودن آفلاین و تأخیر بار کردن منابع را بهبود می‌بخشد.
  • سهمیه‌های پایین‌تر ردپای دیسک برنامه را به‌حداقل می‌رساند و از حذف حافظه پنهان داده‌های مهم دیگر برنامه‌ها توسط سیستم‌عامل جلوگیری می‌کند.

این تنظیمات در بازراه‌اندازی‌های برنامه حفظ می‌شوند و باید از رشته اصلی پیکربندی شوند.

پیاده‌سازی زیر نحوه پیکربندی سهمیه حافظه نهان دیسک را برای نمایه پیش‌فرض نشان می‌دهد:

کاتلین

if (WebViewFeature.isFeatureSupported(WebViewFeature.MULTI_PROFILE) &&
    WebViewFeature.isFeatureSupported(WebViewFeature.HTTP_CACHE)) {
    val defaultProfile = ProfileStore.getInstance()
        .getOrCreateProfile(Profile.DEFAULT_PROFILE_NAME)
    val httpCache = defaultProfile.httpCache

    // Set explicit cache size to 50MB (50 * 1024 * 1024 bytes)
    httpCache.setQuotaBytes(50L * 1024 * 1024)
}

جاوا

if (WebViewFeature.isFeatureSupported(WebViewFeature.MULTI_PROFILE) &&
    WebViewFeature.isFeatureSupported(WebViewFeature.HTTP_CACHE)) {
    Profile defaultProfile = ProfileStore.getInstance()
        .getOrCreateProfile(Profile.DEFAULT_PROFILE_NAME);
    HttpCache httpCache = defaultProfile.getHttpCache();

    // Set explicit cache size to 50MB (50 * 1024 * 1024 bytes)
    httpCache.setQuotaBytes(50L * 1024 * 1024);
}

برای اطلاعات بیشتر درباره استراتژی‌های اندازه‌گذاری سهمیه، مدیریت چرخه حیات، و مرزهای نمایه، به مدیریت سهمیه حافظه نهان اچ‌تی‌تی‌پی در «وب‌نما» مراجعه کنید.

ملاحظات کلیدی عملکرد

نکات زیر محدودیت‌های فنی و رفتارهای داده‌های داخلی را که بر رفتار حالت WebView حاکم است برجسته می‌کند:

  • PageState حباب‌های مات: تقریباً ۷۰٪ از داده‌های ذخیره‌شده توسط saveState شامل PageState حباب‌های داخلی از موتور پردازش است. این داده‌ها وضعیت‌های جزئی جلسه را ضبط می‌کند، ازجمله ورودی‌های فرم و موقعیت‌های پیمایش iframe. از تلاش برای تجزیه یا جداسازی دستی بخش‌های مجزا از این حباب‌ها خودداری کنید، زیرا این کار خطرات امنیتی شدیدی ایجاد می‌کند و یکپارچگی بازیابی جلسه را ازبین می‌برد.

  • مدیریت سابقه دانه‌ای: WebBackForwardList API استاندارد به‌طور پیش‌فرض از حذف دلخواه عناصر سابقه فردی پشتیبانی نمی‌کند. برای مدیریت دقیق وضعیت، باید استراتژی‌های کوتاه کردن را بااستفاده از پارامترهای maxSizeBytes و includeForwardState در WebViewCompat.saveState() پیاده‌سازی کنید تا ایمنی معماری تضمین شود.