IT recording...

[Android] 복잡한 부분은 AsyncTask 이용하여 클래스 따로 만들어서 하기 본문

Android

[Android] 복잡한 부분은 AsyncTask 이용하여 클래스 따로 만들어서 하기

I-one 2020. 8. 16. 13:55

main thread가 진행하는데 방해될 만큼 복잡한 과정은 extends AsyncTask 를 이용하여

새로운 클래스를 따로 만들어서 돌려야 한다. 

 

background에서 돌려서 메인쓰레드에 방해 안되게 하는 것 같다.

 

나의 경우는 웹 사이트에서 data들을 파싱 받아올 때 mainActivity에 했더니 (복잡한 작업)

오류가 나서 이를 통해 해결했다. 

 

public class parseData extends AsyncTask <String,Void, ArrayList<classData>>

첫번째 인자 : 넘겨 줄 인자

세번째 인자 : return 할 인자

나는 String 값을 받아와서 그것을 이용해 파씽한 후 classData라는 클래스들의 리스트를 리턴하기 위해 위와 같이 사용했다.

 

extends AsyncTask 쓰면 doInBackground를 자동으로 넣으라고 안드로이드가 알려준다. 

처음에 ... 생긴 것 때문에 혼란스러웠는데 그냥 배열 느낌이라고 생각하면 된다

protected ArrayList<classData> doInBackground(String... strings)

초록색부분이 ... 이렇게 생긴 이유는 String 값들을 여러 개 받아올 수 있기 때문이다. 

안에서 사용할 때는 strings[0] strings[1] 와 같은 방식으로 파라미터를 받아 온다.

 

MainActivity 등 액티비티에서 사용하려면 아래와 같이 사용하면 된다. 

(자료형 참고) private ArrayList<classData> classDataset;
classDataset 
= new parseData().execute(url,"body").get();

urld은 String으로 전달해 줄 주소 값이 들어있다. (데이터 가져 올 주소 넘겨주는 역할)
"body"는 여러 개 전달 되는지 그냥 아무 string이나 넣은 것

 

 

package com.example.tutorial1;

import android.os.AsyncTask;
import android.util.Log;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class parseData extends AsyncTask <String,Void, ArrayList<classData>>{

    private ArrayList<classData> classDataset;
    private classData classes;
    protected ArrayList<classData> doInBackground(String... strings) {

        String h = "https://kupis.konkuk.ac.kr/sugang/acd/cour/time/SeoulTimetableInfo.jsp?ltYy=2020&ltShtm=B01012&pobtDiv=B04045&openSust=127114";
        String sbjBase = "https://kupis.konkuk.ac.kr/sugang/acd/cour/aply/CourInwonInqTime.jsp?ltYy=2020&ltShtm=B01012&sbjtId=";


        Elements document = null;
        try { //strings[0] : 전달받은주소
            document = Jsoup.connect(strings[0]).get().select(".table_bg_white");
        } catch (IOException e) {
            e.printStackTrace();
        }

        Element element;
        classDataset = new ArrayList<>();
        for(int i=0;i<document.size();i++){
            element = document.get(i);
            //Log.d("element",i+" "+element.select("td").eq(8).text());

            //남은 인원, 전체 인원 가져오기
            String classNum = element.select("td").eq(3).text();
            String url = sbjBase+classNum;
            Elements document2 = null;
            try {
                document2 = Jsoup.connect(url).get().select("body");
            } catch (IOException e) {
                e.printStackTrace();
            }

            Element element2;
            element2 = document2.get(0);
            /*Log.d("남은인원",element2.select("td").eq(3).text());
            Log.d("현재인원",element2.select("td").eq(5).text());*/

            //3 : 과목번호, 4 : 과목이름, 8 : 시간, 9 : 교수님 || 현재 신청 인원, 전체인원
            classes = new classData(element.select("td").eq(3).text(),element.select("td").eq(4).text(),
                    element.select("td").eq(9).text(),element.select("td").eq(8).text(),
                    element2.select("td").eq(3).text(),element2.select("td").eq(5).text());

            classDataset.add(classes);
            //tmp[i] = element.select("td").eq(3).text();

        }
        classDataset.remove(0);
        return classDataset;
    }
}
Comments