কোডের একটি নির্দিষ্ট টুকরোটি থ্রেডটি মূল (ইউআই) থ্রেড কিনা তা আমাকে পরীক্ষা করে দেখতে হবে। আমি কীভাবে এটি অর্জন করতে পারি?
কোডের একটি নির্দিষ্ট টুকরোটি থ্রেডটি মূল (ইউআই) থ্রেড কিনা তা আমাকে পরীক্ষা করে দেখতে হবে। আমি কীভাবে এটি অর্জন করতে পারি?
উত্তর:
Looper.myLooper() == Looper.getMainLooper()
যদি এটি সত্য হয়, তবে আপনি ইউআই থ্রেডে আছেন!
আপনি বর্তমান থ্রেডটি ইউআই / মেইন থ্রেড কিনা তা জানতে নীচের কোডটি ব্যবহার করতে পারেন
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
অথবা আপনি এটি ব্যবহার করতে পারেন
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
থ্রেড কোনও লুপারের সাথে সম্পর্কিত না হলে নালায় ফিরে আসবে। সুতরাং উভয়ই সুরক্ষিত এবং একই ফলাফল রয়েছে তবে লুপার এবং এর সাথে সম্পর্কিত থ্রেডটি অনুসন্ধান করতে এবং অন্য কিছু স্টাফ করার জন্য মানচিত্রের ভিতরে অনুসন্ধান করার সময় প্রথমটি কিছুটা ধীর হয়।
সবচেয়ে ভাল উপায় হ'ল পরিষ্কার, সবচেয়ে শক্তিশালী উপায়: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
বা, যদি রানটাইম প্ল্যাটফর্মটি API এর স্তরের 23 (মার্শমেলো 6.0) বা উচ্চতর হয়:
Looper.getMainLooper().isCurrentThread()
দেখুন Looper এপিআই । দ্রষ্টব্য যে কলিংয়ের Looper.getMainLooper()
সাথে সিঙ্ক্রোনাইজেশন জড়িত ( উত্স দেখুন )। আপনি রিটার্ন মানটি সংরক্ষণ করে এবং এটি পুনরায় ব্যবহার করে ওভারহেড এড়াতে চাইতে পারেন।
* ক্রেডিট গ্রেগ 7gkb এবং 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
, যা আমি কম পরিষ্কার বলে মনে করি। আমি গ্রেগ 7gkb ক্রেডিট করি।
equals
এবং তাই আবার পড়েও ==
তবে ভবিষ্যতে এটি পরিবর্তন হতে পারে। তাই আমি উত্তরটি সংশোধন করেছি।
সমাধানগুলির সংক্ষিপ্তসার হিসাবে, আমি মনে করি এটিই সেরা:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
এবং, আপনি যদি ইউআই থ্রেডটিতে কিছু চালাতে চান তবে আপনি এটি ব্যবহার করতে পারেন:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
আপনি চেক করতে পারেন
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
আমাকে এটির উপস্থাপনের অনুমতি দিন: আমি স্বীকার করেছি যে এই পোস্টটির 'অ্যান্ড্রয়েড' ট্যাগ রয়েছে, তবে, আমার অনুসন্ধানের 'অ্যান্ড্রয়েড' এর সাথে কোনও সম্পর্ক ছিল না এবং এটি আমার শীর্ষ ফলাফল। এ লক্ষ্যে, অ-অ্যান্ড্রয়েড এসও জাভা ব্যবহারকারীদের এখানে অবতরণ করার জন্য, ভুলে যাবেন না:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
এটি সেট করার পরে, আপনার কোডের অন্য কোথাও আপনি সহজেই যাচাই করতে পারবেন আপনি মূল থ্রেডের সাথে এটি সম্পাদন করতে চলেছেন:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
কিছুটা বিব্রত হয়ে আমি এটি মনে রাখার আগে অনুসন্ধান করেছি, তবে আশা করি এটি অন্য কাউকে সাহায্য করবে!
আপনি এটিকে অ্যান্ড্রয়েড ডিডিএমএস লগকটে যাচাই করতে পারেন যেখানে প্রক্রিয়া আইডি একই হবে তবে থ্রেড আইডি আলাদা হবে।
Xamarin.Android
বন্দর: ( C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
ব্যবহার:
if (IsMainThread) {
// you are on UI/Main thread
}
আপনি থ্রেড.কন্ট্রেনথ্রেড () চেষ্টা করতে পারেন .ডেমোন ()