অ্যাসিঙ্কটাস্ক বনাম আরএক্স - একটি ছোট ব্যবহারের ক্ষেত্রে

সম্প্রতি আমি একটি টাস্কে কাজ করছিলাম যেখানে আমার 12 ক্রিয়াকলাপ অনুরোধগুলি একটি ক্রমিক পদ্ধতিতে সিঙ্ক্রোনাইজ করা দরকার। বিশ্রামের JSON এপিআই অনুরোধ, একের পর এক।

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

একটি নমনীয় এপিআই, এটি আপনাকে অনুরোধের সাথে একই সময়ে একাধিক বিকল্পের প্রাপ্যতা সম্পর্কে জিজ্ঞাসা করার অনুমতি দেয়। আমার 12 টি বিকল্প ছিল যার মধ্যে আমি আগ্রহী ছিলাম, এক্সপোজার সেটিংস এবং অ্যাপারচার, এবং এর মতো বিকল্পগুলি।

একমাত্র সমস্যা ছিল, যদি কোনও বিকল্প না পাওয়া যায় তবে ক্যামেরার এপিআই 404 প্রতিক্রিয়া হিসাবে প্রত্যাবর্তন করেছে। এবং, এমনকি যখন আমি একাধিক অনুরোধ! সুতরাং যদি 12 টির মধ্যে কেবল একটি বিকল্প অনুপস্থিত থাকে তবে আপনি একটি 404 পেয়ে যাবেন এবং অন্য 11 সম্পর্কে কিছুই জানেন না Well 11 এটি নিরর্থক, আমাকে একবারে একটি করে প্রতিটি বিকল্পের জন্য অনুরোধ করতে হবে।

আমি সেই সমস্ত অপশন নিয়ে যাচ্ছিলাম এবং কোনও স্পিনার দিয়ে তাদের সেটিংস বাছাই করার জন্য তাদের একটি পুনর্ব্যবহারযোগ্য ভিউতে রেখেছিলাম।

আমি যে অ্যাপগুলিতে কাজ করেছি সেগুলিতে আমি আরএক্স এর আগে বিশেষত আরএক্সজেভা 2 ব্যবহার করেছি। তবে আমার এখনও পর্যন্ত এন্টারপ্রাইজ ডেস্ক কাজের সহযোগিতা করার সুযোগ ছিল না।

আমি খুঁজে পেয়েছি এমন একটি এন্টারপ্রাইজ কোড বেসে লাইব্রেরিগুলি আনতে শুরু করা বা ফ্রি-লেন্স পরিস্থিতিগুলির চেয়ে চ্যালেঞ্জ হতে পারে। এটি নয় যে গ্রন্থাগারগুলি দুর্দান্ত নয় বা সমস্যা সৃষ্টি করে। সিদ্ধান্তের সাথে জড়িত প্রচুর লোক এবং কোডিংয়ের বিভিন্ন উপায়ে বিক্রি করার ক্ষেত্রে আপনার ভাল হওয়া দরকার।

আমি এখনও আইডিয়া বিক্রয় সেরা না, কিন্তু আমি উন্নত করার চেষ্টা করছি!

ভাল এখানে আমার পরিস্থিতির সঠিক উদাহরণ রয়েছে যেখানে আরএক্স থাকা 12 টি অনুরোধগুলি করা আমার পক্ষে আরও সহজ এবং আরও বজায় রাখতে সক্ষম করবে।

দীর্ঘদিন ধরে এই অ্যাপটিতে যেমন হয়েছে তেমনি আমরা সাধারণত আমাদের ব্যাকগ্রাউন্ড কাজের জন্য অ্যাসিঙ্কটাস্ক ব্যবহার করি। উত্তরাধিকার একটি জীবনকাল রয়েছে, একবার আপনি কোনও প্রযুক্তির বিষয়ে সিদ্ধান্ত নিলে এটি সেই অ্যাপটিকে কিছু সময়ের জন্য অনুসরণ করবে। এই সিদ্ধান্তগুলি হালকাভাবে করা না যাওয়ার আরেকটি কারণ।

আমি, আমি নতুন জিনিস চেষ্টা এবং প্রান্ত কাটা পছন্দ পছন্দ করি।

