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"

[레이아웃 만들기]

activity_main.xml (왼) / rss_item (오)

 

 

 

 

 

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