ওয়েবভিউতে অনুমানমূলক লোডিং

ব্যবহারকারীর অভিজ্ঞতার জন্য নেভিগেশন ল্যাটেন্সি একটি অত্যন্ত গুরুত্বপূর্ণ মেট্রিক। ডেভেলপারদের এই ল্যাটেন্সি কমাতে সাহায্য করার জন্য, WebView স্পেকুলেটিভ লোডিংয়ের জন্য এপিআই (API) প্রদান করে, যা ব্যবহারকারী স্পষ্টভাবে কোনো কন্টেন্টে নেভিগেট করার আগেই আপনার অ্যাপকে তা ফেচ বা রেন্ডার করার সুযোগ দেয়।

WebView প্রধানত তিন ধরনের স্পেকুলেটিভ লোডিং সমর্থন করে: Preconnect, Prefetch, এবং Prerender।

একটি অনুমানমূলক লোডিং কৌশল বাস্তবায়নের মাধ্যমে, আপনি নিম্নলিখিত বিষয়গুলো অর্জন করতে পারেন:

  • ওয়েব কন্টেন্ট লোডিং ল্যাটেন্সি উল্লেখযোগ্যভাবে হ্রাস করুন: অ্যাপ লাইফসাইকেলে নেটওয়ার্ক শুরুর সময়কে আরও আগে নিয়ে আসুন।
  • উচ্চতর নেভিগেশন সফলতার হার: নেটওয়ার্ক এবং ক্যাশে আগে থেকে প্রস্তুত করে রাখলে, ক্ষণস্থায়ী নেটওয়ার্ক সমস্যার কারণে নেভিগেশন ব্যর্থ হওয়ার সম্ভাবনা কমে যায়।
  • উন্নততর অনুভূত প্রতিক্রিয়াশীলতা: বিশেষ করে, প্রি-রেন্ডারিং তাৎক্ষণিক ট্রানজিশন সক্ষম করে, যা অ্যাপটিকে উল্লেখযোগ্যভাবে দ্রুততর করে তোলে।

একটি অনুমানমূলক লোডিং কৌশল বেছে নিন

এই কৌশলগুলোর মধ্যে মূল পার্থক্যটি হলো এদের পরিধি: প্রিকানেক্ট এপিআই হলো অরিজিন-ভিত্তিক, যার মানে হলো এর জন্য শুধু টার্গেট ডোমেইন প্রয়োজন। প্রিফেচ এবং প্রিরেন্ডার এপিআই হলো ইউআরএল-ভিত্তিক, যার মানে হলো এগুলোর জন্য ওয়েবপেজের সঠিক পাথ প্রয়োজন।

যেহেতু প্রিকানেক্ট অরিজিন লেভেলে কাজ করে, তাই অ্যাপ লাইফসাইকেলের অনেক আগেই এটি চালু করা যায়, এমনকি ব্যবহারকারী কোন নির্দিষ্ট কন্টেন্ট বা পেজে যাবে তা জানার আগেও।

আপনার ব্যবহারের ক্ষেত্রে সঠিক কৌশলটি বেছে নিতে সাহায্য করার জন্য, নিচের সারণিতে এই তিনটি কৌশলের তুলনা করা হলো:

