runOnUiThread vs Looper.getMainLooper (). Android'de gönderi


101

Android'de UI iş parçacığında bir görevi yürütmek için runOnUiThread () ile Looper.getMainLooper (). Post () arasında bir fark olup olmadığını herkes söyleyebilir mi?

Belirleyebildiğim tek şey, runOnUiThread statik olmayan bir Activity yöntemi olduğundan, Looper.getMainLooper (). Post () bir sınıftaki Activity'i göremeyen bir şeyi kodlamanız gerektiğinde (örneğin bir arayüz).

UI iş parçacığında bir şeyin yürütülmesi gerekip gerekmediğine dair bir tartışma aramıyorum, bazı şeylerin yapamayacağını ve pek çok şeyin yapılmaması gerektiğini anlıyorum, ancak bazı şeyler (bir AsyncTask başlatmak gibi) UI dizisi.

Teşekkürler
R.


6
runOnUiThreadBunun zaten UI iş parçacığı olup olmadığını kontrol etmesi ve göreviniziMessage
zapl

1
Teşekkürler. Bunu bir cevaba dönüştürür müsün, ben de kabul edebileyim?
Zengin

Ayrıca, UI iş parçacığında bir şeyin yürütülüp yürütülmediğini kontrol etmek için bazı kodlar yazdım, bu yüzden manuel olarak eklemek çok basit olurdu.
Zengin

Yanıtlar:


194

Arka plan iş parçacıklarından çağrıldığında aşağıdakiler aynı şekilde davranır:

  • kullanma Looper.getMainLooper()

    Runnable task = getTask();
    new Handler(Looper.getMainLooper()).post(task);
    
  • kullanma Activity#runOnUiThread()

    Runnable task = getTask();
    runOnUiThread(task);
    

Tek fark, bunu UI iş parçacığından yaptığınız zamandır.

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

mevcut İş Parçacığının zaten UI iş parçacığı olup olmadığını kontrol edecek ve sonra doğrudan çalıştıracaktır. Bunu bir mesaj olarak göndermek, mevcut UI-thread yönteminden dönene kadar yürütmeyi geciktirecektir.

Ayrıca RunnableUI iş parçacığı üzerinde a yürütmenin üçüncü bir yolu vardır View#post(Runnable)- bu, UI iş parçacığından çağrıldığında bile mesajı her zaman gönderecektir. Bu yararlıdır çünkü bu View, kodun düzgün bir şekilde yapılandırıldığından ve kod çalıştırılmadan önce bir düzene sahip olduğundan emin olacaktır .

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.