как многопоточность увеличивает производительность приложения?
Вообще говоря, это не повышает производительность приложения. Это может решить определенные проблемы с точки зрения UX, например, уменьшить рывки.
Насколько мне известно, ОС назначает процессу/приложению один поток.
Нет, приложение для Android изначально будет иметь несколько потоков, созданных фреймворком. К ним относятся основной поток приложения и пул потоков связывания.
Если вы создадите несколько потоков внутри этого процесса, эти потоки не будут похожи на целую новую группу потоков, назначенных процессу операционной системой.
Да, они.
Вместо этого один поток выполняется одновременно, в то время как другой поток ожидает.
На многоядерном процессоре несколько потоков действительно могут выполняться параллельно. Даже на одноядерных процессорах планировщик Linux (часть ядра Linux, лежащего в основе Android) будет распределять время между потоками.
Пример, касающийся потоков, не связанных с пользовательским интерфейсом, и потоков пользовательского интерфейса, будет очень полезен.
Основной поток приложения (также известный как поток пользовательского интерфейса) по своей сути является просто потоком. Однако именно поток отвечает за отправку событий клавиш и касаний, а также за иное применение обновлений пользовательского интерфейса. Важно не блокировать этот поток, поэтому, если вы работаете в этом потоке (например, onCreate()
действий и фрагментов, onClick()
виджета, getView()
в ListAdapter
), вам нужно вернуться очень быстро, в идеале менее миллисекунды. В противном случае у вас есть «jank», определенный в Android как замороженный пользовательский интерфейс, особенно когда пользовательский интерфейс должен анимироваться (например, прокручивать ListView
).
Так, например, давайте предположим, что мы хотим загрузить файл, достаточно большой, чтобы его загрузка заняла 10 секунд. Загружаем ли мы файл в основном потоке приложения или в фоновом потоке, это не влияет на общую производительность, так как в любом случае это займет 10 секунд. Однако загрузка в основном потоке приложения приведет к зависанию нашего пользовательского интерфейса на 10 секунд, что сделает пользователей недовольными. Загрузка файла в фоновом режиме позволяет избежать этой проблемы. Обратите внимание, что попытка выполнить сетевой ввод-вывод в основном потоке приложения по умолчанию завершается ошибкой на Android 4.0+ (с NetworkOnMainThreadException
), специально для того, чтобы избежать этой конкретной проблемы.
person
CommonsWare
schedule
26.04.2015