0️⃣실행 결과
조회를 누르면 지정해둔 RSS(Rich Site Summary) 사이트 기사를 리싸이클러뷰로 보여준다.
간단한 설명 |
RSS 사이트에서 받아온 XML 파일에서 <태그>를 가지고 제목, 내용 등 원하는 정보만 가져온다. 각각의 기사들을 하나의 아이템으로 만들어 리싸이클러뷰에 나타내면 된다. |
목차 |
1. 기본 설정 & 레이아웃 만들기 |
2. RSS 클래스 만들기 |
3. 어댑터 만들기 : 리싸이클러뷰와 RSS 객체를 연결하자. |
4. XML 파싱하는 클래스 만들기 |
5. MainActivity 작성하기 |
1️⃣ 기본 설정 & 레이아웃 만들기
[기본 설정]
gradle 추가
implementation("com.android.volley:volley:1.2.1")
AndroidManifest 추가
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:usesCleartextTraffic="true"
[레이아웃 만들기]
2️⃣RSS 클래스 만들기
먼저 RSS 기사에 어떤 정보들이 어떻게 있는지를 보자.
[RSS 사이트]
RSS - 매일경제
매일경제의 다양한 정보와 뉴스를 RSS 로 제공
www.mk.co.kr
나는 매일경제의 헤드라인 뉴스를 선택했다.
https://www.mk.co.kr/rss/30000001/