এর চেয়েও ভাল আমাকে কী এমন জায়গায় পৌঁছেছিল যেখানে আমি আসলে তুলনা করতে পারি এবং আরএক্স এবং অ্যাসিঙ্কটাসকের উদাহরণ, এটি ছিল যে আমরা যে তৃতীয় পক্ষের লাইব্রেরিটি ব্যবহার করছিলাম সেটি আরএক্সজাভা সংস্করণ 1 এর উপর নির্ভরশীলতা ছিল।

কম এবং দেখুন এই সমস্ত সময়, এটি ব্যবহারের জন্য অপেক্ষা করে আমাদের কোড বেসে বসে ছিল।

সুতরাং, আমি এবং আমার সহকর্মীদের অনুমোদনের সাথে আরএক্স এবং অ্যাসিঙ্কটাস্ক ব্যবহারের মধ্যে এই একটি কাজের জন্য পার্থক্যটি পরীক্ষা করার জন্য বেঞ্চমার্কটি করার চেষ্টা করেছি।

সময় বের করে একেবারে নগণ্য! আশা করা যায় যে এটি এমন কোনও পৌরাণিক কাহিনী দূর করে যা ছোট পটভূমির কাজগুলির জন্য, অ্যাসিঙ্কটাস্কটি ধীরে ধীরে। আমি একাধিক উত্স থেকে এটি নিয়মিত বলছি। আমি আরও বিস্মিত হই যে আমি আরও বড় পরীক্ষা করে নিলে কী খুঁজে পাব what

আমি একটি ছোট নমুনা সেট। উভয় সমাধানের সাথে আমার ক্রিয়াকলাপটি 6 বার চালানো এবং এটি আমি পেয়েছি:

হয়েছে RX:
11–17 08: 59: 00.086 12 আরএক্স অনুরোধগুলি বিকল্পগুলির জন্য শেষ হয়েছে: 3863ms
11–17 08: 59: 20.018 12 আরএক্স অনুরোধগুলি বিকল্পগুলির জন্য শেষ হয়েছে: 3816 মিমি
11–17 08: 59: 39.143 12 আরএক্স অনুরোধ বিকল্পগুলির জন্য সমাপ্ত: 3628ms
11–17 08: 59: 57.367 12 আরএক্স অনুরোধগুলি বিকল্পগুলির জন্য শেষ হয়েছে: 3561ms
11–17 09: 00: 15.758 12 আরএক্স অনুরোধগুলি বিকল্পগুলির জন্য শেষ হয়েছে: 3713ms
11–17 09: 00: 39.129 12 আরএক্স অনুরোধ বিকল্পগুলির জন্য সমাপ্ত: 3612ms

আমার আরএক্স সমাধানের জন্য গড় রানটাইম 3698.83ms।

ATAsync:
11–17 08: 54: 49.277 12 বিকল্পগুলির জন্য অনুরোধগুলি শেষ হয়েছে: 4085ms
11–17 08: 55: 37.718 12 বিকল্পগুলির জন্য অনুরোধগুলি শেষ হয়েছে: 3980 মিমি
11–17 08: 55: 59.819 12 বিকল্পগুলির জন্য অনুরোধগুলি শেষ হয়েছে: 3925 মিমি
11–17 08: 56: 20.861 12 বিকল্পগুলির জন্য অনুরোধগুলি শেষ হয়েছে: 3736ms
11–17 08: 56: 41.438 12 বিকল্পগুলির জন্য অনুরোধ সমাপ্ত: 3549ms
11–17 08: 57: 01.110 12 বিকল্পগুলির জন্য অনুরোধগুলি শেষ হয়েছে: 3833ms

আমার AsyncTask সমাধানের জন্য গড় রানটাইম 3851.33ms।

আরএক্স ব্যবহার করা আমার মতে রানটাইমের সাথে সামান্যই পার্থক্য করে। সত্যিই রানটাইমটি কী ঘটে তা হ'ল সেই ব্যাকগ্রাউন্ড টাস্কটির অভ্যন্তরীণ ক্রিয়া যা আপনি গণনা করার চেষ্টা করছেন।

আরএক্স আপনাকে যা দেয় তা রক্ষণাবেক্ষণযোগ্য। আপনার কোডটি আপ টু ডেট রাখা অনেক সহজ, ত্রুটিযুক্ত প্রবণ। আপনি যে সমাধানটি চালাচ্ছেন একইভাবে আপনি তার সমাধানটি যৌক্তিকভাবে লিখতে পারেন cold শীতকালে ঝাঁপিয়ে পড়ার সাথে যুক্তিযুক্তভাবে কোডটি আঁকতে এটি একটি বিশাল বোনাস।

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

