ব্রডকাস্টআরসিভার.অন রিসিভ সর্বদা ইউআই থ্রেডে চালিত হয়?


117

আমার অ্যাপ্লিকেশনটিতে, আমি একটি কাস্টম তৈরি করেছি BroadcastReceiverএবং ম্যানুয়ালি এটি আমার প্রসঙ্গে নিবন্ধভুক্ত করছি Context.registerReceiver। আমার কাছে এমনও রয়েছে AsyncTaskযা নোটিফায়ার-ইন্টেন্টগুলির মাধ্যমে প্রেরণ করে Context.sendBroadcast। ইন্টেন্টগুলি একটি নন-ইউআই কর্মী থ্রেড থেকে প্রেরণ করা হয়, তবে মনে হয় BroadcastReceiver.onReceive(যেটি বলেছে ইন্টেন্টস) সর্বদা ইউআই থ্রেডে চালিত হয় (যা আমার পক্ষে ভাল)। এটি কি নিশ্চিত বা আমার কি তার উপর নির্ভর করা উচিত নয়?

উত্তর:


163

ব্রডকাস্টআরসিভার.অন রিসিভ সর্বদা ইউআই থ্রেডে চালিত হয়?

হ্যাঁ.


9
এই কোথাও নথিভুক্ত করা হয়?
হ্যানস স্ট্রু

15
@ হ্যান্স: সময়ের ৯৯.৪4%, যদি অ্যান্ড্রয়েড আপনার কোডটি কল করে, এটি মূল অ্যাপ্লিকেশন থ্রেডে রয়েছে। সকল জীবনচক্র পদ্ধতি (যেমন, onCreate(), onReceive()) প্রধান কর্মক্ষেত্র থ্রেডে বলা হয়। এবং, এটি নথিতে নথিতে লিখিত আছেonReceive() : goo.gl/8kPuH
CommonsWare

2
ঠিক আছে, আমি কেবল ডকস থেকে "সর্বদা" মূল থ্রেডের মধ্যে "ডাকা হয়" এর অর্থ ব্যাখ্যা করি এবং আশা করি জিনিসগুলি ভাঙ্গবে না ;-) ধন্যবাদ!
হ্যানস স্ট্রু

4
@ হান্নেস স্ট্রু: তারা কেন তাদের ভাষা "সাধারণভাবে" দিয়ে হেজ করে তা আমি জানি না। onReceive()মূল অ্যাপ্লিকেশন ("ইউআই") থ্রেড ব্যতীত অন্য কোনও থ্রেডে কল করা কোনও ক্ষেত্রেই আমি ভাবতে পারি না ।
CommonsWare

31
@ কমন্সওয়্যার: "মূল অ্যাপ্লিকেশন (" ইউআই ") থ্রেড ব্যতীত অন্য থ্রেডে অনারসিপ () কে ডাকা হয়েছে এমন কোনও ক্ষেত্রে আমি ভাবতে পারি না - কেসটি যদি ব্রডকাস্টারসিভারটি রেজিস্ট্রার রিসিভার (ব্রডকাস্টারসিভার, ইনটেন্টফিল্টার, স্ট্রিং, হ্যান্ডলার), হ্যান্ডলার যুক্তি নাল নয় এবং মূল অ্যাপ্লিকেশন থ্রেড ব্যতীত অন্য কোনও থ্রেডে তৈরি হ্যান্ডলারকে বোঝায়।
জুলিউস

76

যেহেতু আপনি গতিসম্পন্নভাবে রিসিভারটি নিবন্ধভুক্ত করছেন আপনি উল্লেখ করতে পারেন যে অন্য থ্রেড (ইউআই থ্রেড ব্যতীত) পরিচালনা করে onReceive()। এটি নিবন্ধভুক্তকারীর হ্যান্ডলার প্যারামিটারের মাধ্যমে করা হয় ()

এটি বলেছে, আপনি যদি অন্য কোনও হ্যান্ডলার নির্দিষ্ট না করেন তবে এটি সর্বদা ইউআই থ্রেডে পরিচালিত হবে।


