검색어 : 안드로이드 thread return
안드로이드 thread handler
http://arabiannight.tistory.com/32
Thread에서 리턴값 받기
http://plaboratory.org/archives/108
안드로이드 3.0 (허니컴) 이상서 부터는 main thread에서는 직접 Http 요청을 하지 못하게 막아놓았다. 시스템이 죽는걸 방지하기 위해 부하가 많이 생기는 작업은 따로 thread를 생성하여 그 thread에서 작업을 해야한다.
새로운 thread를 생성해서 Http 요청을 하여 XML을 받아올려고 했는데, 막상 thread를 구현해 놓고 보니 thread 실행시 실제 동작하는 Thread의 run() method의 리턴 타입이 void다. 따로 오버라이딩도 할 수 없는지라.. thread가 작업을 하여 만들어낸 결과값을 별도로 받아오도록 해야했었다.
2 StringBuilder output = new Stringbuilder();
3
4 public CustomThread() {
5 output = new Stringbuilder();
6 }
7
8 public void run() {
9
10 try {
11 URL url = new URL(“http://www.URL.com”);
12 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
13 if(conn != null) {
14 conn.setConnectTimeout(10000);
15 conn.setRequestMethod(“GET”);
16 conn.setDoInput(true);
17 conn.setDoOutput(true);
18
19 int resCode = conn.getResponseCode();
20 if(resCode == HttpURLConnection.HTTP_OK) {
21 BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
22 String line = null;
23
24 while(true) {
25 line = reader.readLine();
26 if(line == null) {
27 break;
28 }
29
30 output.append(line + “\n”);
31 }
32
33 reader.close();
34 conn.disconnect();
35 }
36 }
37 } catch(Exception e) {
38 // do exception code
39 }
40 }
41 }
위의 코드가 thread안에서 Http 요청을 한 다음 결과를 받아 오는 코드인데, 요청을 한 후 한 줄 씩 읽어서 output이라는 StringBuilder 객체에 차곡차곡 쌓고있다. 문제는 이 output을 이 thread를 호출한 곳에서 쓸 수 있도록 리턴을 해줘야 한다.
차근차근 단계를 밟아가자.
1. 리턴할 값을 담을 변수를 thread 클래스에 선언한다.
여기서 ‘StringBuilder output’ 이 된다. 꼭 String이 아니더라도 원하는 타입을 선언한다.
2. getter 함수를 정의한다.
getter는 흔히 자바에서 캡슐화된 클래스 안의 특정 변수 값을 얻기 위해 사용하는 함수이다. 당연히 ‘특정 변수 값’ 즉, 얻어야 할 변수값이란 우리가 리턴을 받기 원하는 값이고, 그 값은 1번에서 선언한 변수에 담겨있다.
2 public void run() {
3 // skip implementation
4 }
5
6 public String getResult() {
7 return output.toString();
8 }
9 }
위와 같이 getter 함수를 만든다.
3. join()을 통하여 thread가 끝날 때를 기다린다.
main thread에서는 http요청을 한 thread를 실행하고 ( thread 이름.start(); ) ‘ join() ‘ method를 실행해야 한다. join() method는 실행한 child thread가 끝날 때까지 (여기서는 Http 요청을 하는 thread) main thread로 하여금 기다리게 하는 것이다.
2 public void main(String args[]) {
3 String reuslt;
4
5 CustomThread thread = new CustomThread();
6 thread.start();
7
8 try {
9 thread.join();
10 } catch(Exception e) {
11 e.printStackTrace();
12 }
13
14 result = thread.getResult();
15 Log.d(“log”, “get value from thread : “ + result);
16 }
17 }
4. 마지막으로 getter 함수를 호출하여 리턴값을 받는다.
아까 thread에서 만들었던 getter를 호출하여 리턴값을 받으면 끝!
쉽게 생각해서 main thread에서 child thread가 작업을 할 때까지 기다린 다음, 결과값을 클래스 변수에 접근할 수 있는 getter를 통하여 받는 다는 것인데, 만약 join() 을 하지 않는다면 main thread에서는 child thread의 작업 종료 여부와는 상관 없이 일단 getter를 호출하는 경우도 생기므로 join() 을 반드시 해주어야 한다.
JAVA] thread 처리후, 결과값을 호출하는 함수에서 가져오기 (?)
'차근차근 > Android' 카테고리의 다른 글
갤러리 이미지 안보임 (0) | 2015.01.23 |
---|---|
위치 정보 - LocationManager (0) | 2015.01.14 |
하이브리드앱 프로젝트 이야기 첫번째 - Webview 이용하기 (0) | 2015.01.13 |
하이브리드 앱 gps연동 (0) | 2015.01.08 |
안드로이드 gps 상태 체크 (0) | 2015.01.08 |