`ShouldOverrideUllLoading` কি সত্যিই হ্রাস করা উচিত? পরিবর্তে আমি কী ব্যবহার করতে পারি?


138

"ShouldOverrideUrlLoading" কি সত্যই অবমূল্যায়িত হয়েছে? যদি তা হয় তবে এর পরিবর্তে আমি কী ব্যবহার করতে পারি?

এটা তোলে মত মনে হয় shouldOverrideUrlLoadingঅবচিত লক্ষ্য করে অ্যান্ড্রয়েড এন এবং আমি যেহেতু এপিআই 19 ডান এখন সর্বশেষ যা অ্যান্ড্রয়েড এন (বিটা) পর্যন্ত, আমি যে (ডেটা সেভার মত) অ্যান্ড্রয়েড এন নতুন কিছু বৈশিষ্ট্য ব্যবহার একটি অ্যাপ্লিকেশন কাজ করতে হবে, তাই লক্ষ্য করে মার্শমেলো ইস্যুতে সহায়তা করবে না যেহেতু আমাকে এই নতুন বৈশিষ্ট্যগুলি ব্যবহার করা দরকার, আমি যে কোডটি ব্যবহার করি সেটির অংশটি এখানে:

public boolean shouldOverrideUrlLoading(WebView webview, String url) {
    if (url.startsWith("http:") || url.startsWith("https:")) {
        ...
    } else if (url.startsWith("sms:")) {
        ...
    }
    ...
}

অ্যান্ড্রয়েড স্টুডিও আমাকে এই বার্তাটি দিয়েছে:

'Android.webkit.WebViewClient' এ অবচয় পদ্ধতিতে ওভাররাইড করে এই পরিদর্শনটি রিপোর্ট করে যেখানে নির্দিষ্ট পরিদর্শন সুযোগে অবহেলিত কোড ব্যবহৃত হয়।

গুগল এই অবমূল্যায়ন সম্পর্কে কিছুই বলে না

আমি ভাবছি যদি ব্যবহার করা @SuppressWarnings("deprecation")আমাকে সর্বশেষ অ্যান্ড্রয়েড এন বিটা (এবং এটি প্রকাশিত হওয়ার পরে এর চূড়ান্ত সংস্করণ) পর্যন্ত এপিআই 19 সাল থেকে সমস্ত ডিভাইসে কাজ করতে দেয়, আমি নিজে এটি পরীক্ষা করতে পারি না, আমি কখনই এটি ব্যবহার করি নি এবং আমার নিশ্চিত হওয়া দরকার যে এটি কাজ করে, তাই, কেউ বলতে পারেন?


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

প্রথমত, মন্তব্যের জন্য ধন্যবাদ, আমি যে সংস্করণটি ব্যবহার করছি তা আমি মনে করি এটি ভাল, কারণ স্ট্রিংয়ের নাম বাদে অ্যান্ড্রয়েড বিকাশকারী ডক্সের মতো হুবহু মিল রয়েছে, তারা "ভিউ" ব্যবহার করেছিল এবং আমি "ওয়েবভিউ" ব্যবহার করেছি , বাকিটি একইরকম, তাই কেন এটি সমস্ত সংস্করণে কাজ করতে পারি?
মিনিয়ন

উত্তর:


95

আমি যে সংস্করণটি ব্যবহার করছি তা আমি মনে করি এটি ভাল, কারণ স্ট্রিংয়ের নাম বাদে অ্যান্ড্রয়েড বিকাশকারী ডক্সের সাথে হুবহু মিল রয়েছে, তারা "ভিউ" ব্যবহার করেছিল এবং আমি "ওয়েবভিউ" ব্যবহার করেছি, বাকিটি একই রকম

না এটা না.

এন বিকাশকারী পূর্বরূপে নতুন যেটির কাছে এই পদ্ধতির স্বাক্ষর রয়েছে:

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

এন সহ সমস্ত অ্যান্ড্রয়েড সংস্করণ দ্বারা সমর্থিত এমনটির এই পদ্ধতির স্বাক্ষর রয়েছে:

public boolean shouldOverrideUrlLoading(WebView view, String url)

সুতরাং কেন আমি এটি সমস্ত সংস্করণে কাজ করতে পারি?

হ্রাসপ্রাপ্তটিকে ওভাররাইড করুন, Stringএটি দ্বিতীয় পরামিতি হিসাবে গ্রহণ করে ।


