본문 바로가기
안드로이드

안드로이드 - android.os.NetworkOnMainThreadException

by Dokon Jang 2015. 7. 19.
반응형

안드로이드 Activity가 바로 실행 될 때 Network으로 웹서버 등에 접속 시 android.os.NetworkOnMainThreadException이 발생합니다.

이러한 경우 Thread를 이용하여 Network에 접속해야합니다.

 

1. 아래의 코드는 웹서버에 접속하여 HTML을 가지고 오는 코드입니다.

  Thread를 이용하지 않고 바로 Activity에서 웹서버에 접속하여 HTML을 가지고 올 경우 NetworkOnMainThreadException이 발생합니다.

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class NaverAct extends ActionBarActivity {

    TextView tvNaverHtml;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.naver);

        String naverHtml = getNaverHtml();

        tvNaverHtml = (TextView)this.findViewById(R.id.tv_naver_html);
        tvNaverHtml.setText(naverHtml);
    }

    private String getNaverHtml(){
        String naverHtml = "";

        URL url =null;
        HttpURLConnection http = null;
        InputStreamReader isr = null;
        BufferedReader br = null;

        try{
            url = new URL("http://www.naver.com");
            http = (HttpURLConnection) url.openConnection();
            http.setConnectTimeout(3*1000);
            http.setReadTimeout(3*1000);

            isr = new InputStreamReader(http.getInputStream());
            br = new BufferedReader(isr);

            String str = null;
            while ((str = br.readLine()) != null) {
                naverHtml += str + "\n";
            }

        }catch(Exception e){
            Log.e("Exception", e.toString());
        }finally{
            if(http != null){
                try{http.disconnect();}catch(Exception e){}
            }

            if(isr != null){
                try{isr.close();}catch(Exception e){}
            }

            if(br != null){
                try{br.close();}catch(Exception e){}
            }
        }

        return naverHtml;
    }
}
 

 

2. NetworkOnMainThreadException을 해결하기 위해서는 Thread를 이용하여 웹서버에 접속하여 HTML을 얻어야 합니다.

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class NaverAct extends ActionBarActivity {

    TextView tvNaverHtml;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.naver);

        // Thread로 웹서버에 접속
        new Thread() {
            public void run() {
                String naverHtml = getNaverHtml();

                Bundle bun = new Bundle();
                bun.putString("NAVER_HTML", naverHtml);
                Message msg = handler.obtainMessage();
                msg.setData(bun);
                handler.sendMessage(msg);
            }
        }.start();

        tvNaverHtml = (TextView)this.findViewById(R.id.tv_naver_html);
        //tvNaverHtml.setText(naverHtml);
    }

    private String getNaverHtml(){
        String naverHtml = "";

        URL url =null;
        HttpURLConnection http = null;
        InputStreamReader isr = null;
        BufferedReader br = null;

        try{
            url = new URL("http://www.naver.com");
            http = (HttpURLConnection) url.openConnection();
            http.setConnectTimeout(3*1000);
            http.setReadTimeout(3*1000);

            isr = new InputStreamReader(http.getInputStream());
            br = new BufferedReader(isr);

            String str = null;
            while ((str = br.readLine()) != null) {
                naverHtml += str + "\n";
            }

        }catch(Exception e){
            Log.e("Exception", e.toString());
        }finally{
            if(http != null){
                try{http.disconnect();}catch(Exception e){}
            }

            if(isr != null){
                try{isr.close();}catch(Exception e){}
            }

            if(br != null){
                try{br.close();}catch(Exception e){}
            }
        }

        return naverHtml;
    }

    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            Bundle bun = msg.getData();
            String naverHtml = bun.getString("NAVER_HTML");
            tvNaverHtml.setText(naverHtml);
        }
    };
}
 

 

[실행 결과]

 

반응형

댓글