জিইউআই কাঠামোর প্রসঙ্গে লুপারটি কী তা আপনি আরও ভাল করে বুঝতে পারবেন। লুপার 2 টি জিনিস করা হয়।
1) লুপার একটি সাধারণ থ্রেডকে রূপান্তরিত করে , যা তার রান () পদ্ধতিটি ফিরে আসার পরে শেষ হয়, অ্যান্ড্রয়েড অ্যাপ চলমান অবধি অবিচ্ছিন্নভাবে কিছুতে চালিত হয় যা জিইউআই ফ্রেমওয়ার্কে প্রয়োজন হয় (প্রযুক্তিগতভাবে, রান () পদ্ধতিটি ফিরানোর সময় এটি এখনও বন্ধ হয়ে যায় me তবে আমাকে ছেড়ে দিন নীচে আমি কী বোঝাতে চাই তা স্পষ্ট করুন)।
২) লুপার একটি সারি সরবরাহ করে যেখানে কাজগুলি করা হবে এবং জিইউআই কাঠামোর ক্ষেত্রেও এটি প্রয়োজনীয়।
আপনি যেমন জানেন যে কোনও অ্যাপ্লিকেশন চালু হওয়ার পরে, সিস্টেমটি "মেন" নামে পরিচিত অ্যাপ্লিকেশনটির জন্য কার্যকরকরণের একটি থ্রেড তৈরি করে এবং অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি সাধারণত একটি মূল থ্রেডে ডিফল্টভাবে "মূল থ্রেড" তে পুরোপুরি সঞ্চালিত হয়। তবে মূল থ্রেড কিছু গোপন নয়, বিশেষ থ্রেড । এটি new Thread()
কোডের সাথে তৈরি থ্রেডগুলির মতো কেবলমাত্র একটি সাধারণ থ্রেড , যার অর্থ এটি যখন এর রান () পদ্ধতিটি ফিরে আসে তখন শেষ হয়! নীচের উদাহরণ সম্পর্কে চিন্তা করুন।
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
এখন, Android অ্যাপগুলিতে এই সাধারণ নীতিটি প্রয়োগ করি। কোনও অ্যান্ড্রয়েড অ্যাপ স্বাভাবিক থ্রেডে চললে কী হবে? "মেইন" বা "ইউআই" নামে পরিচিত একটি থ্রেড বা যা কিছু আপনার অ্যাপ্লিকেশন শুরু করে এবং সমস্ত ইউআই আঁকেন। সুতরাং, প্রথম পর্দা ব্যবহারকারীদের প্রদর্শিত হয়। এখন কি? মূল থ্রেড কি শেষ? না, এটা করা উচিত নয়। এটি ব্যবহারকারীদের কিছু না করা পর্যন্ত অপেক্ষা করা উচিত, তাই না? তবে কীভাবে আমরা এই আচরণ অর্জন করতে পারি? ঠিক আছে, আমরা চেষ্টা করতে পারি Object.wait()
বা এর সাথেThread.sleep()
। উদাহরণস্বরূপ, প্রধান থ্রেডটি প্রথম স্ক্রিন প্রদর্শন করার জন্য প্রাথমিক কাজটি শেষ করে এবং ঘুমায়। এটি জাগ্রত হয়, যার অর্থ বাধাগ্রস্ত হয়, যখন করার একটি নতুন কাজ এনে দেওয়া হয়। এখন পর্যন্ত এত ভাল, তবে এই মুহুর্তে আমাদের একাধিক কাজ ধরে রাখতে একটি সারির মতো ডেটা কাঠামো দরকার। কোনও ব্যবহারকারী যখন সিরিয়ালি পর্দা স্পর্শ করে তখন কোনও কেস সম্পর্কে চিন্তা করুন এবং কোনও কাজ শেষ হতে আরও বেশি সময় নেয়। সুতরাং, ফার্স্ট-ইন-ফার্স্ট-আউট পদ্ধতিতে কাজগুলি ধরে রাখতে আমাদের একটি ডেটা কাঠামো থাকা দরকার। এছাড়াও, আপনি কল্পনাও করতে পারেন, আন্তঃ-বিঘ্নিত ব্যবহার করে সর্বদা চলমান ও প্রক্রিয়া-কাজ-কখন-আগত থ্রেড কার্যকর করা সহজ নয় এবং জটিল এবং প্রায়শই অবিশ্বাস্য কোডের দিকে নিয়ে যায়। আমরা বরং এই জাতীয় উদ্দেশ্যে একটি নতুন প্রক্রিয়া তৈরি করতে চাই এবং এটিই লুপার সম্পর্কে । Looper বর্গ অফিসিয়াল ডকুমেন্টবলে, "ডিফল্টভাবে থ্রেডগুলির সাথে একটি বার্তা লুপ থাকে না" এবং লুপার একটি ক্লাস "থ্রেডের জন্য বার্তা লুপ চালানোর জন্য ব্যবহৃত হয়"। এর অর্থ কী তা আপনি বুঝতে পারবেন।
জিনিসগুলিকে আরও পরিষ্কার করার জন্য, আসল কোডটি যেখানে মূল থ্রেডটি রূপান্তরিত হয়েছে তা পরীক্ষা করে দেখি। এটি অ্যাক্টিভিটি ট্র্যাড শ্রেণিতে ঘটে । এর প্রধান () পদ্ধতিতে আপনি নীচের কোডটি খুঁজে পেতে পারেন যা একটি সাধারণ মূল থ্রেডকে আমাদের যা প্রয়োজন তা রূপায়িত করে।
public final class ActivityThread {
...
public static void main(String[] args) {
...
Looper.prepareMainLooper();
Looper.loop();
...
}
}
এবং Looper.loop()
পদ্ধতিটি অসীমভাবে লুপ করে এবং একটি বার্তা প্রেরণ করে এবং একবারে একটি প্রক্রিয়া করে:
public static void loop() {
...
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
...
msg.target.dispatchMessage(msg);
...
}
}
সুতরাং, মূলত লুপার একটি শ্রেণি যা জিইউআই কাঠামোর মধ্যে ঘটে এমন একটি সমস্যা সমাধানের জন্য তৈরি। তবে এই ধরণের চাহিদা অন্যান্য পরিস্থিতিতেও ঘটতে পারে। প্রকৃতপক্ষে এটি মাল্টি থ্রেড অ্যাপ্লিকেশনগুলির জন্য একটি সুন্দর বিখ্যাত প্যাটার্ন এবং আপনি ডগ লি দ্বারা " জাভাতে সমবর্তী প্রোগ্রামিং " এ এটি সম্পর্কে আরও শিখতে পারেন (বিশেষত, ৪.১.৪ অধ্যায়ের "কর্মী থ্রেডস সহায়ক হবে)। এছাড়াও, আপনি কল্পনা করতে পারেন এই ধরণের প্রক্রিয়াটি অ্যান্ড্রয়েড কাঠামোর ক্ষেত্রে অনন্য নয়, তবে সমস্ত জিইউআই কাঠামোর সাথে এর কিছুটা মিল প্রয়োজন হতে পারে। আপনি জাভা সুইং ফ্রেমওয়ার্কে প্রায় একই পদ্ধতি আবিষ্কার করতে পারেন।