2015-10-06 3 views
0

Сегодня мне удалось ускорить работу с Android-приложением, используя Runnable, обрабатывая часть вставки/обновления кода и удаляя некоторые материалы базы данных. Однако я также использовал RunOnUiThread() и обычный Thread(), но я не знаю, каковы различия между всеми тремя. Я знаю ASyncTask, но как вы выбираете, с чем работать, и каковы основные отличия?Runnable, Thread, RunOnUIThread

Объяснение/ссылка на другой сайт будет очень приятной.

Kind Regard.

+1

'Thread' running ** off **' MainThread i.e UI' и 'runOnUIThread()' запускает ** на ** основной поток! –

+1

Вы читали http://stackoverflow.com/questions/26938265/difference-between-thread-runnable-handler-runonuithread-asynctask? –

+1

@Jordy, [здесь] (http://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread) вы можете проверить разницу в использовании Runnable и Thread. Что касается RunOnUIThread - чтобы применить изменения в представлении, он должен быть недействительным и повторно настроен. И эти действия могут выполняться только в потоке пользовательского интерфейса, поэтому RunOnUIThread - это способ сделать это. – DmitryArc

ответ

1

Большая часть кода, который вы пишете, запускается по потоку пользовательского интерфейса, то есть по основному потоку. Некоторые операции около View s должны выполняться в потоке пользовательского интерфейса. И операции, которые потребляют много ресурсов, должны выполняться из потока пользовательского интерфейса.

Вы можете начать новый Thread, позвонив по номеру new Thread(Runnable).start(), тогда задача будет выполнена в потоке, отличном от UI. Но для этого рекомендуется использовать пул потоков, например ExecutorService, потому что он повторно использует потоки.

Для AsyncTask, код в doInBackground() работает на нити без UI от статического пула потоков из AsycTask, в то время как onPostExecuted() выполняются в потоке пользовательского интерфейса. Поэтому вы должны выполнять операции пользовательского интерфейса в onPostExecuted().

При использовании Handler, где handleMessage() код работает основанный на Looper вы передаете конструктору Handler. По умолчанию это Looper.getMainLooper(), поэтому он работает в потоке пользовательского интерфейса.

+0

Отличный ответ, заглянет в ExecutorService. На данный момент ваш ответ помог мне лучше всего. Большое спасибо. – Jordy

1

Когда вы изменяете какое-то значение в пользовательском интерфейсе (textBox.text) из обычного потока, оно вызывает исключение. Таким образом, вы должны использовать RunonUiThread() для обмена значениями с пользовательским интерфейсом и одновременно запускать асинхронно.

normalThreadMethod(){ 
textBox.text = "Test"; //Exception 
} 

RunOnUIThread(){ 
textbox.text = "Test"; //no error 
} 
+0

Спасибо за ваше объяснение, я понимаю цель RunOnUiThread. Не сказал этого в моем вопросе. – Jordy