자세히 보면
<item> 태그로 각각의 기사를 구분할 수 있다.
태그는 <no>,<title>,<link>,<category>,<author>,<pubDate>,<description>이 있다.
나는 제목과 설명만 나타낼 거라서 <title>과 <description> 태그 안의 내용만 가져올 거임.
[RSS 클래스]
title, description 문자열 객체 만들고 생성자랑 getter and setter 만들기.
package com.example.doitmission_20;
public class RSS {
String title;
String description;
public RSS(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
3️⃣ 어댑터 만들기 : 리싸이클러뷰와 RSS 객체를 연결하자.
package com.example.doitmission_20;
public class rssAdapter extends RecyclerView.Adapter<rssAdapter.ViewHolder> {
ArrayList<RSS> items = new ArrayList<RSS>();
static class ViewHolder extends RecyclerView.ViewHolder{
TextView textView_title, textView_descrption;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView_title = itemView.findViewById(R.id.textView2);
textView_descrption = itemView.findViewById(R.id.textView3);
}
public void setItem(RSS item){
textView_title.setText(item.title);
textView_descrption.setText(item.description);
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.rss_item, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull rssAdapter.ViewHolder holder, int position) {
RSS item = items.get(position);
holder.setItem(item);
}
@Override
public int getItemCount() {
return items.size();
}
void addItem(RSS item){
items.add(item);
}
public void setItems(ArrayList<RSS> items){
this.items = items;
}
public RSS getItem(int position){
return items.get(position);
}
}
addItem, setItems, getItem은 애샛끼로 외우고 있다.
4️⃣ XML 파싱하는 클래스 만들기
이번 예제의 메인이다.
XMLParsing 클래스를 만든 뒤, AsyncTask를 상속하도록 한다.
그 다음 onPreExecute(), doInBackground(), onPostExecute() 메서드를 재정의한다.
이 중 doInBackground() 내부에 XML 데이터를 읽고 ArrayList에 원하는 데이터를 넣는 코드를 작성하면 된다.
doInBackground() : 새로 만들어진 스레드에서 백그라운드 작업을 수행함
AsyncTask는 비동기 실행 작업을 위해 사용하는 클래스라고 한다.
설명이 잘 되어있는 블로그 글을 찾았으니 읽어보자.
안드로이드 AsyncTask. (Android AsyncTask)
1. 비동기 작업을 위한 AsyncTask. [안드로이드 프로그래밍. 스레드.]의 여러 글들을 통해, 안드로이드에서 스레드를 사용해야 하는 이유와 새로운 스레드를 실행하는 방법, 그리고 핸들러를 통한
recipes4dev.tistory.com
[Android] AsyncTask 사용하기
모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 기존에 사용했던 핸들러는 코드가 복잡함 && 코드가 순서없이 이곳저곳에서 실행되는 느낌 → 핸들러(Handler)를 사용하
junyoung-developer.tistory.com
package com.example.doitmission_20;
public class XMLParsing extends AsyncTask<Object, Object, ArrayList<RSS>> {
// News RSS 주소
private String rssURL; // = "https://www.mk.co.kr/rss/30000001/";
// 여기서 바로 RSS 주소 넣었다가,
// MainActivity에서 RSS 주소를 관리하고 싶어서 생성자 메서드를 만듦.
public XMLParsing(String s) {
this.rssURL = s;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected ArrayList<RSS> doInBackground(Object... objects) {
ArrayList<RSS> list = new ArrayList<RSS>();
try{
URL url = new URL(rssURL); // String 객체 -> URL 객체
String title="";
String description="";
// XmlParser로 RSS의 값들을 가져온다.
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
BufferedInputStream buf = new BufferedInputStream(url.openStream());
parser.setInput(buf, null);
String tag=""; // tag를 구분하기 위한 값. (ex. <title>, <item>, <discription>, <date>...)
boolean isItemTag = false; // <item> 태그를 구분하기 위한 값
// getEventType() : 문서 시작&끝, 태그 시작&끝, 태그의 내용을 표시하는 값을 반환
int parserEvent = parser.getEventType();
while(parserEvent!=XmlPullParser.END_DOCUMENT){ // 문서가 끝날 때까지 반복
switch(parserEvent){
// TAG 시작일 경우
case XmlPullParser.START_TAG:
tag = parser.getName();
if(tag.equals("item")){ // TAG가 <item>일 경우
isItemTag = true;
}
break;
// TAG 안의 문자열일 경우
case XmlPullParser.TEXT:
if(isItemTag){
//Log.d("TAG",tag);
if(tag.equals("title"))
title = parser.getText();
else if(tag.equals("description"))
description = parser.getText();
// 태그 확인 후 제목, 설명에 맞게 값을 넣어준다.
}
break;
// TAG 종료일 경우
case XmlPullParser.END_TAG:
tag = parser.getName();
if(tag.equals("item")){ // item 태그 종료 확인
list.add(new RSS(title, description));
title="";
description="";
isItemTag=false;
}
tag=""; //태그 값을 초기화하라는데 굳이 할 필요 있나? <- 주석처리 해놨더니 응.. 안되네
// while문 도는 동안 tag가 초기에 초기화 되는 걸로 착각했음.
break;
}
// next() : 다음 TAG로 이동
parserEvent = parser.next();
}
}catch(Exception e){
Log.d("RSS","RSS를 가져오는 동안 문제 발생 : "+e);
}
return list;
}
@Override
protected void onPostExecute(ArrayList<RSS> rsses) {
super.onPostExecute(rsses);
}
// RSS 의 내용을 읽어오는 메서드
public ArrayList<RSS> getData() {
ArrayList<RSS> list = new ArrayList<RSS>();
try {
list = execute().get(); /* execute().get 메서드는 비동기 테스크가 완료되기 전에 get() 메서드가
호출될 때, get() 메서드가 결과가 준비될 때까지 대기한 다음 호출되는
메서드입니다. <- 뭐요?*/
} catch (InterruptedException e) {
} catch (ExecutionException e) {}
return list;
}
}
[XmlParser]
// XmlParser로 RSS의 값들을 가져온다.
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
BufferedInputStream buf = new BufferedInputStream(url.openStream());
parser.setInput(buf, null);
getData 메서드는 뭔 말인지 잘 모르겠어서 일단 넘어간다.
5️⃣MainActivity
package com.example.doitmission_20;
public class MainActivity extends AppCompatActivity {
String url;
RequestQueue requestQueue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(layoutManager);
rssAdapter adapter = new rssAdapter();
recyclerView.setAdapter(adapter);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
url="https://www.mk.co.kr/rss/30000001/";
XMLParsing xp = new XMLParsing(url);
adapter.setItems(xp.getData());
adapter.notifyDataSetChanged(); // 리싸이클러뷰 갱신
}
});
}
}
끝. XML 데이터를 가져오는 방법을 알게되었다.
🏠참고한 블로그
도전과제 20 : RSS 조회 내용을 그리드뷰로 보여주기 (Do it Android 앱 프로그래밍) [JAVA]
도전과제 20 RSS 사이트를 조회하여 최신 기사를 받은 후 격자 모양으로 보여주는 기능을 만들어 보세요. rss 사이트는 연예, 경제 등 어떤 내용이든 상관없습니다. RSS 기사를 조회할 수 있는 화면
howtolivelikehuman.tistory.com
[Android] RSS 뉴스, XML 파싱하기
[Android] RSS 뉴스, XML 파싱하기 RSS는 업데이트가 빈번한 웹사이트의 정보를 사용자에게 보다 쉽게 제공하기 위하여 만들어진 XML 기반의 콘텐츠 배급 포맷을 말한다. DAUM 사이트의 뉴스 RSS 를 호출
junuda.tistory.com
DoitAndroid/DoitMission_20/app/src/main/java/org/techtown/doitmission_20/XMLParsing.java at master · howtolivelikehuman/DoitAnd
Do it Android programing (JAVA). Contribute to howtolivelikehuman/DoitAndroid development by creating an account on GitHub.
github.com
'TIL > 안드로이드 스튜디오' 카테고리의 다른 글
11장 - 헬퍼 클래스 : 스키마 업그레이드 (0) | 2025.02.09 |
---|---|
11장 - 단말에 데이터베이스와 테이블 만들기 (0) | 2025.02.08 |
도전!19 - 웹으로 가져온 데이터 보여주기 (0) | 2025.02.05 |
10장 - 오픈 API 정보 가져와서 리사이클러뷰로 보여주기 (0) | 2025.02.05 |
10장 - JSON 데이터 다루기 (Gson🐭) (0) | 2025.02.02 |