হ্যাঁ. হ্যান্ডলার প্যারামিটারের মাধ্যমে এটিকে পরিবর্তন করার মতো আপনার দক্ষতার মতো মনে হচ্ছে তারা ডক্সে কেন তাদের ভাষা "হেজড" করে।
অ্যান্ড্রু ম্যাকেনজি

64

ব্রডকাস্টআরসিভার.অন রিসিভ সর্বদা ইউআই থ্রেডে চালিত হয়?

সাধারণত, আপনি কীভাবে এটি নিবন্ধভুক্ত করবেন এটি নির্ভর করে।

আপনি যদি এটি BroadcastReceiverব্যবহার করে নিবন্ধন করেন :

registerReceiver(BroadcastReceiver receiver, IntentFilter filter)

এটি মূল ক্রিয়াকলাপের থ্রেডে চলবে (ওরফে ইউআই থ্রেড)

আপনি যদি অন্য কোনও থ্রেডেBroadcastReceiver বৈধ Handler চলমান ব্যবহার করে নিবন্ধন করেন :

registerReceiver (BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)

এটি আপনার প্রসঙ্গে চলবে Handler

উদাহরণ স্বরূপ:

HandlerThread handlerThread = new HandlerThread("ht");
handlerThread.start();
Looper looper = handlerThread.getLooper();
Handler handler = new Handler(looper);
context.registerReceiver(receiver, filter, null, handler); // Will not run on main thread

বিশদ এখানে এবং এখানে


3
এই বিকল্পটি কিছুক্ষণ দেখার পরে অবশেষে আমি বুঝতে পারি যে লোকালড্রোডকাস্টম্যানেজার কোনও কাস্টম হ্যান্ডলার ব্যবহার করে সমর্থন করে না। সুতরাং আপনি যদি আপনার রিসিভারটি নিবন্ধ করার জন্য কোনও প্রসঙ্গের পরিবর্তে এলবিএম ব্যবহার করেন তবে এই পদ্ধতির প্রয়োগ হয় না। দুর্ভাগ্যক্রমে, সেক্ষেত্রে মনে হয় আমাদের একমাত্র বিকল্পটি ব্যাকগ্রাউন্ডে ফিরে আসার জন্য পরিষেবাটি ব্যবহার করা এবং এএনআরগুলি এড়ানো উচিত যা 10s এর নিষ্ক্রিয়তার পরে রিসিভারগুলি ট্রিগার করে।
gMale

9

পূর্বের উত্তরগুলি সঠিকভাবে বর্ণিত onReceiveথ্রেডে এটি চালিত হবে যা এটির সাথে নিবন্ধিত হয়েছে যদি সেই registerReceiver()হ্যান্ডলারের স্বাদ গ্রহণ করা হয় - অন্যথায় মূল থ্রেডে।

যদি রিসিভারটি নিবন্ধভুক্ত থাকে LocalBroadcastManagerএবং সম্প্রচারটি যদি হয় sendBroadcastSync- তবে এটি স্পষ্টতই যে থ্রেডে কল হয় সেখানে চলবেsendBroadcastSync.


আমি অংশটির সাথে একমত নই and the broadcast is via sendBroadcastSync। আমরা যখন LocalBroadcastManagerগ্রহীতার নিবন্ধন করতে ব্যবহার করি তখন অবশ্যই এটি ব্যবহার করা হোক sendBroadcastSyncবা না হোক মূল থ্রেড দ্বারা কল করা উচিত sendBroadcast। সুতরাং কীটি LocalBroadcastManagerনিবন্ধভুক্ত করার জন্য ব্যবহার করা হচ্ছে। আমি কি সঠিক?
কিডনি

@ কিডোহর: আপনি কি এখানে কোড লিঙ্কগুলি অনুসরণ করেছেন: stackoverflow.com/q/20820244/281545 ?
মিস্টার_আর_মিসি_ডি

0

হ্যাঁ Context.registerReceiver (ব্রডকাস্টআরসিভার রিসিভার, ইনটেন্টফিল্টার ফিল্টার, স্ট্রিং ব্রডকাস্টপিরমিশন, হ্যান্ডলার শিডিয়ুলার)

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