বৈশিষ্ট্য প্রিকানেক্ট প্রিফেচ প্রি-রেন্ডার
প্রাথমিক লক্ষ্য সংযোগটি উষ্ণ করুন শুধুমাত্র HTML ক্যাশ করুন (জাভাস্ক্রিপ্ট বা CSS ছাড়া) সম্পূর্ণ পৃষ্ঠাটি প্রি-রেন্ডার করুন
পরিধি প্রোফাইল স্তর (ওয়েবভিউ জুড়ে শেয়ার করা) প্রোফাইল স্তর (ওয়েবভিউ জুড়ে শেয়ার করা) ওয়েবভিউ স্তর (একটি নির্দিষ্ট ওয়েবভিউ-এর সাথে আবদ্ধ)
জেটপ্যাক ওয়েবকিট এপিআই androidx.webkit.Profile androidx.webkit.Profile androidx.webkit.WebViewCompat
কোর এপিআই পদ্ধতি preconnect(...) prefetchUrlAsync(...) prerenderUrlAsync(...)
কনফিগারেশন প্রযোজ্য নয় PrefetchCache.setMaxPrefetches()
PrefetchCache.setPrefetchTtlSeconds()
setMaxPrerenders()
সম্পদ ব্যবহার নিম্ন (নেটওয়ার্ক) মাধ্যম (নেটওয়ার্ক, মেমরি) উচ্চ (সিপিইউ, মেমরি, নেটওয়ার্ক)
কখন ব্যবহার করবেন যখন লক্ষ্যস্থলের উৎস জানা থাকে, কিন্তু নির্দিষ্ট ইউআরএলটি এখনো নির্ধারিত হয়নি। যখন সঠিক URL জানা থাকে এবং নেভিগেশনের সম্ভাবনা থাকে, তখন WebView-গুলোর মধ্যে ক্যাশিং শেয়ার করা হয়। যখন সঠিক URL জানা থাকে এবং একটি নির্দিষ্ট WebView-এর মধ্যে নেভিগেশন অত্যন্ত নিশ্চিত হয়।
সুবিধা অরিজিনে যেকোনো URL-এর জন্য দ্রুততর সংযোগ স্থাপন। মিলে যাওয়া URL-গুলির জন্য নেটওয়ার্ক লোড দ্রুততর হয়। সক্রিয় করার সাথে সাথেই তাৎক্ষণিক নেভিগেশন।

উৎসের সাথে পূর্ব-সংযোগ করুন

প্রি-কানেক্টিং একটি নির্দিষ্ট অরিজিনের জন্য পূর্বেই ডিএনএস লুকআপ এবং টিসিপি/টিএলএস হ্যান্ডশেক সম্পন্ন করার মাধ্যমে ভবিষ্যতের লোডের গতি বাড়ায়।

Prefetch এবং Prerender-এর মতো নয়, যেগুলোর জন্য একটি সুনির্দিষ্ট গন্তব্য URL প্রয়োজন হয়, Preconnect সম্পূর্ণরূপে অরিজিন-ভিত্তিক। এর ফলে আপনি Prefetch এবং Prerender-এর চেয়ে অনেক আগেই Preconnect কলটি করতে পারেন।

এই স্বল্প-সম্পদযুক্ত, প্রোফাইল-স্তরের কৌশলটি সেই প্রোফাইলটি শেয়ার করা যেকোনো ওয়েবভিউ-এর জন্য প্রাথমিক লেটেন্সি হ্রাস করে, যদি অরিজিনটি আগে থেকে ভিজিট করা না হয়ে থাকে। সংযোগটি প্রায় ৩০ সেকেন্ডের জন্য খোলা থাকে, যা হ্যান্ডশেক ওভারহেড দূর করার মাধ্যমে পরবর্তী যেকোনো ক্রস-অরিজিন HTTP অনুরোধ, নেভিগেশন বা সাবরিসোর্সকে সুবিধা প্রদান করে।

বাস্তবায়ন

একটি প্রিকানেকশন শুরু করতে, একটি Profile ইনস্ট্যান্সে preconnect(String url) কল করুন। এই API-টি অবশ্যই UI থ্রেডে কল করতে হবে এবং এর জন্য WebViewFeature.PRECONNECT সমর্থিত থাকা আবশ্যক।

