Может ли кто-нибудь сказать мне, есть ли разница между использованием runOnUiThread () и Looper.getMainLooper (). Post () для выполнения задачи в потоке пользовательского интерфейса в Android?
Единственное, что я могу определить, так это то, что, поскольку runOnUiThread является нестатическим методом Activity, Looper.getMainLooper (). Post () более удобен, когда вам нужно закодировать что-то в классе, который не может видеть Activity (например, интерфейс).
Я не ищу обсуждения того, следует ли что-то выполнять в потоке пользовательского интерфейса, я понимаю, что некоторые вещи не могут, а многие вещи не должны, однако некоторые вещи (например, запуск AsyncTask) ДОЛЖНЫ выполняться из поток пользовательского интерфейса.
Спасибо,
Р.
android
android-ui
Богатый
источник
источник
runOnUiThread
проверит, является ли он уже потоком пользовательского интерфейса, и выполнит вашу задачу напрямую, вместо того, чтобы публиковать ее какMessage
Ответы:
Следующее ведет себя так же при вызове из фоновых потоков:
с помощью
Looper.getMainLooper()
с помощью
Activity#runOnUiThread()
Единственная разница в том, когда вы делаете это из потока пользовательского интерфейса, поскольку
проверит, является ли текущий поток уже потоком пользовательского интерфейса, а затем выполнит его напрямую. Публикация его как сообщения задержит выполнение до тех пор, пока вы не вернетесь из текущего метода UI-потока.
Существует также третий способ выполнить a
Runnable
в потоке пользовательского интерфейсаView#post(Runnable)
- он всегда будет отправлять сообщение, даже если вызывается из потока пользовательского интерфейса. Это полезно, поскольку это гарантирует, чтоView
объект был правильно построен и имеет макет до выполнения кода.источник