CHAP 13. 네트워크
안드로이드에서의 네트워크
네트워킹 상태 조회 ConnectivityManager 클래스는 네트워크 연결 상태를 감시하고 만약 네트워크 연결 상태가 변경되면 다른 애플리케이션에게 방송한다.
예제: 현재 네트워크 상태 출력 버튼을 누르면 현재 네트워크 상태를 출력한다.
사용자 인터페이스 작성 에디트 텍스트와 버튼으로 이루어진 사용자 인터페이스를 작성한다. 자세한 내용은 소스를 참고한다.
코드 작성 package kr.co.company.networktest1; // 소스만 입력하고 Alt+Enter를 눌러서 import 문장을 자동으로 생성한다. public class MainActivity extends AppCompatActivity { EditText display; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button get = (Button) findViewById(R.id.get); display = (EditText) findViewById(R.id.display);
코드 작성 get.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNet = manager.getActiveNetworkInfo(); if (activeNet != null) { if (activeNet.getType() == ConnectivityManager.TYPE_WIFI) display.setText(activeNet.toString()); } else if (activeNet.getType() == ConnectivityManager.TYPE_MOBILE) { display.setText(activeNet.toString()); } } } catch (Exception e) { } } }); }
메니페스트 파일 수정 ... <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
실행 결과
웹에서 파일 다운로드 HTTP 프로토콜을 이용하여서 네트워크에서 파일을 다운로드할 때 는 HttpURLConnection 사용 메인 스레드에서 직접 파일을 다운로드하면 NetworkOnMainThreadException 예외가 발생
예제: 웹서버에서 웹페이지 다운로드하여 표시
사용자 인터페이스 작성 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/url" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" > <requestFocus /> </EditText> <Button android:id="@+id/download" android:text="Button" /> <TextView android:id="@+id/text" android:layout_height="match_parent" android:text="TextView" /> </LinearLayout>
코드 작성 public class MainActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnDownload = (Button) findViewById(R.id.download); OnClickListener downloadListener = new OnClickListener() { public void onClick(View v) { if (isNetworkAvailable()) { EditText url = (EditText) findViewById(R.id.url); DownloadTask downloadTask = new DownloadTask(); downloadTask.execute(url.getText().toString()); } else { Toast.makeText(getBaseContext(), "Network is not Available", Toast.LENGTH_SHORT) .show(); } }; btnDownload.setOnClickListener(downloadListener);
코드 작성 private boolean isNetworkAvailable() { boolean available = false; ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) available = true; return available; } private String downloadUrl(String strUrl) throws IOException { String s = null; byte[] buffer = new byte[1000]; InputStream iStream = null; try { URL url = new URL(strUrl); HttpURLConnection urlConnection = (HttpURLConnection) url .openConnection(); urlConnection.connect(); iStream = urlConnection.getInputStream(); iStream.read(buffer); s = new String(buffer); } catch (Exception e) { Log.d("Exception while downloading url", e.toString()); } finally { iStream.close(); return s;
코드 작성 private class DownloadTask extends AsyncTask<String, Integer, String> { String s = null; @Override protected String doInBackground(String... url) { try { s = downloadUrl(url[0]); } catch (Exception e) { Log.d("Background Task", e.toString()); } return s; protected void onPostExecute(String result) { TextView tView = (TextView) findViewById(R.id.text); tView.setText(result); Toast.makeText(getBaseContext(), "Web page downloaded successfully", Toast.LENGTH_SHORT) .show();
매니페스트 파일 수정 ... <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
실행 결과
모바일 애플리케이션의 종류 모바일 애플리케이션의 종류 안드로이드 SDK를 사용하여 개발하고 APK 형식으로 사용자 장치에 설치되는 클라이언트 쪽 애플리케이션 웹앱(Web App)으로 웹 표준을 사용하여 개발하고 사용자는 웹 브라우저를 통해 액세스하는 방법이다. 이 경우에는 사용자 장 치에 설치할 필요가 없다.
웹앱의 종류
WebView 위젯 안드로이드에서 웹 서버로부터 웹페이지를 읽어서 웹 브라우저처럼 화면에 표시하는 것이 가능할까? 안드로이드에서 웹 서버로부터 웹페이지를 읽어서 웹 브라우저처럼 화면에 표시하는 것이 가능할까? WebView 위젯을 사용하면 가능하다. WebView 위젯은 WebKit이라는 엔진을 사용하여서 HTML 문서를 해석하여서 화면에 그려준다.
WebView 사용 방법
레이아웃 파일
예제: 나만의 웹브라우저 작성
사용자 인터페이스
코드
메니페스트 파일
실행 결과
XML 처리 인터넷을 통하여 전달되는 데이터는 주로 XML 형식
XML 파서 DOM 파서 SAX 파서 PullParser 파서
DOM DOM(Document Object Model)은 W3C의 표준으로 XML 문서에 접 근하고 처리하는 표준적인 방법을 정의 DOM은 XML 문서를 트리 구조로 표현한다. DOM은 문서 요소의 객체(object), 특징(property), 메소드(interface) 를 정의
DOM
예제 기상청에서 제공하는 특정한 위치의 정보를 해석하여서 화면에 시간 에 따른 온도와 날씨만을 표시하는 애플리케이션
사용자 인터페이스 사용자 인터페이스를 XML로 정의
코드 작성 @SuppressLint("NewApi") public class MainActivity extends AppCompatActivity { TextView textview; Document doc = null; LinearLayout layout = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textview = (TextView) findViewById(R.id.textView1); } public void onClick(View view) { GetXMLTask task = new GetXMLTask(this); task.execute("http://www.kma.go.kr/wid/queryDFS.jsp?gridx=61&gridy=125");
코드 작성 // private inner class extending AsyncTask @SuppressLint("NewApi") private class GetXMLTask extends AsyncTask<String, Void, Document> { private Activity context; public GetXMLTask(Activity context) { this.context = context; } @Override protected Document doInBackground(String... urls) { URL url; try { url = new URL(urls[0]); DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance(); DocumentBuilder db; db = dbf.newDocumentBuilder(); doc = db.parse(new InputSource(url.openStream())); doc.getDocumentElement().normalize(); } catch (Exception e) { Toast.makeText(getBaseContext(), "Parsing Error", Toast.LENGTH_SHORT).show(); return doc;
코드 작성 @Override protected void onPostExecute(Document doc) { String s = ""; NodeList nodeList = doc.getElementsByTagName("data"); for (int i = 0; i < nodeList.getLength(); i++) { s += "" + i + ": 날씨 정보: "; Node node = nodeList.item(i); Element fstElmnt = (Element) node; NodeList nameList = fstElmnt.getElementsByTagName("temp"); Element nameElement = (Element) nameList.item(0); nameList = nameElement.getChildNodes(); s += "온도 = " + ((Node) nameList.item(0)).getNodeValue() + " ,"; NodeList websiteList = fstElmnt.getElementsByTagName("wfKor"); Element websiteElement = (Element) websiteList.item(0); websiteList = websiteElement.getChildNodes(); s += "날씨 = " + ((Node) websiteList.item(0)).getNodeValue() + "\n"; } textview.setText(s);
실행 결과