네트워크가 들어가는 부분은 메인 쓰레드에서 돌릴수 없습니다.
AsyncTask나 Thread/Handler를 사용하셔야 합니다.
https://developer.android.com/reference/android/os/AsyncTask.html
위 안드로이드 사이트에 가보시면 알겠지만 AsyncTask는 기본적으로
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
이런 식으로 구성되어있고 doInBackground에서 네트워크 등 백그라운드 작업을 하시면 되고
onPostExecute 여기서 결과값을 전달받아 UI를 업데이트 하시면 됩니다.
자세한 사용법은 위 사이트에 나와있습니다.
그리고 쓰레드 핸들러 같은 경우는
Thread를 만들고 Runnable을 구현해서 러너블에서 네트워크 작업 등 백그라운드 작업을 하시면 되고
Handler의 메시지 객체로 전달해서 Handler에서 UI 처리를 하시면 됩니다.
두개가 구현하는 방식이 달라서 그렇지 똑같습니다.
일단 예제는 넘쳐나니.. 공부해 보시고 적용하세요.