2013-12-03 3 views
0

Я переустановил my question from Android Enthusiasts здесь, поскольку это скорее вопрос программирования, и это было рекомендовано. В любом случае. Вот он:Рабочие нитки на одноядерном устройстве

Я создаю приложение, которое изменяет build.prop значений ключа для ПЗУ. Тем не менее, Android часто дает мне предупреждение ANR, поскольку я выполняю всю работу с потоком пользовательского интерфейса. В документации для Android он говорит мне, что я должен использовать рабочие потоки и не выполнять какую-либо работу в потоке пользовательского интерфейса. Но я создаю это системное приложение для работы с ПЗУ для одного основного устройства.

Почему я хочу использовать рабочие потоки, так как это не так эффективно? Так как Android должен остановить поток пользовательского интерфейса, загрузить рабочий поток, а когда пользовательский интерфейс снова используется, остановите рабочий поток и снова загрузите поток пользовательского интерфейса. Разве это не так эффективно?

Итак, Должен ли я использовать рабочие потоки (что замедляет нисходящий поток нисходящих потоков) или просто выполняет всю мою работу над потоком пользовательского интерфейса. Даже если пользовательский интерфейс приложения очень медленный)?

+0

Внесите свой код, используя любую распространенную передовую практику. В этом случае используйте рабочий поток (ы). –

+0

не беспокойтесь о сердечнике. планировщик позволит вашему рабочему потоку запускаться, когда нить ui не работает, что обеспечивает плавный пользовательский интерфейс. Если ваш пользовательский интерфейс замедляется рабочими потоками, уменьшите их число/приоритет. – njzk2

+0

Используйте рабочий поток. Уменьшите его приоритет ниже, чем в пользовательском интерфейсе. Результат - пользовательский интерфейс реагирует как обычно, и работа по-прежнему выполняется, (почти), в одно и то же время. –

ответ

2

Если ваши пользователи были роботами, ваша логика имела бы смысл. Переключение контекста не равно (очень немного) меньше общего времени вычислений. Вы можете сравнить его и посмотреть, сколько именно.

Однако в настоящем (и в ближайшем будущем) вашими пользователями, скорее всего, будут люди, и с этим вам нужно начать думать о психологии: движущийся индикатор прогресса или отзывчивость в целом дадут вашим пользователям впечатление, что задача на самом деле занимает меньше времени, чем без какой-либо обратной связи. Субъективная скорость намного выше с обратной связью.

Там существуют многочисленные документы на предмет субъективной скорости, first one я мог бы найти на веб-сайте есть хороший сравнение прогресс баров в a video (в основном, несколько баров, кажется, идут быстрее, чем другие, тем самым уменьшая субъективное общее ожидание время).

+0

Спасибо за ответ - это действительно полезно :) – George

1

Использовать рабочие потоки.

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

Ваша забота о скорости переключения контекста неуместна - это происходит все время в любом случае, поскольку основные системные процессы и другие приложения работают в фоновом режиме. В некотором быстром Googling показано, что контекст switching a thread в том же процессе равен typically faster, чем коммутатор контекста уровня процесса. Существует немного больше накладных расходов, созданных путем создания потоков, а затем последующих переключателей контекста, но это, вероятно, будет минутным, особенно если у вас есть только одна нить, выполняющая работу. По причинам, которые я перечислял выше (обновления пользовательского интерфейса и возможность принимать пользовательский ввод), сделайте поражение в несколько миллисекунд.

+0

Спасибо за ответ, но вы потеряли меня во втором предложении в последнем абзаце - извините, я нооб! – George

+0

Не беспокойтесь! [Контекстное переключение] (http://en.wikipedia.org/wiki/Context_switch) - это то, что вы описали как остановку потока пользовательского интерфейса и загрузку рабочего потока, и обратно. Возможно, было бы полезно прочитать о [как потоки отличаются от процессов] (http://en.wikipedia.org/wiki/Thread_ (вычисления) #How_threads_differ_from_processes). –

+0

Хорошо, я расскажу об этом позже :) Спасибо – George

Смежные вопросы