본문 바로가기

Language/RxJava

[RxJava] 6장. 안드로이드의 RxJava 활용 3 - Thread

728x90

안드로이드는 기본적으로 싱글 스레드 모델.

따라서 처리하는 데 오래 걸리는 작업의 경우 별도 스레드로 분리하여 작업해야 한다.

 

뷰와 뷰 그룹의 스레드 관리

  • 안드로이드의 뷰나 뷰 그룹은 UI 스레드(메인 스레드)에서만 업데이트할 수 있게 되어있다.
  • 여러 스레드에서 동시에 UI를 업데이트할 때 발생할 수 있는 동기화 문제를 예방하기 위함.
  • LooperHandler 클래스를 통해 일반 스레드에서 작업한 결과를 뷰에 업데이트 할 수 있다.

*

Looper와 Handler 클래스를 사용한 UI스레드 업데이트.

  1. Handler 객체가 스레드를 생성.
  2. 스레드는 Handler를 이용해 Message를 Messgae Queue에 넣음.
  3. UI스레드는 Looper 클래스를 이용해 Message Queue에 접근.
  4. Message를 꺼내어 UI스레드에서 사용.

AsyncTask 클래스

안드로이드에서 제공하는 추상 클래스로 안드로이드에서 사용하는 대표적인 스레드 중 하나.

별도의 Handler 클래스나 스레드 사용 없이 UI 스레드에서 백그라운드 작업을 수행하겨 결과를 바로 뷰 화면에 업데이트 할 수 있다.

 

...

MyAsyncTask.execute("Sample", "Test");

public class MyAsyncTask extends AsyncTasK<String, Void, String> {
	@Override
	String doInBackgorund(String... params) {

		...

	}
    
    
	@Override
	void onPostExecute(String result) {
    
		...

	}
}

 

execute 메서드를 호출하면, MyAsyncTask 클래스의 doInBackground()를 호출하여 execute 메서드의 인자들을 전달한다.

onPostExecute()을 통해 doInBackground 마지막에 return된 결과를 사용하여 화면을 갱신하는 등 작업을 수행할 수 있다.

 

*

AsyncTask 클래스는 UI 스레드가 아닌 싱글 워커 스레드에서 동작하며, doInBackground 내부에서 publishProgress() 를 이용하여 실행 중간중간에 화면을 바로 갱신할 수 있다.

AsyncTask 단점

  1. 오직 한 번만 실행되며, 재사용이 불가능하다.
  2. 액티비티 종료를 명시해야만 종료되므로 메모리 누수 발생의 위험이 있다.
  3. AsyncTask 클래스는 항상 UI 스레드 위에서 불러와야 한다.

 

RxAndroid를 이용하여 TimerTask 대체하기.

Timer 클래스나 Handler 클래스를 이용하여 주기적으로 실행하는 동작을 구현한다.

Timer 클래스는 schedule() 메서드를 이용하여 지연 시간을 설정하거나 특정 시간에 동작, 반복 실행을 구현할 수 있다.

Handler 클래스는 postDelayed() 메서드를 이용하여 지연 시간 설정이나 반복 실행을 구현할 수 있다.

 

따라서, RxAndroid에서 반복 실행에 사용되는

  1. interval() 함수
  2. repeatWhen() 과 delay() 함수

를 사용해 대체가 가능하다.

 

 

*

RxAndroid에서 추가되는 스케줄러 함수는 두가지다.

  • mainThread() : 스케줄러 내부에서 직접 MainLooper에 바인딩 한다.
  • from() : 개발자가 임의의 Looper 객체를 설정할 수 있다.

AndroidSchedulers.mainThread()AndroidSchedulers.form(Looper.getMainLooper())와 동일하다.

 

*

스레드 사이에서 통신하기 위해서는 Handler 클래스가 필요.

RxAndroid에서도 Handler 클래스를 이용하여 스레드와 통신하며, UI 스레드와 통신을 위해 MainLooper를 이용하여 스레드 안에 Handler를 생성

 

 

Volley 라이브러리

구글 IO 2013에서 공개한 안드로이드용 라이브러리.

용량이 작고 빠른 실행속도가 장점.

 

Volley 사용 방법

  1. RequestQueue 생성
  2. Request Object 생성
  3. Request Object를 RequsetQueue에 추가
  4. 설정한 Callback으로 응답 수신

*

Observable 에서 제공하는 비동기 함수인 defer, fromCallable, fromFuture 함수를 사용하여 Volley의 RequestFuture 객체를 처리한다.

728x90