runOnUiThread проти Looper.getMainLooper (). опублікувати в Android


99

Хто-небудь може сказати мені, чи є якась різниця між використанням runOnUiThread () та Looper.getMainLooper (). Post () для виконання завдання в потоці інтерфейсу користувача в Android ??

Про єдине, що я можу визначити, це те, що оскільки runOnUiThread - це нестатичний метод Activity, Looper.getMainLooper (). Post () зручніше, коли потрібно кодувати щось у класі, яке не бачить Activity (наприклад інтерфейс).

Я не шукаю обговорення, ЩО-небудь щось слід виконувати в потоці інтерфейсу користувача, я розумію, що деякі речі не можуть, і дуже багато речей не повинні, проте деякі речі (наприклад, запуск AsyncTask) ПОВИННІ виконуватися з потік інтерфейсу користувача.

Дякую,
Р.


6
Немає різниці, крім того, що runOnUiThreadбуде перевіряти, чи це вже потік інтерфейсу користувача, і виконувати ваше завдання безпосередньо, а не публікувати його якMessage
zapl

1
Дякую. Не могли б ви перетворити це на відповідь, щоб я міг його прийняти ??
Багатий

Крім того, я вже написав якийсь код, щоб перевірити, чи щось виконується в потоці інтерфейсу користувача, тому його було б дуже просто включити вручну.
Багатий

Відповіді:


192

Наступне поводиться однаково при виклику з фонових потоків:

  • використовуючи Looper.getMainLooper()

    Runnable task = getTask();
    new Handler(Looper.getMainLooper()).post(task);
    
  • використовуючи Activity#runOnUiThread()

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

Єдина різниця полягає в тому, коли ви робите це з потоку інтерфейсу користувача

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

перевірить, чи поточний Thread вже є потоком інтерфейсу користувача, а потім виконає його безпосередньо. Опублікування його як повідомлення затримає виконання, поки ви не повернетесь із поточного методу UI-потоку.

Існує також третій спосіб виконати a Runnableна потоці інтерфейсу користувача, який буде View#post(Runnable)- цей завжди буде розміщувати повідомлення, навіть коли його викликають з потоку інтерфейсу користувача. Це корисно, оскільки це гарантує, що Viewфайл був правильно побудований і макет до виконання коду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.