2012-05-11 22 views
81

Activity.runOnUiThread ve View.post arasındaki fark nedir, birisi açıklayabilir mi?Android: Activity.runOnUiThread ve View.post arasındaki fark nedir?

+0

benzer sorular: (http://stackoverflow.com/questions/4083787/runnable-is-posted-successfully-but-not-run), [nedir [Runnable başarıyla fakat çalıştırmak yayınlanmıştır] Activity.runOnUiThread (çalıştırılabilir etki) ve Handler.post()?] (http://stackoverflow.com/questions/1839625/whats-the-difference-between-activity-runonuithreadrunnable-action-and-handler) arasındaki fark, [Handler.post (Runnable r) ve Activity.runOnUiThread (Runnable r)] arasındaki fark (http://stackoverflow.com/questions/7452884/difference-between-handler-postrunnable-r-and-activity-runonuithreadrunnable) –

cevap

90

Eğer etkinliğe doğrudan erişimi olmadığında View.post faydalı olması dışında hiçbir gerçek fark yoktur. Her iki durumda da

değil UI iş parçacığı üzerinde ise, Handler#post(Runnable) perde arkasında çağrılacak.

CommonsWare yorumunda belirtildiği gibi, aralarında bir fark var iki - Ui parçacığı üzerinde çağrıldığında View#post sıraya runnable yayınlayacağız olurken, Activity#runOnUiThread

(örn Handler#post çağrı), doğrudan run yöntemi arayacak

önemli nokta IMO ikisi de aynı hedefe sahip olmasıdır, ve kullanmak kim için, hiçbir fark olmalıdır (ve uygulama gelecekte değişebilir).

+59

Tek fark: 'runOnUiThread()' geçerli iş parçacığını kontrol eder ve ana uygulama iş parçacığı üzerinde olursak hemen 'Runnable'ı çalıştırır. 'post()' her zaman hangi işlevin çağrıldığına bakılmaksızın sıradaki Runnable'ı koyar. – CommonsWare

+0

@CommonsWare - Doğru, sorumu düzenleyeceğim. – MByD

+0

Şimdi, açıklamanızla ilgili açıklamayı ve @CommonsWare yorumunu temel alarak görebiliyorum. –

14

Çoğu durum için kabul edilebilir ve çoğu parça için değiştirilebilirler, ancak alt düzeyde farklıdır. Tabii ki en büyük fark, bir Activity ve diğerinin View'dan alınabilmesidir. Orada olanlar arasındaki örtüşme bir sürü, ama bazen bir Activity içinde bir View erişimi olmayacak ve bazen View içinde bir Activity erişimi olmayacaktır. Ben an answer to another SO question on View.post belirtildiği ben View.post ile karşılaştığınız kenar vakalarının

Bir: View bir pencereye takılı olduğunda View.post sadece başka bir iş parçacığı den çalışır. Bu nadiren bir sorun olmakla birlikte, bazen size Activity arasında onCreate yönteminde View.post çağrı özellikle Runnable, yürütmek asla neden olabilir. Alternatif olarak, Activity.runOnUiThread ve View.post'un kapakların altında kullanıldığı Handler.post'u kullanmak gereklidir.

Activity.runOnUiThread ve view.post() arasındaki bir diğer fark görünüşüdür sonra() denir view.post bu çalıştırılabilir olan

+1

Ayrıca onCreate() 'da bağlanmadığında başarısız olabilir? Hm, bu durumda ViewRoot tarafından sağlanan "Handler" e gönderilmesini beklerdim. – Jens

+5

@Jens Evet, kaynağa baktım ve 'View.post', henüz eklenmediyse daha sonra yürütülmesi gereken bir sıraya 'Runnable' eklemelidir. Kaynakta daha fazla kazmadım ama [docs] (http://developer.android.com/reference/android/view/View.html#post%28java.lang.Runnable%29) şunu söylüyor: "Bu yöntem, yalnızca bu Görünüm bir pencereye eklendiğinde UI iş parçacığı dışından çağrılabilir." Bu yüzden eğer şu anki iş parçacığı üzerinde ise, o zaman söyledikleriniz doğruysa, eğer o değilse muhtemelen 'Runnable'ı yutar. Bunu kesinlikle benim kodumda yaptım. – kabuko

+0

@kabuko Teşekkürler, cevabınızı başka bir noktadan gösterir. Nasıl kabul edilemiyorum 1'den fazla cevap mantığın arkasındaki mantığı göremiyorum meta forumuna üye olacak –

16

(doğruluğu için düzenlenmiş "başka bir iş parçacığı" eklenmiştir) bir pencereye bağlı. kullanışlı cevapları ile

+0

Gösterileni nasıl gösterebilirim? Görünür mü? Görünmez bir görünüme hiç çağrılmadı mı? –

+0

Belirsizliği düzeltin Alex. – pareshgoel

+5

Bu en önemli fark IMHO. Pek çok kişi, görünümün eklendikten sonra yürütülmesi gereken öğeleri yürütmek için view.post() işlevini kullanır. – Sotti

İlgili konular