Android: Activity.runOnUiThread ile View.post arasındaki fark nedir?


98

Activity.runOnUiThreadVe View.post, birisi, lütfen açıklayabilir mi? Arasındaki fark nedir ?


Yanıtlar:


105

View.postEtkinliğe doğrudan erişiminiz olmadığında yararlı olması dışında gerçek bir fark yoktur .

Her iki durumda da, UI iş parçacığında değilse Handler#post(Runnable), perde arkasında çağrılacaktır.

Ui parçacığı üzerinde adlandırılan - CommonsWare açıklamada belirtildiği gibi, ikisi arasında bir fark yoktur Activity#runOnUiThreadarayacak runolurken, doğrudan yöntemi View#postyayınlayacağız runnablesıraya (örn çağrı Handler#post)

Önemli olan nokta IMO'nun her ikisinin de aynı amaca sahip olması ve onu kim kullanırsa kullansın, hiçbir fark olmaması (ve gelecekte uygulama değişebilir).


71
Bir fark: runOnUiThread()mevcut iş parçacığını kontrol eder Runnableve ana uygulama iş parçacığında olursak hemen yürütür . hangi iş parçacığına post()başvurulursa çağrılsın, her zaman Runnablesıraya koyar .
CommonsWare

Teşekkürler Şimdi açıklamanıza ve @CommonsWare yorumuna göre farkı görebiliyorum.
Alexander Kulyakhtin

4
@Ashwin: "RunOnUiThread () uygulamasının Runnable'ı hemen çalıştırdığını söyledin" - hayır, yapmadım. Lütfen yorumu tekrar okuyun. " runOnUiThread()Mevcut iş parçacığını kontrol eder ve ana uygulama iş parçacığında olursakRunnable hemen çalıştırır " dedim (vurgu eklendi). "Bu, şu anda UI iş parçacığında olanların yok sayıldığı ve buna birinci öncelik verildiği anlamına mı geliyor?" - "Ne hiç UI iş parçacığı üzerinde şu anda" olduğunu diyoruz. runOnUiThread()
CommonsWare

1
@ barn.gumbl: Bu durumda kaynağa baktım.
CommonsWare

1
Orada olan bir fark. Pencereye eklenmemiş bir görünüme gönderi yapmak hiçbir şey yapmaz. Çok büyük bir fark olmasa da , bu ince hatalara neden olabilir ve farkın var olduğunun farkında değilseniz gezinmek oldukça can sıkıcıdır.
dcow

23

Activity.runOnUiThread ve view.post () arasındaki diğer bir fark, view.post () içindeki çalıştırılabilir öğenin, görünüm bir pencereye eklendikten sonra çağrılmasıdır.


Nasıl gösterildi demek istiyorsun? Görünür olur mu? Görünmez bir görüşe hiç çağrılmadınız mı?
Alexander Kulyakhtin

Alex belirsizliği düzeltti.
pareshgoel

5
IMHO'nun en önemli farkı budur. Görünüm eklendikten SONRA yürütülmesi gereken şeyleri yürütmek için birçok kişi view.post () kullanıyor.
Sotti

3
Bu doğru değil. Bu hiçbir zaman doğru olmamıştır, ancak bir noktada View.java için JavaDoc yanlış bir şekilde "View.post yalnızca Görünüm bir pencereye eklendiğinde başka bir iş parçacığından çalışır" ifadesini kullandı. Bu sorun 15 Ekim 2012'de düzeltildi , ancak Android geliştiricilerinin zihnine nüfuz etmesi biraz zaman aldı.
Alex Cohn

Bu fark için @pareshgoel kaynağı?
apostleofzion

17

Ya çoğu durum için ve onlar birbirlerinin yerine çoğunlukla kabul edilebilir, ancak bunlar vardır ustaca farklı. Elbette en büyük fark, birinin bir Activityve diğerinin a'dan alınabilmesidir View. Bunlar arasında çok fazla örtüşme vardır, ancak bazen bir'de a'ya Activityerişiminiz olmayacak Viewve bazen bir a'da Viewbir Activity.

İle karşılaştı uç örnekleri biri View.postben geçen başka SO soruya bir cevapView.post : View.postçalışır başka bir iş parçacığı zaman Viewbir pencere takılır. Bu nadiren bir sorun, ancak bazen neden olabilir Runnablearamak, özellikle yürütmek asla View.postiçinde onCreate, aramalarınızdan yöntemle Activity. Yine de bir alternatif, Handler.posthangisinin ne olduğunu Activity.runOnUiThreadve View.postkapakların altında kullanılmasıdır.

(doğruluk için düzenlendi, "başka bir ileti dizisinden" eklendi)


1
Ayrıca bağlanmadığında başarısız olabilir onCreate()mi? Hm, bu durumda Handlertedarik edilene göndermesini bekliyorum ViewRoot.
Jens

5
@Jens Evet, kaynağa baktım ve henüz eklenmemişse daha sonra yürütülecek bir kuyruğa View.posteklemeliyim Runnable. Kaynakta daha derinlemesine araştırma yapmadım , ancak dokümanlar şöyle diyor: "Bu yöntem, yalnızca bu Görünüm bir pencereye eklendiğinde UI iş parçacığının dışından çağrılabilir." Yani bence şu anki iş parçacığındaysa, o zaman söylediğiniz doğrudur, değilse o zaman muhtemelen sadece Runnable. Bunu kodumda kesinlikle yaşadım.
kabuko

@kabuko Teşekkür ederim cevabınız bunu başka bir noktadan gösteriyor. Ben o meta forumu hitap eder arkasında 1'den fazla cevap mantığı göremiyorum kabul edemez ne kadar
Alexander Kulyakhtin

3
Bu doğru değil. Bu hiçbir zaman doğru olmamıştır, ancak bir noktada View.java için JavaDoc yanlış bir şekilde "View.post yalnızca Görünüm bir pencereye eklendiğinde başka bir iş parçacığından çalışır" ifadesini kullandı. Bu sorun 15 Ekim 2012'de düzeltildi , ancak Android geliştiricilerinin zihnine nüfuz etmesi biraz zaman aldı.
Alex Cohn

0

Diğer bir fark: postGörünüm başına; runOnUiThreadEtkinlik başına.

Bu , kendi izleme veya filtreleme kodunuz olmadan tam olarak istediğiniz şeyi yapmanın view.getQueue/ activity.getQueueve elde etmenin (gelecekte?) Mümkün olacağı anlamına gelir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.