অ্যান্ড্রয়েডে ইউআই থ্রেড কীভাবে সনাক্ত করবেন?


117

Thread.currentThread()কোনও অ্যাপ্লিকেশনটিতে অ্যান্ড্রয়েড সিস্টেম ইউআই থ্রেড রয়েছে কিনা তা সনাক্ত করার শক্তিশালী উপায় আছে ?
আমি আমার মডেল কোডটিতে এমন কিছু যুক্তি যুক্ত করতে চাই যা দৃ that ়ভাবে জানায় যে কোনও ধরণের সিঙ্ক্রোনাইজেশন প্রয়োজনীয় নয় তা নিশ্চিত করার জন্য শুধুমাত্র একটি থ্রেড ( যেমন ইউআই থ্রেড) আমার রাজ্যে অ্যাক্সেস করে।


উত্তর:


199

ইউআই থ্রেডের পরিচয় নির্ধারণের জন্য সাধারণ অনুশীলনটি লুপার # গেটমেইনলুপারের মাধ্যমে :

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

এপিআই স্তর 23 এবং ততোধিক থেকে, নতুন সহায়ক সহায়ক পদ্ধতিটি ব্যবহার করে কিছুটা বেশি পঠনযোগ্য পদ্ধতির প্রধান লুপটিতে কর্নট্রথ :

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}


44

আমি মনে করি যে সর্বোত্তম উপায় এটি:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }

দুর্দান্ত কাজ করে। ধন্যবাদ!
হংকং

3
ব্যবহারের দরকার নেই equalsযেহেতু আমরা কেবল রেফারেন্সগুলির তুলনা করছি এবং তার উপরে, তারা উভয়ই স্থির।
এমআর 5

8

এপিআই স্তরের 23 হিসাবে Looperএকটি দুর্দান্ত সহায়ক পদ্ধতি রয়েছে isCurrentThread। আপনি এটি পেতে mainLooperএবং দেখতে পাবেন যে এটি বর্তমান থ্রেডের জন্য এটিই এক:

Looper.getMainLooper().isCurrentThread()

এটি কার্যত একই:

Looper.getMainLooper().getThread() == Thread.currentThread()

তবে এটি মনে রাখা আরও কিছুটা পাঠযোগ্য এবং সহজ হতে পারে।



2

চেক এছাড়া looper , আপনি যদি কখনও করার চেষ্টা লগ-আউট থ্রেড আইডি onCreate(), আপনি খুঁজে পাইনি UI 'তে থ্রেড (মূল থ্রেড) আইডি সবসময় 1. অতএব সাথে অন্যান্যকে সমতুল্য স্থির

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}

আমি এমন কোনও অফিসিয়াল ডকুমেন্টেশন খুঁজে পাই না যা প্রমাণ করে যে এটি সত্য, এবং সর্বদা তাই থাকবে। আপনার কি লিংক আছে?
ইন্ট্রিপিডিস

আমি বহু-থ্রেড আচরণটি নিরীক্ষণ করতে চাইলে লগকটে এটিই খুঁজে পেয়েছিলাম। আপনি থ্রেড আইডি আউটপুট দেওয়ার চেষ্টা করতে পারেন
yushulx

8
আমি এর বিরুদ্ধে দৃ strongly়ভাবে সুপারিশ করব, কারণ এই মানটি আপনার ডিভাইস এবং / অথবা অ্যান্ড্রয়েডের সংস্করণে সুনির্দিষ্ট হতে পারে। যদি এখনই প্রতিটি অ্যান্ড্রয়েড ডিভাইসে এটি হয়ে থাকে, পরবর্তী সংস্করণগুলিতে এটি এখনও অবিরত থাকবে কিনা এমন কোনও গ্যারান্টি নেই। অনক্রিট () চালানোর সময় ক্লাস মেম্বারে থ্রেড আইডি সংরক্ষণ করা আমার কাছে কিছুটা যুক্তিসঙ্গত বলে মনে হয়।
personne3000

1

আপনি ক্লাসে runOnUiThreadপদ্ধতিটি ব্যবহার করতে পারবেন না Activity? দেখুন ..

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29


4
আমার অ্যাপ্লিকেশনটি কাজ করছে, তবে এর বেশ কয়েকটি লেখক রয়েছে এবং এটি বড় এবং জটিল আকার ধারণ করে। আমি যা করতে চাই তা হল একটি অতিরিক্ত সুরক্ষা জাল যুক্ত করা, যে কেউ যদি এমন কোনও পদ্ধতি কল করে যা অন্য কোনও থ্রেড থেকে কেবল জিইউআই-থ্রেড থেকে ডেকে আনার জন্য ডিজাইন করা হয়েছে এমন কলটি দিলে ভুলটি ধরা দেয় as
প্যারড্রয়েড

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