Яка різниця між Activity.runOnUiThreadіView.post , хтось, будь ласка, може пояснити?
Яка різниця між Activity.runOnUiThreadіView.post , хтось, будь ласка, може пояснити?
Відповіді:
Справжньої різниці немає, за винятком того, що View.post це корисно, коли у вас немає прямого доступу до діяльності.
В обох випадках, якщо не в потоці інтерфейсу користувача, Handler#post(Runnable) буде викликано за кадром.
Як згадується в коментарі CommonsWare, між ними є різниця - при Activity#runOnUiThreadвиклику на потік Ui буде викликатиrun метод безпосередньо, тоді як View#postбуде розміщувати runnableв черзі (наприклад, викликати Handler#post)
Важливим моментом ІМО є те, що обидва мають одну і ту ж мету, і для того, хто її використовує, не повинно бути різниці (і впровадження може змінитися в майбутньому).
runOnUiThread()перевіряє поточний потік і виконує Runnableнегайно, якщо ми опинилися в основному потоці програми. post()завжди ставить у Runnableчергу, незалежно від потоку, до якого вона покликана.
runOnUiThread()перевіряє поточний потік і виконує Runnableнегайно, якщо ми опинилися в основному потоці програми " (курсив додано). "Це означає, що те, що зараз є в потоці інтерфейсу, ігнорується, і цьому надається першочергове значення?" - "те, що зараз є в потоці інтерфейсу користувача" - це runOnUiThread()дзвінок.
Інша відмінність Activity.runOnUiThread від view.post () полягає в тому, що запущений у view.post () виклик відбувається після приєднання подання до вікна.
Або є прийнятними для більшості ситуацій і здебільшого вони є взаємозамінними, але вони є тонко різні. Найбільша різниця, звичайно, полягає в тому, що один доступний від Activityа, а інший - від View. Між ними є багато перекриттів, але іноді в a Activityви не матимете доступу до a View, а іноді в a Viewви не матимете доступу до an Activity.
Один із крайових випадків, з яким я стикався, View.postя згадував у відповіді на інше запитання щодо SOView.post : View.postпрацює лише з іншого потоку, коли Viewприєднано до вікна. Це рідко проблема, але іноді може привести до того, Runnableщоб ніколи не виконати, особливо , якщо ви телефонуєте View.postв onCreateметоді з ваших Activity. Альтернативою є використання того, Handler.postщо є Activity.runOnUiThreadіView.post використання під ковдрами в будь-якому випадку.
(відредаговано для точності, додано "з іншої теми")
onCreate()також не закріпити ? Хм, я б очікував, що в такому випадку його буде опубліковано на Handlerпостачальнику ViewRoot.
View.postповинен додати його Runnableдо черги, яка буде виконана пізніше, якщо вона ще не приєднана. Я не заглиблювався у джерело набагато глибше, але в документах сказано: "Цей метод можна викликати ззовні потоку інтерфейсу, лише коли цей подання приєднано до вікна." Тому я думаю, що якщо це стосується поточного потоку, то те, що ви сказали, відповідає дійсності, якщо це не так, можливо, воно просто ковтає Runnable. У моєму коді це точно траплялося.