আমার অ্যাসিঙ্কটাস্ক সংস্করণটি কাজ করার জন্য আমার আরও অতিরিক্ত কাজ করা দরকার। সংবেদনশীল কোনও সংস্থা যাতে না দেখায় আমি কোডটি অবহেলা করেছি। এটি আমার আসল কোডের একটি উপহাস।

অ্যাসিঙ্কটাস্ক সংস্করণ:

পাবলিক ক্লাস অপশনস ক্যামেরাআরভেস্টার আইওশনরোপোজিটরি প্রয়োগ করে {
    ATAsyncTask কারেন্ট টাস্ক;
    বুলিয়ান isCanceled;
    চূড়ান্ত এইচটিপিপি সংযোগকারী;
    ব্যক্তিগত দীর্ঘ স্টার্টটাইম;
    সর্বজনীন অপশনকামেরাআরেস্টার (স্ট্রিং আইপিএড্রেস) {
        this.connector = new HttpConnector (ipAddress);
    }
    পাবলিক অকার্যকর বাতিল () {
        isCanceled = সত্য;
        যদি (কারেন্ট টাস্ক! = নাল) {
            currentTask.cancel (সত্য);
            কারেন্টটাস্ক = নাল;
        }
    }
    পাবলিক অকার্যকর getOptions (কলব্যাক কলব্যাক) {
        যদি (isCanceled) ফিরে আসে;
        স্টার্টটাইম = সিস্টেম.কন্ট্রেন্টটাইমমিলিস ();
        লগ.আই (মাইলগ। TAG, "বিকল্পগুলির জন্য অনুরোধগুলি শুরু হয়েছে");
        আইট্রেটার <ক্যামেরা অপশন> পুনরাবৃত্তকারী =
            CameraOption.getAllPossibleOptions () পুনরুক্তিকারীর ()।
        অনুরোধ অপশন (পুনরুক্তিকারী, কলব্যাক);
    }
    শূন্য রিকোয়েস্ট অপশন (চূড়ান্ত আইট্রেটার <ক্যামেরা অপশন> পুনরুক্তি,
                       চূড়ান্ত কলব্যাক কলব্যাক) {
        যদি (! পুনরুত্পাদনকারী .হাসনেক্সট ()) {
            চূড়ান্ত দীর্ঘ সময় = সিস্টেম.কালিনটাইমমিলিস ();
            লগ.আই (মাইলগ। TAG, "বিকল্পগুলির জন্য অনুরোধগুলি শেষ হয়েছে:" +
                    (সিস্টেম.কন্ট্রেন্টটাইমমিলিস () - স্টার্টটাইম) +
                    "মাইক্রোসফট");
            আসতে;
        }
        চূড়ান্ত ক্যামেরাঅપ્শন বিকল্প = পুনরুদ্ধারকারী next ();
        চূড়ান্ত অ্যাসিঙ্কটাস্ক <শূন্য, শূন্য, ক্যামেরাঅপশন> টাস্ক =
                নতুন অ্যাসিঙ্কটাস্ক <শূন্য, শূন্য, ক্যামেরাঅপশন> () {
                    ক্যামেরাঅপশন ডোইনব্যাকগ্রাউন্ড (ভি ..) {
                        JSONObject ফলাফল =
                            connector.getOption (option.getName ());
                        যদি (ফলাফল == নাল) {
                            প্রত্যাবর্তন নাল;
                        } অন্য {
                            // জেএসএনওবজেক্ট দিয়ে কিছু কাজ করুন
                        }
                        রিটার্ন বিকল্প;
                    }
                    পোস্টঅ্যাক্সেকুট অকার্যকর (ক্যামেরাঅপশন বিকল্প) {
                        অপশনসেমেরাআরেক্সার.থিস.কোন্টারটাস্ক =
                            শূন্য;
                        যদি (বিকল্প! = নাল) {
                            callback.onOptionAvailable (বিকল্প);
                        }
                        যদি (! isCanceled) {
                            অনুরোধ অপশন (পুনরুক্তিকারী, কলব্যাক);
                        }
                    }
                };
        task.execute ();
        কারেন্টটাস্ক = কার্য;
    }
}

আরএক্স সংস্করণ:

