AsyncTask 객체는 abstact로 선언되었다 따라서 사용을 위해서는 extends를통해 상속을 받아서 사용하여야 한다
@Override
protected void onPreExecute() {
super.onPreExecute();
}
첫번째 메서드다. 해당 메서드는 이름에서 볼 수 있드시, background스레드를 실행하기전 준비 단계이다.
변수의 초기화나, 네트워크 통신전 셋팅해야할 것들을 위의 메서드 공간에 작성한다.
@Override
protected String doInBackground(String... params) {
return result;
}
두번째 메서드다. 해당 메서드가 background 스레드로 일처리를 해주는 곳이다.
보통 네트워크, 병행 일처리등을 위 메서드 공간에 작성한다.
중요한건 마찬가지로 스레드 이므로 UI스레드가 어떤 일을 하고 있는지 상관없이
별개의 일을 진행한다는 점이다. 따라서 AysncTask는 비동기적으로 작동한다.
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
세번째 메서드는 doInBackground 메서드에서 중간중간에 UI스레드 에게 일처리를 맡겨야 하는 상황일때
쓴다. 매개변수로 Void를 받으므로, doInBackground안에 실제인자가 없이,
publishProgress( ) 메서드를 호출하면 BackgroundThread 중간에 mainThread에게 일을 시킬 수 있다.
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
마지막 메서드다. background Thread가 일을 끝마치고 리턴값으로 result를 넘겨준다.
그 값을 지금 보고 있는 해당 메서드가 매개변수로 받은후 받은 데이터를 토데로
UI스레드에 일처리를 시킬때 쓰는 메서드이다.
보통 UI변경 ( ex) textview.setText("~~") )할때 많이 사용된다. 왜냐면
위에서도 말했다시피 UI변경은 메인스레드가 아닌 다른 스레드에서의 변경은 막았기 때문이다.
위에서 만든 AysncTask를 사용 하는방법은 아래와 같이 하면된다.
MommooAsyncTask asyncTask = new MommooAsyncTask();
asyncTask.execute();
출처: https://mommoo.tistory.com/29 [개발자로 홀로 서기]
현재 ArrayList를 보면 <>안에 String, List에는 <>안에 int형을 나타내는 Integer가 들어가 있다.
이 <>를 제네릭(Generics)이라 하는데, 이 <>안에 어떠한 타입을 선언해주어 해당 ArrayList, List 등이 사용할 객체의 타입을 지정해준다는 뜻이다. 이는 다룰 객체의 타입을 미리 명시하여 객체의 형변환을 사용할 필요없게 하며, 내가 사용하고 싶은 데이터 타입만 사용할 수 있게 해주는 효과가 있습니다.
import java.util.ArrayList;
import java.util.List;
public class Generics {
public static void main(String[] args) {
ArrayList<String> arrList = new ArrayList<String>();
arrList.add("박지성");
arrList.add("손흥민");
arrList.add("기성용");
for(int i=0; i<arrList.size(); i++){
System.out.println("arrList : " + arrList.get(i));
}
List<Integer> list = new ArrayList<Integer>();
list.add(123);
list.add(456);
list.add(789);
for(int i=0; i<list.size(); i++){
System.out.println("list : " + list.get(i));
}
}
}
Colored by Color Scripter
cs
위의 예시를 보면,
ArrayList는 String으로 선언해주어, ArrayList는 String 객체만 다루게 되며,
List는 Integer로 선언해주어, List는 int형 객체만 다루게 됩니다.
출처: https://gangnam-americano.tistory.com/47
Context context; // perrmission을 체크하기 위해 선언
PermissionListener permissionlistener = new PermissionListener() {
@Override
public void onPermissionGranted() {
initView();
}
@Override
public void onPermissionDenied(ArrayList<String> deniedPermissions) {
Toast.makeText(MainActivity.this, "권한 허용을 하지 않으면 서비스를 이용할 수 없습니다.", Toast.LENGTH_SHORT).show();
}
};
initView함수의 경우 textView를 Mainactivity의 텍스트뷰를 각각 연결시켜주고
path에(path2는 실질적으로 사용x)에 안산의 네이버날씨 주소를 저장해놓고
getData()함수와 execute함수를 통해 데이터를 알맞게 크롤링한후 setText해준다.
public final boolean execute(
java.lang.String sql,
int[] columnIndexes)
매개 변수
SQL 문이 포함된 문자열입니다.
자동 생성 키의 열 인덱스를 사용할 수 있도록 해야 하는지 여부를 나타내는 int의 배열입니다.
반환 값
첫 번째 결과가 결과 집합이면 true이고, 그렇지 않으면 false입니다.
private class getData1 extends AsyncTask<String, Void, String> {
// String 으로 값을 전달받은 값을 처리하고, Boolean 으로 doInBackground 결과를 넘겨준다.
@Override
protected String doInBackground(String... params) {
try {
Document document = Jsoup.connect(params[0].toString()).get();
Elements elements = document.select(".weather"); // 내용중에서 원하는 부분을 가져온다.
String[] str = elements.text().split(" ");
Document document1 = Jsoup.connect(params[0].toString()).get();
Elements elements1 = document.select(".current"); // 내용중에서 원하는 부분을 가져온다.
String[] str1 = elements1.text().split(" ");
Document document2 = Jsoup.connect(params[0].toString()).get();
Elements elements2 = document.select(".value"); // 내용중에서 원하는 부분을 가져온다.
String[] str2 = elements2.text().split(" ");
String text = "\n날씨 : "+str[0] + "\n온도 : " + str1[1] + "\n미세먼지 : " + str2[0];
return text;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
textView1.setText("<안산> "+result);
}
}
백그라운드 실행을위해 public class extends AsyncTash<String, void, String> { } 선언을 하였고
백그라운드에서 실행되는함수 doIngBackground()함수를 통해 크롤링을 진행해준다.
그리고 결과값을 반환해주는(setText 해주는) onPostExecute()함수
private void NotConnected_showAlert() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("네트워크 연결 오류");
builder.setMessage("사용 가능한 무선네트워크가 없습니다.\n" + "먼저 무선네트워크 연결상태를 확인해 주세요.")
.setCancelable(false)
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish(); // exit
//application 프로세스를 강제 종료
android.os.Process.killProcess(android.os.Process.myPid());
}
});
AlertDialog alert = builder.create();
alert.show();
}
import urllib.request
from bs4 import BeautifulSoup
import json
from urllib import parse
from collections import OrderedDict
from datetime import datetime