হ্যালো, এবং উত্তরের জন্য ধন্যবাদ, এপিআই 19 এর পরেও এটি সামঞ্জস্যপূর্ণ নয়, কারণ ইউআরএল স্ট্রিং পেতে আমাকে "url.getUrl ()। টু স্ট্রিং ()" ব্যবহার করতে হবে এবং এটি এপিআই 21-এ যুক্ত করা হয়েছে, যে কোনও উপায়ে এটি 19 এপিআই থেকে কাজ করে?
মিনিয়ন

3
@ মিনিয়ন: "এটি এপিআই 19 এর পরে এখনও উপযুক্ত নয়" - হ্যাঁ, এটি। "কারণ ইউআরএল স্ট্রিং পেতে আমাকে" url.getUrl ()। toString () "" ব্যবহার করতে হবে - না, ইউআরএলটি দ্বিতীয় পরামিতি হিসাবে সরবরাহ করা হয়েছে, এর আকারে String। উদাহরণস্বরূপ, এপিআই লেভেল ১৯ এর বিপরীতে সংকলিত এই নমুনা অ্যাপ্লিকেশনটি দুর্দান্ত কাজ করে যেমন অ্যান্ড্রয়েড
.0.০

হ্যালো, "WebResourceRequest অনুরোধ" এর ব্যবহার স্ট্রিং প্যারামিটার নেই
চাটুকার

2
@ মিনিন: সঠিক। এটি কেবল অ্যান্ড্রয়েড এন (এবং সম্ভবত সম্ভবত উচ্চতর) এ কাজ করে। আপনি জিজ্ঞাসা করেছিলেন "তাই কেন এটি সমস্ত সংস্করণে কাজ করার জন্য আমি করব?" আমি আপনাকে অবহেলিতটিকে ওভাররাইড করতে বলেছিলাম, Stringএটি দ্বিতীয় প্যারামিটার হিসাবে গ্রহণ করে । উদাহরণস্বরূপ, আমি যে নমুনা অ্যাপ্লিকেশনটির সাথে লিঙ্ক করেছি, যা
হ্রাস করা কলব্যাককে

6
আপনি যদি ভবিষ্যতের প্রুফ হতে চান তবে আপনি আসলে দুটি পদ্ধতি ওভাররাইড করতে পারেন। এইভাবে আপনার অ্যাপ্লিকেশন <21 এ কাজ চালিয়ে যাবে, তবে তারা পুরানো পদ্ধতিটিকে পুরোপুরি অবমূল্যায়ন করলে আপনি যেতে প্রস্তুত be এবং আপনাকে উদ্বিগ্ন getUrl()হওয়ার দরকার নেই কারণ নতুন পদ্ধতিটি কেবল 24+ ডাকা হবে
yuval

187

ভবিষ্যতের পাঠকদের জন্য বিশদে ডকুমেন্টিং:

সংক্ষিপ্ত উত্তরটি আপনার উভয় পদ্ধতিকে ওভাররাইড করতে হবে। shouldOverrideUrlLoading(WebView view, String url)পদ্ধতি এপিআই 24-এ অনুমোদিত নয় এবং shouldOverrideUrlLoading(WebView view, WebResourceRequest request)পদ্ধতি এপিআই 24 সালে যোগ করা হয় আপনি Android এর পুরোনো সংস্করণগুলি লক্ষ্য করে হয়, আপনি প্রয়োজন সাবেক পদ্ধতি, এবং যদি আপনি 24 লক্ষ্য করে করা হয় (অথবা পরে, যদি কেউ দূরবর্তী ভবিষ্যতে এই পড়া হয়) পরের পদ্ধতিটি পাশাপাশি ওভাররাইড করার পরামর্শ দেওয়া হচ্ছে।

আপনি কীভাবে এটি সম্পাদন করবেন তার নীচে কঙ্কালটি দেওয়া হল:

class CustomWebViewClient extends WebViewClient {

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        final Uri uri = Uri.parse(url);
        return handleUri(uri);
    }

    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        final Uri uri = request.getUrl();
        return handleUri(uri);
    }

    private boolean handleUri(final Uri uri) {
        Log.i(TAG, "Uri =" + uri);
        final String host = uri.getHost();
        final String scheme = uri.getScheme();
        // Based on some condition you need to determine if you are going to load the url 
        // in your web view itself or in a browser. 
        // You can use `host` or `scheme` or any part of the `uri` to decide.
        if (/* any condition */) {
            // Returning false means that you are going to load this url in the webView itself
            return false;
        } else {
            // Returning true means that you need to handle what to do with the url
            // e.g. open web page in a Browser
            final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
            return true;
        }
    }
}

ঠিক যেমন shouldOverrideUrlLoading, আপনি পদ্ধতির জন্য একই ধরণের পদ্ধতির সাথে আসতে পারেন shouldInterceptRequest


6
@ webo80 আসলে এটা API24 / এন সংযোজন করা হয় developer.android.com/reference/android/webkit/...
হেনরি

3
এটা ব্যবহার করা ভালো @RequiresApiএখানে ভবিষ্যতে ব্যবহারের জন্য @TargetApi পরিবর্তে
Hibbem

1
কমপক্ষে কমপক্ষে উভয় পদ্ধতিই ওভাররাইড করার সমস্যাটি shouldInterceptRequestহ'ল অ্যান্ড্রয়েড এন + ডিভাইসগুলিতে তারা উভয়ই অনুরোধ করা হয়েছে এবং আপনি প্রতিটি ইউরি দু'বার পরিচালনা করবেন! তার প্রতিকারের জন্য, Build.VERSION.SDK_INT < Build.VERSION_CODES.Nঅবচিত সংস্করণে আমি একটি শর্ত যুক্ত করেছি ।
জোনিক

8
@ জনলিঃ সাধারণতঃ কেবলমাত্র একটি পদ্ধতি ব্যবহার করা হবে। তবে আপনি যদি super. shouldOverrideUrlLoading(view,request)অবহিত-বিহীন পদ্ধতিতে রেখেছিলেন তবে হ্যাঁ অবহিত এবং অবহেলা পদ্ধতি উভয়ই প্রার্থনা করা হবে। এর কারণ হ'ল অন-ছাড়িত পদ্ধতির ডিফল্ট প্রয়োগটি হ'ল অভ্যন্তরীণভাবে অবহেলা পদ্ধতিটি ডেকে আনা। শুধু একবার দেখুন WebViewClient.shouldOverrideUrlLoading(WebView view, WebResourceRequest request)। সুতরাং নিশ্চিত হন যে আপনি কল করবেন না super.shouldOverrideUrlLoading()
হেনরি

1
কেবল নির্দেশ করে যে উভয় পদ্ধতি কল করার কার্যকারিতা ডকুমেন্টেড নয়। ডকুমেন্টেশনে এটি উল্লেখ না হওয়ার কারণে আমি সর্বদা এটির ক্ষেত্রে নির্ভর করব না।
অস্টিন মাহনি

15

ব্যবহার

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}

2
এটি ভিউ.লোডআর্ল (অনুরোধ.getUrl ()। টুস্ট্রিং ());
হিবিবেম

এটির কাজ তবে আমরা যদি আবার ব্যবহার করি তবে এটি অ্যাপটি বন্ধ করে দেবে
এমআর রাজা

4
এটি 21 এর চেয়ে কম এপি সমর্থন করবে না
মুমায়ার

-1

নীচের মতো উভয় অবচিত ও অ-অবহেলিত পদ্ধতি প্রয়োগ করুন। প্রথমটি হ'ল API স্তর 21 এবং উচ্চতর হ্যান্ডেল করা হয়, দ্বিতীয়টি হ'ল API স্তর 21 এর চেয়ে কম হ্যান্ডেল

webViewClient = object : WebViewClient() {
.
.
        @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            parseUri(request?.url)
            return true
        }

        @SuppressWarnings("deprecation")
        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            parseUri(Uri.parse(url))
            return true
        }
}

1
এই হেনরি এর উত্তর একটি আংশিক কপি উপস্থিত হতে পারে, কিন্তু এই পরিত্যাগ মান দ্বারা ফিরে Uri.parseএবং parseUri। নতুন উত্তরগুলি বিষয়টিতে দরকারী নতুন তথ্য এবং নতুন অন্তর্দৃষ্টি যুক্ত করা উচিত।
অ্যাড্রিয়ান এইচএইচ এইচ

আমাকে সময় হারাতে
বসায়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.