এন্ড্রয়েড আর্কিটেকচার কম্পোনেন্ট (ভিউ মডেল + লাইভ ডাটা ) এবং ভলি নিয়া প্যাঁচাল
Android Architecture Components । আমার নাম টা শুনলেই ডর লাগে, সত্যি । কি কঠিন একটা নাম, কি না জানি বানাইয়া রাখছে (আমি এখনো শিখতেছি তো , তাই )।
আগের করে আসা কোড সহজে বোঝার জন্যে আর কোডের রিইউজেবিলিটি বাড়ানোর জন্যে MVC প্যাটার্ন খুব ই জনপ্রিয়। এন্ড্রয়েড ও তেমন একটি প্যাটার্ন নিয়ে কাজ করছিল নাম MVP , কন্ট্রোলার এর জায়গায় ছিল প্রেজেন্টার। বেশকিছুদিন আগে গুগল ই আবার নিয়ে এলো আরেকটি প্যাটার্ন MVVM (মডেল, ভিউ ,ভিউ মডেল)। অনেক গুলো লাইব্রেরি নিয়ে এই আর্কিটেকচার কম্পোনেন্ট গঠিত। জিনিসই গুলো আসলে একোই জিনিস একটার উপর আরেকটা র্যাপার এই আরকি।
আজকে আমরা শুধু ২টা কম্পোনেন্ট ( ViewModel and Live Data) নিয়ে বেসিক টা জানব , কারণ আমিও মাত্র শুরু করছি শেখা ।
ViewModel:
এন্ড্রয়েড এ লাইফ সাইকেল লাইব্রেরির জন্ম হইসিলো মেমরি লিক আর কমন প্রব্লেম গুলো সহজে সলভ আর সারানোর জন্যে । ViewModel হল একটি লাইফ সাইকেল অবজেক্ট যেটা UI এর ডাটা ধরে রেখে আপনাকে উদ্ধার করবে যেকোন ধরনের কনফিগারেশন চেঞ্জ এর ফলে ডাটা হারিয়ে যাওয়া থেকে।
প্রবলেম এর ধরন
১। ধরুন আপনি একটি ফরম পুড়ন করছেন অথবা
২। আপনি ইউ আই কম্পোনেন্ট (Buttton/ TextView ) ইউজ করে কোন কাজ করছেন ,যেটাতে UI ডাটা change হচ্ছে অথবা
৩। আপনি UI তে কোন ডাটা রাখছেন একটিভিটি চালু হবার পর।
এখন যদি কোন কারণে আপনার ফোন রোটেড করা হয়, তখন এক্টিভিটি রোটেড হবার কারণে , Torn down/ destroy হয়ে নতুন ভাবে ক্রিয়েট হয় যার ফলে, আপনার একটিভিটি ইউ আই তে থাকা সকল ডাটা হারিয়ে যায় কালের গহ্বর থেকে ভয়ানক গহ্বর এ যেখান থেকে আর ফিরে আসে না। আর তাঁতেই হতে পারে এপ ক্র্যাশ এর মত ভয়ানক বেপার :(।
এই বেপার টা থেকে উদ্ধার পাওয়ার জন্যে আছে এই ViewModel ।
অনেক প্যাঁচাল পাড়া শেষ। এখন একটা ছোট্ট উদাহরণ দিয়ে আমরা কিছু জিনিস শিখে ফেলবো। কি কি শিখবো ?
ভিউ মডেল ব্যাবহার সাথে Volly আর Live Data বিলকুল ফ্রি ফ্রি।
অ্যাঁ? Live Data কি ? খায় না মাথায় দেয় ? এটা খায় ও না মাথায় ও দেয় না এটা লাগায়। মানে এটা কিছুটা ক্লোজ সার্কিট ক্যামেরার উইথ এল্রাম এর মত আর কি, যেটা কোড এর কোনায় লাগাইয়া রাখতে হয়। এখানে লাগানোটাও শিখানো হবে। বসেন বসেন, বসে যান।
Live Data: এটা একটা অবজারভার ক্লাস, যে কিনা আপনার ইউ আই তে দেখানো কোন ডাটা কোন লাইভ চেঞ্জ ঘটলে তা আপনাকে জানান দেবে, কিভাবে?? তা দেখবো সামনে । বাই দা ওয়ে , ইনিও এন্ড্রয়েড আর্কিটেকচার কম্পনেনেট ফ্যামিলির সদস্য।
পক্রিয়াঃ
প্রথমে এন্ড্রয়েড স্টুডিও তে একটা প্রজেক্ট খুলি , নাম দিতে পারি এমন “ViewModelSample” অথবা আপনার ইচ্ছেমত।
প্রোজেক্ট খোলা শেষ হলে মেনিফেস্ট ফাইলে ইন্টারনেট এর পারমিশন টা দিয়ে আসি। (আমার প্রত্যেকবার এপ রান করার পর মনে পরে হায়হায় পারমিশন তো এড করি নাই )।
এরপর চলে আসি গ্রেডেল ফাইল এ কিছু build.gradle(Module:app) ফাইলটি ওপেন করে তাতে নিচের লাইব্রেরি গুলো এড করে নেই।
এখানে লাইফ সাইকেল এর লাইব্রেরি এড করা হয়েছে ViewModel আর LiveData ব্যাবহার করার জন্যে।
আর Volly লাইব্রেরিটা হচ্ছে একটা নেটওয়ার্ক কলের লাইব্রেরি, এই এপ এ Volly ইউজ করে আমি একটা এপিআই থেকে ডাটা এনে সেটা ভিউ মডেল এবং লাইভ ডাটার সাহায্যে ইউয়াইতে শো করাবো আর আমাদের উপড়ে বর্ণিত প্রবলেমগুলো থেকে রেহাই পাব ইনশাআল্লাহ ।
Activity_main ফাইলে ৩ টি টেক্সটভিউ নিচ্ছি নিচের মত করে
এখন মেইন একটিভিটিতে TextView গুলো initialize করে নিব।
এখন একটি ক্লাস নেই যার নাম দেই SamleViewModel । এই ক্লাসটিকে এক্সটেন্ড করি AndroidViewModel দিয়ে। তখন একটি কন্সট্রাক্টর তৈরি হবে নিচের মত
আপাতত আমরা নেটওয়ার্ক কল এই ক্লাসেই করছি । এপিআই এর জন্যে আমি ইউজ করছি “https://ifconfig.co/json” এই এপিয়াইটি নিচের মত ডাটা প্রদান করবে আমাকে।
আমি এখান থেকে IP , Country এবং Lattitude ও Longitude নিয়ে সেটা আমাদের ৩ টি টেক্সটভিউতে শো করবো।
আমি একটি মডেল ক্লাস বানিয়ে নিচ্ছি যাতে করে আমার এপিআই থেকে ডাটা নিয়ে ব্যাবহার করতে সুবিধা হয়।
আমি মডেল ক্লাসটির নাম দিলাম IpInfoModel এখানে ৩ টি ভেরিয়েবল ডিক্লেয়ার করবো। সেগুলো হল , আইপি এর জন্যে ip, Country এর জন্যে CountryName, এবং Location (যেখানে Lattitude এবংLongitude এর ডাটা এক সাথে রাখব) এর জন্যে loc । আমি Getter Setter মেথড বানিয়ে নিলাম । ক্লাস টা নিচের মত হবে দেখতে।
এখন খুব ইম্পরট্যান্ট কয়েকটা কথা বলবো । আমি এখানে লাইভ ডাটা ব্যাবহার কেন করেছি ? এখানে API তে হিট করার পর আসা ডাটা গুলো ডাইরেক্ট একটিভিটিতে View/UI এর সাথে কমুনিকেট করছে না সেহেতু এক্টিভিটি ক্রিয়েট হয়ে ভিউ initialize হবার অনেক পরে এপিয়াই থেকে ডাটা আসতে পারে, এই ডাটা ViewModel এ তো চেঞ্জ হবে কিন্তু ইউয়াই তে চেঞ্জ করবে কে ? উত্তর লাইভ ডাটা ।
তো আমি এখন ViewModel ক্লাস এ একটি লাইভডাটা ডিক্লেয়ার করবো যে কিনা এপিয়াইতে কল করে যে ডাটা পাবে তা ভিউমডেল এর কাছে হস্তান্তর করে দেয়।
কিছুটা নিচের মত
এখানে ipConfig লাইভডাটা ভেরিয়েবলটি IpInfoModel ক্লাস টাইপ, মানে হল এই ভেরিয়েবল টি IpInfoModel ক্লাসে ডিক্লেয়ার করা CountryName , ip, loc এই তিনটিই ভ্যালু নিজের কাছে রাখতে পারবে।
উপড়ে আরেকটি মেথড ডিক্লেয়ার করা হছে , সেটা হল getIpConfig() । এই মেথডটি লাগবে যখন আমরা আমাদের এপটি চালু হবে এবং এক্টিভিটিটি ক্রিয়েট হয়ে ভিউমডেল এর কাছে ডাটা নেবে।
এই মেথডটি কলের সাথে সাথেই এপিয়াই তে হিট করে ডাটা এনে LIveData তে স্টোর করে ফেলতে পারে, যাতে করে সহজেই ইউয়াই এর দরকার সময় ViewModel এর সাহায্যে UI তে শো করতে পারে।
তো getIpInfo() নামে একটি মেথড কল করে ফেলি getIpConfig() মেথড এর ভিতরে নিচের মত করে,

getIpInfo() মেথডটি কেমন হবে? এই মেথড এই আমরা আমাদের Volly র কাজটি সেরে নেব নিচের মত করে


ভলি কিভাবে কাজ করে সেটা নিয়ে অনেক সুন্দর সুন্দর লেখা রয়েছে, আপাতত আমি এব্যাপারে কিছু বলছি না। এখানে দেখা যাচ্ছে রেসপন্স এ JSON ডিকোড করে আমি শুধু Country , Ip এবং Location(Lat,lng) এর ডাটা নিয়েছি সেগুলো কে infoModel ভেরিয়েবল ইউজ করে আমার মডেল ক্লাস এ সেট করেছি তারপর এই ডাটা সম্রিধ্য infoModel ভেরিয়েবল্টিকে আমাদের LiveData ভেরিয়েবল ipConfig এ সেট করেছি ।
এখানে এপর্যন্তই । বাকি খেলা হবে এক্টিভিটি ক্লাস এ , যেখানে আমরা TextView গুলো ডিক্লেয়ার করে এসেছিল্যাম।
এখন MainActivity ক্লাস এ আমরা SampleViewModel ক্লাস এর একটি অবজেক্ট ক্রিয়েট করবো নিচের মত ।
এখন প্রথমে ক্রিয়েট করা অবজেক্টই টি একটিভিটির onCreate এ ডিক্লেয়ার করবো নিচের মত করে
এরপর আমরা একটা Observer ক্লাস নিব এক্টিভিটিতেই। ক্লাসটি হবে নিচের মত ,
ক্লাসটার কাজ হবে ViewModel এ ডাটা চেঞ্জ ধরার । LiveData র চেঞ্জ ঘটলেই ক্লাসটি আমাদের সেই চেঞ্জ হওয়া ডাটা টি রিটার্ন করবে । উপরে দেখা যাচ্ছে সেখান থেকেই আমরা টেক্সটভিউতে ডাটা গুলো শো করছি।
এখন ক্লাসটিকে ভিউমডেল এর যে অবজেক্টই ডিক্লেয়ার করা ছিল তার মাধ্যমে OnCreat এ কল করতে হবে নিচের মত ,
যাতে করে, একটিভিটি ক্রিয়েট হবার পর থেকেই সে অবসারভ শুরু করে দেয়।
ওকে, ডান এখন এপ টি রান করাবো। সব কিছু ঠিকঠাক মত হলে ইনশাআল্লাহ কনফিগারেশন চেঞ্জ সারভাইভ করতে পারবে আমাদের এপটি।
এই লেখাটি আমার নিজের শেখার ডকুমেন্ট হিসেবে তৈরি করা , কোন কিছু ভুল হলে অবশ্যই নক দিয়ে জানিয়ে বাধিত করবেন। ইনশাআল্লাহ এন্ড্রয়েড আর্কিটেকচার কম্পোনেন্ট নিয়ে আরো বিস্তর ভাবে শিখে এসে পরের লেখাটি লিখে ফেলবো।
আমার গিট রিপো তে পুরো কোড একসাথে পাবেন