안드로이드에서 HTTP를 사용해 웹에 정보를 요청하는 일은 표준 자바의 방식을 그대로 사용할 수 있다.
- 1. URL 객체 생성
URL url = new URL("https://google.com"); //구글 연결을 위한 url 객체 생성
URL 객체의 파라미터로 전달하는 문자열에 "http://" 혹은 "https://"가 포함되면 HTTP 연결을 위한 객체를 만들게 된다.
- 2. HttpURLConnection 객체 생성
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
URL 객체의 openConnection()
메소드를 호출하면 URLConnection 객체가 리턴된다. 그런데 URL객체를 만들 때 "https://" 문자열이 포함되어있어서 HTTP 연결을 위한 URL객체가 생성되었다. 따라서 리턴된 URLConnection 객체는 HttpURLConnection 객체로 타입 캐스팅할 수 있다.
- 3. HttpURlConnection 객체의 입력 스트림을 통해 웹 페이지 데이터 가져오기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream());
InputStreamReader는 문자를 하나씩만 가져온다. 따라서 여기에 버퍼링을 사용하여 한 줄씩 가져올 수 있는 보조스트림인 BufferedReader의 도움을 받았다. 매개변수로는 스트림 객체를 넣어주어야 하는데, 우리가 연결을 구성한 웹페이지의 내용을 읽어올 것이므로 HttpURLConnection 객체의 입력 스트림을 넣어주었다. HttpURLConnection의 입력 스트림을 가져오기 위해서 `getInputStream() 메소드를 사용하였다.
나머지는 이제 사용자가 원하는 기능을 구성하기 나름이다. 위에서 생성한 객체들을 사용해서 웹페이지에 HTTP request를 보내서 응답을 읽어와서 화면에 표시하는 간단한 앱을 만들어보자.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<Button
android:id="@+id/requestBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="요청"
android:textSize="20dp"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"/>
<EditText
android:id="@+id/urlInput"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginHorizontal="10dp"
android:layout_alignBottom="@+id/requestBtn"/>
</RelativeLayout>
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/viewer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:background="#33000000"
android:textColor="#ff000000"
android:textSize="12dp"/>
</ScrollView>
</LinearLayout>
URL 주소를 입력할 입력상자 및 웹페이지 요청을 위한 버튼, 그리고 가져온 내용을 표시할 텍스트뷰를 만들었다.
public class MainActivity extends AppCompatActivity {
EditText urlInput; // URL 입력상자
TextView viewer; // HTTP 응답내용 표시 영역
Handler handler = new Handler(); // 메인 스레드 핸들러
StringBuilder sb; // 읽어온 내용 저장할 스트링빌더 객체
HttpThread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
urlInput = findViewById(R.id.urlInput);
viewer = findViewById(R.id.viewer);
Button requestBtn = findViewById(R.id.requestBtn);
requestBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
thread = new HttpThread(); // HttpThread 객체 생성
thread.start(); // 스레드 시작
}
});
}
@Override
protected void onPause() {
super.onPause();
try{
thread.join(); //화면이 안보이게 될 때 스레드 해제
}catch(Exception e){}
}
class HttpThread extends Thread{
public HttpThread() {}
@Override
public void run() {
sb = new StringBuilder();
try{
URL url = new URL(urlInput.getText().toString().trim()); // 입력상자에서 URL 주소 가져오기
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // HTTP 연결 객체 생성
if(conn!=null){
conn.setConnectTimeout(10000); // 타임아웃 10초로 설정
conn.setRequestMethod("GET"); // GET방식으로 요청
/* HttpURLConnection 객체의 입력, 출력 Enable */
conn.setDoInput(true);
conn.setDoOutput(true);
int resCode = conn.getResponseCode(); // 웹서버에 페이지 요청
/* HTTP 연결 입력 스트림 객체 참조 */
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
/* 스트림을 통해 내용 한줄씩 읽어들이면서 contents에 덧붙이기 */
String line = null;
while(true){
line = br.readLine();
if(line == null){
break;
}
sb.append(line+"\n");
}
br.close(); // 스트림 해제
conn.disconnect(); // Http 연결 해제
}
}catch(Exception e){
e.printStackTrace();
}
/* 메인스레드의 핸들러를 통해 텍스트뷰에 내용 표시 */
handler.post(new Runnable() {
@Override
public void run() {
viewer.setText(sb.toString());
}
});
}
}
}
위에서 설명한 메소드를 통해서 URL 객체를 만들고, 이 객체의 openConnection()
메소드를 통해 HttpURLConnection 객체를 만들었다. 이후 기타 부가적인 설정을 한 다음 스트림을 생성해 내용을 읽어들여서 텍스트뷰에 표시했다. 안드로이드는 정책상 네트워킹을 상요할 때 반드시 새로운 스레드를 만들어서 처리하도록 되어있다. 따라서 텍스트뷰에 가져온 내용을 업데이트 할 때 메인스레드의 핸들러를 사용했다.
앱을 실행하고 웹서버에 페이지를 요청하면 아래 사진과 같은 결과가 나온다.
'안드로이드' 카테고리의 다른 글
(안드로이드) 53 - SQLite3를 사용한 데이터베이스 만들기 (0) | 2020.05.19 |
---|---|
(안드로이드) 52 - RSS 피더 만들기 (0) | 2020.05.19 |
(안드로이드) 50 - 소켓(Socket) 통신 (0) | 2020.05.19 |
(안드로이드) 49 - 네트워크(Network) 개요 (0) | 2020.05.19 |
(안드로이드) 48 - AsyncTask (0) | 2020.05.19 |