반응형
안드로이드 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);
}
};
}
[실행 결과]
반응형
'안드로이드' 카테고리의 다른 글
안드로이드 - android.permission.READ_EXTERNAL_STORAGE (0) | 2015.07.25 |
---|---|
안드로이드 - java.lang.SecurityException: Permission denied (missing INTERNET permission?) (0) | 2015.07.20 |
안드로이드 - Bitmap(이미지) 사이즈 변경(Scale) 및 회전(Rotation)_하는 방법 (0) | 2015.06.24 |
안드로이드 - 라이브 배경화면(Live Wallpaper) #3 설정화면 만들기 (0) | 2015.06.22 |
안드로이드 - 라이브 배경화면(Live Wallpaper) #2 이미지 넣기 (0) | 2015.06.12 |
댓글