IT recording...
[Android] 복잡한 부분은 AsyncTask 이용하여 클래스 따로 만들어서 하기 본문
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으로 전달해 줄 주소 값이 들어있다. (데이터 가져 올 주소 넘겨주는 역할) |
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<Shtm=B01012&pobtDiv=B04045&openSust=127114";
String sbjBase = "https://kupis.konkuk.ac.kr/sugang/acd/cour/aply/CourInwonInqTime.jsp?ltYy=2020<Shtm=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;
}
}
'Android' 카테고리의 다른 글
[안드로이드] AndroidStudio & Git연동 (git 터미널 사용법, gitHub 연동, gitLab연동, SSH) (0) | 2020.09.07 |
---|---|
[Android] missing constraints in constraintlayout 에러, 오류 (0) | 2020.08.16 |
[Android] 특정 요소만 테두리 주기,테두리 둥글게, 요소 스타일 각기 다르게 (0) | 2020.08.16 |
[Android] RecyclerView 사용하기 (0) | 2020.08.16 |
[Android] layout_weight 사용하여 정렬하기 (0) | 2020.08.16 |
Comments