Большая часть кода, который вы пишете, запускается по потоку пользовательского интерфейса, то есть по основному потоку. Некоторые операции около View
s должны выполняться в потоке пользовательского интерфейса. И операции, которые потребляют много ресурсов, должны выполняться из потока пользовательского интерфейса.
Вы можете начать новый Thread
, позвонив по номеру new Thread(Runnable).start()
, тогда задача будет выполнена в потоке, отличном от UI. Но для этого рекомендуется использовать пул потоков, например ExecutorService
, потому что он повторно использует потоки.
Для AsyncTask
, код в doInBackground()
работает на нити без UI от статического пула потоков из AsycTask
, в то время как onPostExecuted()
выполняются в потоке пользовательского интерфейса. Поэтому вы должны выполнять операции пользовательского интерфейса в onPostExecuted()
.
При использовании Handler
, где handleMessage()
код работает основанный на Looper
вы передаете конструктору Handler
. По умолчанию это Looper.getMainLooper()
, поэтому он работает в потоке пользовательского интерфейса.
'Thread' running ** off **' MainThread i.e UI' и 'runOnUIThread()' запускает ** на ** основной поток! –
Вы читали http://stackoverflow.com/questions/26938265/difference-between-thread-runnable-handler-runonuithread-asynctask? –
@Jordy, [здесь] (http://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread) вы можете проверить разницу в использовании Runnable и Thread. Что касается RunOnUIThread - чтобы применить изменения в представлении, он должен быть недействительным и повторно настроен. И эти действия могут выполняться только в потоке пользовательского интерфейса, поэтому RunOnUIThread - это способ сделать это. – DmitryArc