차근차근/Android

안드로이드 thread

예쁜꽃이피었으면 2015. 1. 13. 17:55


검색어 : 안드로이드 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가 작업을 하여 만들어낸 결과값을 별도로 받아오도록 해야했었다.

 

  1 public class CustomThread extends 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번에서 선언한 변수에 담겨있다.

  1 public class CustomThread extends Thread {
  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로 하여금 기다리게 하는 것이다.

  1 public class Foo {
  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 처리후, 결과값을 호출하는 함수에서 가져오기 (?)

http://imdsoho.tistory.com/68

반응형