В чем разница между Thread.run () и Handler.post () и службой в Android? - PullRequest
4 голосов
/ 30 декабря 2011

Обычно рекомендуется использовать Handler.post() в Android, когда нужно выполнить некоторые задания в разных потоках.
А когда я хочу выполнить некоторые задания в фоновом режиме, мне предложили запустить Service.

Но мне удобнее использовать new Thread (new Runnable(){...} );, как раньше.

Но я боюсь, что создание новых потоков вручную может вести себя по-разному в Android, например, может автоматически останавливаться при нехватке памяти при использовании Service, возможно, нет?

Желая получить четкий ответ на вопроспомогите мне выйти из этого замешательства.^ ^

Ответы [ 3 ]

8 голосов
/ 30 декабря 2011

При выполнении определенных заданий в Android настоятельно рекомендуется использовать Handler, потому что:

В Android можно обновлять только представления в исходном потоке, т. Е. В потоке, в котором они были созданы, в противном случае приложение можетбросить исключение, говорящее

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Обработчики в Android связываются с потоком, в котором они созданы.Каждый экземпляр обработчика связан с одним потоком и очередью сообщений этого потока.Когда вы создаете новый обработчик, он привязывается к потоку / очереди сообщений потока, который его создает - с этого момента он будет доставлять сообщения и исполняемые файлы в эту очередь сообщений и выполнять их по мере их выхода из сообщения.очередь.Таким образом, обработчики являются самыми безопасными в Android.

В то время как Сервисы, вот кусок кода из http://developer.android.com/reference/android/app/Service.html

Что такое Сервис?

Наибольшая путаница вКласс обслуживания фактически вращается вокруг того, чем он не является:

Служба не является отдельным процессом.Сам объект Service не подразумевает, что он работает в своем собственном процессе;если не указано иное, он выполняется в том же процессе, что и приложение, частью которого он является.

Служба не является потоком.Это не средство само по себе выполнять работу из основного потока (во избежание ошибок Application Not Responding).Таким образом, сама служба на самом деле очень проста, предоставляя две основные функции:

Средство, позволяющее приложению сообщать системе о том, что оно хочет делать в фоновом режиме (даже если пользователь не взаимодействует напрямую сприложение).Это соответствует вызовам Context.startService (), которые просят систему запланировать работу для службы, которая будет запущена до тех пор, пока служба или кто-либо еще явно не остановит ее.

Средство для приложения, чтобы показать некоторые изего функциональность для других приложений.Это соответствует вызовам Context.bindService (), который позволяет установить давнюю связь со службой для взаимодействия с ней.

И, наконец, Потоки, используются потоки

для выполнения некоторых тяжелых функций, не связанных с просмотром, некоторых сложных вычислений, таких как синтаксический анализ и т. д., чтобы он не блокировал пользовательский интерфейс и безопасно выполнял всю работу ...

2 голосов
/ 30 декабря 2011

Вызов потока из пользовательского интерфейса нарушает модель одного потока: инструментарий пользовательского интерфейса Android не является поточно-ориентированным и всегда должен обрабатываться в потоке пользовательского интерфейса. Вот почему следующие альтернативы вместо непосредственного использования потока

  • Activity.runOnUiThread (Runnable)
  • View.post (Runnable)
  • View.postDelayed (Runnable, long)
  • Обработчик

Обработчик используется для связи между потоком пользовательского интерфейса и фоновым потоком AsyncTask используется для выполнения небольшой задачи в фоновом режиме

Если у вас самая легкая работа в фоновом режиме, тогда используйте обработчик для более тяжелой фоновой работы, используйте AsyncTask, а для выполнения самой тяжелой работы в фоновом режиме используйте сервис

См. http://android -developers.blogspot.com / 2009/05 / painless-threading.html

* ** 1 022 тысяча двадцать-один * Пример
  • Чтобы добавить или удалить данные из списка, вы можете использовать обработчик
  • Чтобы получить данные XML с сервера и отразить те, которые, по вашему мнению, используются AsynTask. AsyncTask является более предпочтительным, чем многопоточность
  • Для воспроизведения музыкального файла воспользуйтесь услугой
0 голосов
/ 30 декабря 2011

Обработчики предназначены для выполнения фрагментов кода в определенном потоке . Наиболее распространенный случай использования на данный момент - когда вы находитесь в контексте рабочего потока и хотите запустить что-то в основном потоке (UI) ... в этом случае вы будете создавать экземпляр обработчика в своем основном потоке (скажем, во время инициализации) и опубликовать () Runnable для него из рабочего потока.

Thread.run () - базовая точка входа в поток Java. Вы реализуете это, когда вам нужен фоновый поток для выполнения некоторых операций ввода-вывода или тяжелых вычислений, за исключением того, что в Android это обычно не происходит, потому что намного проще использовать AsyncTask, в котором вы переопределяете doInBackground () для вашего кода рабочего потока (т. е. там, где вы обычно реализуете run ()) и переопределяете onPostExecute () кодом, который хотите запустить в потоке пользовательского интерфейса после выполнения рабочей задачи.

Сервисы - это нечто совершенно другое ... они НЕ являются потоками. Сервисный код будет выполняться в вашем основном потоке вместе с вашим пользовательским интерфейсом. Вы по-прежнему можете использовать AsyncTask и т. Д. Или использовать специальный вид службы, называемый IntentService, который будет выполнять свою работу в рабочем потоке.

...