এপিআইটি অরিজিনে কাজ করে, কিন্তু সুবিধার জন্য একটি সম্পূর্ণ ইউআরএল দেওয়া যেতে পারে (যেমন https://www.example.com/index.html )। এটিকে স্বয়ংক্রিয়ভাবে অরিজিনে একটি কল হিসেবে গণ্য করা হয় (উদাহরণস্বরূপ, https://www.example.com )। এই এপিআইটি একাধিকবার কল করার মাধ্যমে একাধিক অরিজিনের সাথে সংযোগ স্থাপন করা যায়।

কোটলিন

// Must be called on the @UiThread
if (WebViewFeature.isFeatureSupported(WebViewFeature.PRECONNECT)) {
    profile.preconnect("https://www.example.com/index.html")
    // This initiates a connection to the origin https://www.example.com
}

জাভা

// Must be called on the @UiThread
if (WebViewFeature.isFeatureSupported(WebViewFeature.PRECONNECT)) {
    profile.preconnect("https://www.example.com/index.html");
    // This initiates a connection to the origin https://www.example.com
}

সাধারণ কনফিগারেশন: PrefetchParameters এবং PrerenderParameters

Prefetch এবং Prerender উভয়ই রিকোয়েস্ট কাস্টমাইজ করার জন্য PrefetchParameters বা PrerenderParameters ব্যবহার করে। এই ক্লাসগুলো আপনাকে ইউআরএল ম্যাচিংয়ের জন্য অতিরিক্ত হেডার এবং হিন্টস প্রদান করতে দেয়, যেমন No-Vary-Search কনফিগারেশন

কোটলিন

// Isolated configuration specifically for Cache-Level Prefetching
val prefetchParams = PrefetchParameters.Builder()
    .addAdditionalHeader("X-Custom-Client", "Android-App-V2")
    .setExpectedNoVarySearchHeader(
        NoVarySearchHeader.varyExcept(true, listOf("session_id", "click_ref"))
    )
    .build()

জাভা

PrefetchParameters prefetchParams = new PrefetchParameters.Builder()
    .addAdditionalHeader("X-Custom-Header", "value")
    /**
     * Hint to ignore specific query parameters during cache matching.
     * This allows the cache to match even if the tracking_id differs.
     */
    .setExpectedNoVarySearchHeader(
        NoVarySearchHeader.varyExcept(true, Arrays.asList("tracking_id"))
    )
    /**
     * Determines if Client Hints are sent.
     * NOTE: This is ignored for Prerendering API requests, which default to
     * the WebView's WebSettings.getJavaScriptEnabled() value.
     */
    .setJavaScriptEnabled(true)
    .build();

বিষয়বস্তু প্রিফেচিং

প্রিফেচিং একটি ইউআরএল-এর মূল এইচটিএমএল রিসোর্স ডাউনলোড করে এবং প্রোফাইলের নেটওয়ার্ক ক্যাশে তা সংরক্ষণ করে। ওয়েবভিউতে, একটি Profile ব্রাউজার ডেটার ধারক হিসেবে কাজ করে, যার মধ্যে কুকি, এইচটিটিপি ক্যাশে এবং সার্ভিস ওয়ার্কার অন্তর্ভুক্ত। যেহেতু প্রিফেচ একটি প্রোফাইল-স্তরের অপারেশন, তাই সেই প্রোফাইলের সাথে যুক্ত যেকোনো WebView ক্যাশ করা প্রতিক্রিয়াটি ব্যবহার করতে পারে।

বাস্তবায়ন

প্রিফেচ শুরু করতে, একটি Profile ইনস্ট্যান্সে prefetchUrlAsync() কল করুন। এই অপারেশনটি শুধুমাত্র HTTPS স্কিম সমর্থন করে।

কোটলিন

profile.prefetchUrlAsync(
    url,
    prefetchParams,
    cancellationSignal,
    executor,
    object : WebViewOutcomeReceiver<PrefetchResult, PrefetchException> {
        override fun onResult(result: PrefetchResult) {
            if (result.wasDuplicate()) {
                // URL and No-Vary-Search permutations already exist in the cache layer
            } else {
                // The HTML payload has been successfully secured in the HTTP cache
            }
        }

        override fun onError(error: PrefetchException) {
            when (error) {
                is PrefetchNetworkException -> {
                    // Isolates network layer or server-side HTTP anomalies
                    val code = error.httpStatusCode
                    // Facilitates rapid diagnosis of 4xx or 5xx server responses
                }
                else -> {
                    // Catches generalized execution failures and system constraints
                }
            }
        }
    }
)

জাভা

profile.prefetchUrlAsync(
    url,
    prefetchParams,
    cancellationSignal,
    executor,
    new WebViewOutcomeReceiver<PrefetchResult, PrefetchException>() {
        @Override
        public void onResult(PrefetchResult result) {
            if (result.wasDuplicate()) {
                // URL and No-Vary-Search permutations already exist in the cache layer
            } else {
                // The HTML payload has been successfully secured in the HTTP cache
            }
        }

        @Override
        public void onError(PrefetchException error) {
            if (error instanceof PrefetchNetworkException) {
                // Isolates network layer or server-side HTTP anomalies
                int code = ((PrefetchNetworkException) error).httpStatusCode;
                // Facilitates rapid diagnosis of 4xx or 5xx server responses
            } else {
                // Catches generalized execution failures and system constraints
            }
        }
    }
);

ইন্টারসেপশন জীবনচক্র

WebView প্রিফেচ রিকোয়েস্ট shouldInterceptRequest() কলব্যাকটি কখন এবং কীভাবে ট্রিগার হবে তা পরিবর্তন করে। যেহেতু আপনার প্রিফেচ করা কন্টেন্ট সফলভাবে ব্যবহৃত হবে কিনা তার উপর এর সরাসরি প্রভাব রয়েছে, তাই এর দ্বি-পদক্ষেপ জীবনচক্রটি বোঝা অত্যন্ত গুরুত্বপূর্ণ:

ডায়াগ্রাম যা স্পেকুলেটিভ এবং নেভিগেশন পর্যায়ের সময়কার দ্বি-ধাপবিশিষ্ট ওয়েবভিউ প্রিফেচ ইন্টারসেপশন জীবনচক্র দেখাচ্ছে।
চিত্র ১. ওয়েবভিউ প্রিফেচ অনুরোধ এবং নেভিগেশনের দ্বি-ধাপীয় বাধা প্রদান জীবনচক্র।

১. অনুমানমূলক পর্যায় (প্রিফেচ অনুরোধ)

যখন prefetchUrlAsync() কল করা হয়, WebView ব্যাকগ্রাউন্ডে মূল HTML রিসোর্সটি ডাউনলোড করে। এই ব্যাকগ্রাউন্ড রিকোয়েস্টের জন্য shouldInterceptRequest() সম্পূর্ণভাবে এড়িয়ে যাওয়া হয়। সাধারণত আপনার ইন্টারসেপ্টরের ভেতরে যে কাস্টম লজিক, অথরাইজেশন টোকেন বা হেডার ইনজেকশনগুলো হ্যান্ডেল করা হয়, সেগুলো প্রিফেচ করা HTML রিসোর্সটিতে প্রয়োগ করা হয় না।

২. নেভিগেশন পর্যায় (ব্যবহারকারী সক্রিয়করণ)

যখন অ্যাপটি স্পষ্টভাবে URL-টিতে নেভিগেট করে (উদাহরণস্বরূপ, loadUrl() ব্যবহার করে) অথবা ব্যবহারকারী একটি মিলে যাওয়া লিঙ্কে ক্লিক করেন, তখন WebView নির্ধারণ করে যে এটি প্রিফেচড ক্যাশে ব্যবহার করতে পারবে কি না:

  • মূল HTML মূল্যায়ন: এই মুহূর্তে WebView মূল HTML-এর জন্য shouldInterceptRequest() ট্রিগার করবে। প্রিফেচ ক্যাশে থেকে সফলভাবে পেজটি পরিবেশন করার জন্য, আপনার ইন্টারসেপ্টরকে অবশ্যই null রিটার্ন করতে হবে। যদি আপনি একটি কাস্টম WebResourceResponse রিটার্ন করেন, তাহলে WebView আপনার ইন্টারসেপ্টরকে সম্মান করে এবং প্রিফেচ ক্যাশেকে সম্পূর্ণরূপে বাইপাস করে।

  • সাব-রিসোর্স মূল্যায়ন: প্রিফেচ করা HTML ব্যবহারের জন্য অনুমোদন পাওয়ার পর, পৃষ্ঠাটি রেন্ডার করা শেষ করার জন্য প্রয়োজনীয় পরবর্তী সমস্ত সাব-রিসোর্সের (যেমন, ছবি, স্ক্রিপ্ট এবং CSS) জন্য shouldInterceptRequest() স্বাভাবিকভাবে ট্রিগার হয়।

মূল আচরণ

নিম্নলিখিত কার্যক্ষম বৈশিষ্ট্য এবং যোগ্যতা যাচাইয়ের উপর ভিত্তি করে WebView প্রিফেচ অনুরোধ শুরু ও পরিচালনা করে:

  • থ্রেড নিরাপত্তা: যেকোনো থ্রেড থেকে অনুরোধ শুরু করা যেতে পারে।
  • যোগ্যতা: কোনো অনুরোধ ফেচ করার আগে, WebView নিম্নলিখিত বিষয়গুলো যাচাই করে নিশ্চিত করে যে অনুরোধটি নিরাপদ এবং প্রাসঙ্গিকভাবে উপযুক্ত।
    • বিদ্যমান কুকি: ব্যবহারকারীর গোপনীয়তা রক্ষা করতে এবং CSRF-এর মতো পার্শ্বপ্রতিক্রিয়া প্রতিরোধ করতে, যদি অনুরোধটির জন্য এমন নির্দিষ্ট প্রমাণীকৃত কুকির প্রয়োজন হয় যা সার্ভারের অবস্থার পরিবর্তন ঘটাতে পারে, তাহলে WebView প্রিফেচিং এড়িয়ে যেতে পারে।
    • সার্ভিস ওয়ার্কারের উপস্থিতি: যদি কোনো সার্ভিস ওয়ার্কার ইতিমধ্যেই URL-টির স্কোপ নিয়ন্ত্রণ করে থাকে, তাহলে WebView একটি স্ট্যান্ডার্ড নেটওয়ার্ক প্রিফেচ শুরু করার পরিবর্তে সার্ভিস ওয়ার্কারটির ফেচ হ্যান্ডলারের উপর নির্ভর করতে পারে।
    • প্রক্সির প্রাপ্যতা: জটিল নেটওয়ার্ক কনফিগারেশনের অধীনে স্পেকুলেটিভ অনুরোধ ব্যর্থ হওয়া এড়ানোর জন্য, WebView বর্তমান নেটওয়ার্ক পাথ (যেকোনো কনফিগার করা প্রক্সি সহ) স্থিতিশীল কিনা তা যাচাই করে।
  • যদি কোনো প্রিফেচ শুরু হতে ব্যর্থ হয় (এমনকি বৈধ প্যারামিটার থাকা সত্ত্বেও), তবে এর কারণ প্রায়শই এই যে, WebView নির্ধারণ করে যে একটি ব্যাকগ্রাউন্ড রিকোয়েস্ট ব্যবহারকারীর বর্তমান সেশন বা নিরাপত্তা অবস্থায় হস্তক্ষেপ করতে পারে।
  • বাতিলকরণ: চলমান কোনো অনুরোধ বন্ধ করতে এবং সেটিকে ক্যাশে হওয়া থেকে বিরত রাখতে CancellationSignal ব্যবহার করুন।

প্রি-রেন্ডারিং পৃষ্ঠাগুলি

প্রি-রেন্ডারিং ব্যাকগ্রাউন্ডে একটি পেজকে সম্পূর্ণরূপে রেন্ডার করার জন্য লুকানো "ওয়েব কন্টেন্ট" তৈরি করে, যার মধ্যে স্ক্রিপ্ট এক্সিকিউশন এবং সাবরিসোর্স ফেচিং অন্তর্ভুক্ত থাকে। প্রি-রেন্ডারিং প্রিফেচিং-এর মতোই একই অন্তর্নিহিত পরিকাঠামোর উপর নির্ভর করে। যদি কোনো অ্যাপ প্রি-রেন্ডার শুরু করে, তাহলে WebView প্রথমে প্রি-রেন্ডার নেভিগেশন পরিবেশন করার জন্য রেসপন্সটি প্রিফেচ করে, যা অপ্রয়োজনীয় নেটওয়ার্ক কার্যকলাপ এড়িয়ে চলে।

বাস্তবায়ন

প্রি-রেন্ডারিং একটি WebView ইনস্ট্যান্স-স্তরের অপারেশন। UI থ্রেড থেকে WebViewCompat ব্যবহার করে prerenderUrlAsync() কল করুন।

কোটলিন

WebViewCompat.prerenderUrlAsync(
    webView,
    url,
    cancellationSignal,
    executor,
    params,
    object : PrerenderOperationCallback {
        override fun onPrerenderActivated() {
            // Called when the user navigates to the URL and the hidden page is swapped in
        }

        override fun onError(exception: Throwable) {
            // exception is an instance of PrerenderException
            // Handle prerender failure (for example, memory pressure or disallowed JavaScript APIs)
        }
    }
)

জাভা

WebViewCompat.prerenderUrlAsync(webView, url, cancellationSignal, executor, params, new PrerenderOperationCallback() {
    @Override
    public void onPrerenderActivated() {
        // Called when the user navigates to the URL and the hidden page is swapped in.
    }

    @Override
    public void onError(@NonNull Throwable exception) {
        // Handle prerender failure (for example, resource constraints or disallowed APIs).
    }
});

prefetch এবং prerender উভয়ই সম্পূর্ণরূপে অ্যাসিঙ্ক্রোনাস। prefetchUrlAsync() যেকোনো থ্রেড থেকে কল করা যেতে পারে, অন্যদিকে prerenderUrlAsync() অবশ্যই UI থ্রেড থেকে শুরু করতে হবে।

প্রযুক্তিগত সীমাবদ্ধতা

তাৎক্ষণিক নেভিগেশন এবং সিস্টেমের সুস্থতার মধ্যে ভারসাম্য বজায় রাখতে, WebView নিম্নলিখিত রানটাইম সীমাবদ্ধতাগুলি প্রয়োগ করে:

  • মেমরির চাপ: ডিভাইসে র‍্যাম কম থাকলে WebView আগে থেকে রেন্ডার করা URL-গুলো বাতিল করে দেয়।
  • অননুমোদিত এপিআই: ব্যাকগ্রাউন্ড কনটেক্সটে জাভাস্ক্রিপ্ট দ্বারা নির্দিষ্ট কিছু এপিআই (যেমন, অডিও প্লেব্যাক, অ্যালার্ট) অ্যাক্সেস করার যেকোনো প্রচেষ্টা প্রি-রেন্ডারটি অবিলম্বে বন্ধ করে দেবে।
  • ইনস্ট্যান্স সীমা: প্রতিটি ওয়েবভিউ-এর জন্য অনুমোদিত সক্রিয় প্রি-রেন্ডার করা URL-এর সংখ্যা সীমিত।

URL মিলকরণ এবং নো-ভ্যারি-সার্চ (NVS)

প্রি-লোডেড রিসোর্সটি যেন শুধুমাত্র তার উদ্দিষ্ট নেভিগেশনের জন্যই পরিবেশিত হয়, তা নিশ্চিত করতে WebView-এর একটি নির্ভরযোগ্য ম্যাচিং অ্যালগরিদম প্রয়োজন।

এক্সাক্ট ম্যাচ বনাম এনভিএস ম্যাচ

ডিফল্টরূপে, প্রিফেচ এবং প্রিরেন্ডারের জন্য ইউআরএল-এর হুবহু মিল থাকা আবশ্যক। যদি নেভিগেট করা ইউআরএলটি প্রিলোড করা ইউআরএল-এর সাথে অভিন্ন হয়, তবে সেটি ক্যাশে থেকে তাৎক্ষণিকভাবে পরিবেশন করা হয়। যদি কোয়েরি প্যারামিটার ভিন্ন হয়, তাহলে ওয়েবভিউ নিম্নলিখিত নো-ভ্যারি-সার্চ (NVS) নিয়মগুলো ব্যবহার করে:

  • ইঙ্গিত: ডেভেলপাররা ওয়েবভিউ শুরু করার সময় একটি setExpectedNoVarySearchHeader() ইঙ্গিত দিয়ে থাকেন। যদি নেভিগেট করা URL-টি, ইঙ্গিত দেওয়া প্যারামিটারগুলো বাদ দিয়ে পাওয়া রিকোয়েস্ট URL-এর সাথে মিলে যায়, তাহলে সার্ভারের আসল হেডারগুলোর জন্য অপেক্ষা করতে WebView কিছুক্ষণের জন্য ব্লক হয়ে যায়।
  • সার্ভার হেডার: সার্ভার থেকে আসা NVS রেসপন্স হেডারই হলো চূড়ান্ত কর্তৃপক্ষ। যদি সার্ভার নিশ্চিত করে যে কোয়েরির পার্থক্যগুলো উপেক্ষা করা উচিত, তবে ক্যাশ থেকে মিলযুক্ত ফলাফলটি পরিবেশন করা হয়। অন্যথায়, WebView একটি কোল্ড নেটওয়ার্ক লোডে ফিরে যায়।

নো-ভ্যারি-সার্চ (NVS) উন্নত ব্যবহারের জন্য, এবং বেশিরভাগ ডেভেলপারের এটির প্রয়োজন নাও হতে পারে কারণ তারা প্রিফেচ এবং loadUrl() উভয় ক্ষেত্রেই হুবহু একই ইউআরএল পাস করে থাকেন। এই নির্দেশিকাটি কেবল তখনই প্রয়োজন, যখন প্রিফেচ ইউআরএল এবং loadUrl() ইউআরএল-এর কোয়েরি প্যারামিটারে কোনো পার্থক্য থাকে।

বৈশ্বিক কনফিগারেশন

প্রোফাইল লেভেলে PrefetchCache লিমিট এবং সর্বোচ্চ প্রি-রেন্ডার কনফিগার করার মাধ্যমে স্পেকুলেটিভ লোডিং আচরণ নিয়ন্ত্রণ করুন। এছাড়াও আপনি কাস্টম প্রিফেচ লিমিটগুলোকে সিস্টেমের ডিফল্ট সেটিংসে রিসেট করতে পারেন:

কোটলিন

// Configure prefetch cache limits
profile.prefetchCache.setMaxPrefetches(10)
profile.prefetchCache.setPrefetchTtlSeconds(60)

// Reset to system defaults when needed
profile.prefetchCache.clearMaxPrefetches()

// Configure maximum active prerenders
profile.setMaxPrerenders(2)

জাভা

// Configure prefetch cache limits
PrefetchCache prefetchCache = profile.getPrefetchCache();
prefetchCache.setMaxPrefetches(10);
prefetchCache.setPrefetchTtlSeconds(60);

// Reset to system defaults when needed
prefetchCache.clearMaxPrefetches();

// Configure maximum active prerenders
profile.setMaxPrerenders(2);

ত্রুটি পরিচালনা এবং ব্যতিক্রম

স্পেকুলেটিভ অপারেশনগুলো ফলাফল জানানোর জন্য OutcomeReceiverCompat বা PrerenderOperationCallback ব্যবহার করে।

প্রাথমিক ব্যতিক্রম

যখন কোনো স্পেকুলেটিভ লোডিং অপারেশন ব্যর্থ হয়, তখন আপনার এরর হ্যান্ডলার নির্দিষ্ট ব্যর্থতার পরিস্থিতি নির্ণয়ে সাহায্য করার জন্য নিম্নলিখিত প্রধান এক্সেপশন টাইপগুলোর মধ্যে একটি রিপোর্ট করে:

  • PrefetchException : সকল অ্যাসিঙ্ক্রোনাস প্রিফেচ ত্রুটির মূল ক্লাস।
  • PrefetchNetworkException : এটি নেটওয়ার্ক বা সার্ভার পর্যায়ের ব্যর্থতা নির্দেশ করে। সার্ভার-সাইডের সমস্যা নির্ণয়ে সহায়তার জন্য এতে একটি httpStatusCode ফিল্ড (যেমন, 404 বা 503) অন্তর্ভুক্ত থাকতে পারে।
  • PrerenderException : সমস্ত প্রি-রেন্ডার-সম্পর্কিত ত্রুটির সুপারক্লাস, যেমন মেমরির চাপের কারণে ব্যর্থতা অথবা ব্যাকগ্রাউন্ডে অননুমোদিত এপিআই (যেমন অডিও প্লেব্যাক) ব্যবহার।

অপ্টিমাইজেশন কৌশল

সিস্টেম রিসোর্স সংরক্ষণ করার পাশাপাশি স্পেকুলেটিভ লোডিং-এর সুবিধা সর্বাধিক করতে এই সুপারিশগুলো অনুসরণ করুন:

  • আগেভাগেই শুরু করুন: অ্যাপ চালু হওয়ার সময় অথবা নেভিগেশনের কোনো গন্তব্য সম্ভাব্য হওয়ার সাথে সাথেই প্রিফেচিং শুরু করুন।
  • সমন্বিত কৌশল: আপনি যদি প্রিফেচ ক্যাশে আগে থেকেই থাকা কোনো ইউআরএল প্রি-রেন্ডার করেন, তাহলে প্রি-রেন্ডার নেভিগেশনটি সেই ক্যাশে থেকেই পরিবেশিত হয়, যার ফলে অপ্রয়োজনীয় নেটওয়ার্ক অনুরোধ এড়ানো যায়।
  • কোটা নিরীক্ষণ করুন: প্রি-রেন্ডারিং একটি রিসোর্স-হেভি প্রক্রিয়া। একাধিক সম্ভাব্য বিকল্পের জন্য প্রি-ফেচিংকে অগ্রাধিকার দিন এবং শুধুমাত্র সবচেয়ে সম্ভাব্য নেভিগেশনটির জন্য প্রি-রেন্ডারিং সংরক্ষিত রাখুন।
  • স্কিম সমর্থন: নিশ্চিত করুন যে সমস্ত URL বাধ্যতামূলক HTTPS স্কিম ব্যবহার করে। অবৈধ স্কিম বা নাল ইনপুট একটি সিনক্রোনাস IllegalArgumentException ট্রিগার করে।

অতিরিক্ত সম্পদ

ওয়েব অ্যাপ ডিবাগিং, WebView স্টার্টআপ পারফরম্যান্স অপ্টিমাইজ করা এবং রেন্ডারার প্রসেস টার্মিনেশন পরিচালনা সম্পর্কে আরও জানতে, নিম্নলিখিত রিসোর্সগুলো দেখুন: