반응형
UI Thread 가 아닌 Background Thread 에서 작업하기 위해서 ThreadExecutor 를 생성
백그라운드 스레드를 사용하는 이유는 메인(UI) 스레드에서 긴 작업을 수행하면 앱이 응답하지 않거나 끊어지는 문제를 피하기 위해서입니다
class HttpActivity : AppCompatActivity() {
val executor: ExecutorService = Executors.newSingleThreadExecutor()
}
버튼 클릭하면 실행 하도록, onCreate 안에 click event 작성
binding.httpSendButton.setOnClickListener {
executor.execute{
val url = binding.httpUrlEditText.text.toString()
request(url)
}
}
Executor
- SingleThreadExecutor: 하나의 스레드에서 작업을 처리하는 Executor입니다. 순차적으로 작업을 처리하며, 작업이 순차적으로 실행되어야 하는 경우에 유용합니다.
- FixedThreadPool: 고정된 개수의 스레드 풀을 생성하고 작업을 분배합니다. 병렬로 일정한 수의 작업을 처리하고자 할 때 유용합니다.
- CachedThreadPool: 필요한 만큼의 스레드를 동적으로 생성하고 관리하는 Executor입니다. 스레드 풀 크기를 제한하지 않아 대규모 작업에 유용합니다.
- ScheduledThreadPool: 작업을 지정된 시간에 실행하거나 주기적으로 실행하는 Executor입니다. 일정한 주기로 작업을 실행하고 싶을 때 유용합니다.
- MainThreadExecutor: Android의 UI 스레드에서 작업을 처리하는 Executor입니다. 주로 UI 업데이트와 관련된 작업을 처리할 때 사용합니다.
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import java.util.concurrent.Executors
import java.util.concurrent.ScheduledExecutorService
import java.util.concurrent.TimeUnit
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val singleExecutor = Executors.newSingleThreadExecutor()
val fixedExecutor = Executors.newFixedThreadPool(3)
val cachedExecutor = Executors.newCachedThreadPool()
val scheduledExecutor: ScheduledExecutorService = Executors.newScheduledThreadPool(1)
// SingleThreadExecutor 예제
singleExecutor.execute {
for (i in 1..5) {
println("SingleThreadExecutor: $i")
Thread.sleep(1000)
}
}
// FixedThreadPool 예제
for (i in 1..3) {
fixedExecutor.execute {
for (j in 1..5) {
println("FixedThreadPool-$i: $j")
Thread.sleep(1000)
}
}
}
// CachedThreadPool 예제
for (i in 1..5) {
cachedExecutor.execute {
println("CachedThreadPool-$i")
Thread.sleep(1000)
}
}
// ScheduledThreadPool 예제
scheduledExecutor.scheduleAtFixedRate({
println("ScheduledThreadPool: ${System.currentTimeMillis()}")
}, 0, 1, TimeUnit.SECONDS)
}
}
Thread
Executor 를 사용하지 않고 Thread 를 사용할 수 도 있습니다.
binding.httpSendButton.setOnClickListener {
Thread {
val url = binding.httpUrlEditText.text.toString()
request(url)
}.start()
}
[참고] UI Thread 가 아닌 Thread 안에서 UI 에 접근할때는 runOnUiThread 를 사용해야 합니다.
runOnUiThread {
binding.httpResultTextView.setText(content)
}
728x90
반응형
'Android' 카테고리의 다른 글
[Kotlin] 코틀린 Room Database 사용하기. CRUD (0) | 2023.08.24 |
---|---|
[Kotlin] 코틀린 안드로이드 ROOM (database) 사용해보기 (0) | 2023.08.24 |
[Kotlin] RecyclerView 사용하기 (0) | 2023.08.17 |
[Kotlin] SQLite 에서 statement ? parameter 사용하기 (0) | 2023.08.16 |
[Android]Kotlin - WebView 사용하기 (0) | 2023.08.16 |
댓글