android | February 13, 2022
이 main thread에서 long-running operations를 호출하면 앱이 정지하거나 응답하지 않을 수 있다.
만약 network request를 main thread에서 처리한다면, network response를 받을 때까지 UI가 멈춘다.
ExecutorService
interface가 사용된다.ExecutorService
는 android application component의 Service와는 아무 관련이 없다.)Threads를 생성하는 것은 expensive 하므로, thread pool은 app이 initialize될 때 딱 한 번만 생성해야 한다.
// background tasks에서 사용할 threads 4개의 thread pool 생성
public class MyApplication extends Application {
ExecutorService executorService = Executors.newFixedThreadPool(4);
}
Looper
에 바인딩 된다.prepare()
를 호출한 다음, loop가 stop 할 때까지 message를 처리하도록 loop()
를 호출한다.Handler
class를 통해 이루어진다.Looper에는 main thread의 Looper를 검색하는 getMainLooper()
helper function이 있다.
이 Looper를 사용하여 Handler를 생성함으로써, main thread에서 코드를 실행할 수 있다.
꽤 자주 사용할 수 있으므로, 위에서 선언한 ExecutorService
와 동일한 위치에 Handler의 instance를 저장할 수도 있다.
public class MyApplication extends Application {
ExecutorService executorService = Executors.newFixedThreadPool(4);
Handler mainThreadHandler = HandlerCompat.createAsync(Looper.getMainLooper());
}
MessageQueue
가 있다.Handler
는 background로 수행되어야 할 task를 UI threads에서 분리해서 MessageQueue
에 넣는다.Looper
는 이 MessageQueue
를 계속 반복해서 돌면서, 현재 실행되어야 하는 message를 찾는다.Looper
가 실행되어야 하는 message를 Handler
에게 보내면, Handler
는 그 작업을 처리한다.