Вы должны переместить весь код, который связывается, в другой поток. Лучший способ сделать это - использовать asyncTask . Вы должны переопределить метод doInBackground и поместить в этот метод весь код, блокирующий вызовы сети. AsyncTask будет делать все в этом методе в отдельном потоке. Если вы также переопределите onPostExecute, вы можете использовать этот метод для обновления своего представления. OnPostExecute выполняется в потоке пользовательского интерфейса и поэтому может вносить изменения в пользовательский интерфейс.
В общем, если вы выполняете код, выполнение которого занимает некоторое время, всегда помещайте этот код в отдельный поток, заставьте пользовательский интерфейс отображать индикатор выполнения и дождитесь завершения потока.
Если ваш поток пользовательского интерфейса выполняет тяжелую работу и не может отвечать на пользовательский ввод в течение определенного периода времени, Android пометит ваше приложение как аварийное и предложит пользователю его уничтожить.