পাবলিক ক্লাস অপশনস ক্যামেরাআরভেস্টার আইওশনরোপোজিটরি প্রয়োগ করে {
    চূড়ান্ত এইচটিপিপি সংযোগকারী;
    সাবস্ক্রিপশন getOptionsSubscription;
    সর্বজনীন অপশনকামেরাআরেস্টার (স্ট্রিং আইপিএড্রেস) {
        this.connector = new HttpConnector (ipAddress);
    }
    পাবলিক অকার্যকর বাতিল () {
        যদি (getOptionsSubscript! = নাল) {
            getOptionsSubscription.unsubscribe ();
            getOptionsSubscription = নাল;
        }
    }
    // আমি কলব্যাকটি ব্যবহার করি যাতে আমি একই সিস্টেমে মেনে চলতে পারি
    // ইন্টারফেস এবং আরএক্স কোডটি কেবল এতে অন্তর্ভুক্ত রাখুন
    // ক্লাস।

    পাবলিক অকার্যকর getOptions (চূড়ান্ত কলব্যাক কলব্যাক) {
        চূড়ান্ত দীর্ঘ সময় = সিস্টেম.কালিনটাইমমিলিস ();
        লগ.আই (মাইলগ। TAG, "বিকল্পগুলির জন্য আরএক্স অনুরোধগুলি শুরু হয়েছে");
        getOptionsSubscription =
        Observable.from (CameraOption.getAllPossibleOptions ())
            // ক্যামেরা থেকে প্রতিটি বিকল্পের জন্য অনুরোধ
            .map (নতুন ফানক 1 <ক্যামেরাঅપ્শন, ক্যামেরাঅপশন> () {
                    
                সর্বজনীন ক্যামেরাঅপশন কল (ক্যামেরাঅપ્শন বিকল্প) {
                    JSONObject অবজেক্ট = =
                        connector.getOption (option.getName ());
                    যদি (অবজেক্ট == নাল) {
                        cameraOption.setAvailable (মিথ্যা);
                    } অন্য {
                        // ডিএস অপশন থেকে জেএসএনওবজেক্টের সাথে কাজ করুন
                    }
                    রিটার্ন ক্যামেরাঅপশন;
               }
            })
            // সমর্থিত নয় এমন বিকল্পগুলি ফিল্টার করুন
            ফিল্টার (নতুন ফানক 1 <ক্যামেরাঅপশন, বুলিয়ান> () {
                    
                পাবলিক বুলিয়ান কল (ক্যামেরাঅপশন ক্যামেরা অপশন) {
                    রিটার্ন ক্যামেরাঅপশন.আইএসএভায়বল ();
                }
            })
            // ঘোষিত থ্রেডের কাজ শেষ এবং প্রাপ্ত হয়েছে
            .observeOn (AndroidSchedulers.mainThread ())
            .subscribeOn (Schedulers.newThread ())
            // প্রতিটি বিকল্প প্রস্তুত হিসাবে এটি পাস করুন
            । সাবস্ক্রাইব (নতুন গ্রাহক <ক্যামেরা অপশন> () {
         
                সর্বজনীন শূন্য অনকম্পটেড () {
                   getOptionsSubscription = নাল;
                   লগ.আই (মাইলগ। TAG, "আরএক্স অনুরোধগুলি শেষ হয়েছে:" +
                        (সিস্টেম.কালিয়রটাইমমিলিস () - সময়) + "এমএস");
                }
                সর্বজনীন শূন্য অন এয়ার (থ্রোয়েবল ই) {
                   MyLog.eLogErrorAndReport (MyLog.TAG, e);
                   callback.onError ();
                }
                সর্বজনীন শূন্য অনেক্সট (ক্যামেরাঅপশন ক্যামেরাঅপশন) {
                    callback.onOptionAvailable (cameraOption);
                }
           });
    }
}

আরএক্স কোডটি আরও দীর্ঘ দেখায় না তবে পুনরুক্তি ব্যবস্থাপনার উপর আর নির্ভরতা নেই। থ্রেডগুলি স্যুইচ করছে এমন একটি পুনরাবৃত্ত ফাংশন কলটি ভেঙে নেই। কার্যগুলি বাতিল হয়ে গেছে তা ট্র্যাক করার জন্য কোনও বুলিয়ান মান নেই। এটি কার্যকর করা হয় ক্রমে সমস্ত কিছুই লেখা হয়।