비동기 -> Async
동기 -> Sync
동기 방식
- 작업을 순서대로 진행한다
- A -> B -> C -> D
- 위에서부터 아래로 실행
비동기 방식
- 쓰레드를 만들어서 작업을 따로 처리한다
결과를 받는다
---------------------------------------------->
| | | | ||
-------------
작업
안드로이드에서 Async 다루는 방법
- AsyncTask상속받는다
-> onPreExcute : 쓰레드 출발하기전에 할 작업
-> doIntBackground : 쓰레드가 할 작업
-> onPregressUpdate : 중간중간에 MainThread로 온다
-> onPostExcute : 작업을 다 마친후 MainThread
Async의 장점
- Main Thread를 기다리게 할 필요가 없다
- 네트워크 작업
Async의 단점
- 재사용이 불가능 하다
- 구현된 Activity가 종료될경우 따라서 종료 되지 않는다
- AsyncTask는 하나만 실행될수 있다(병렬처리가 안된다)
- AsyncTask를 상속받는 BackgroundAsyncTask 클래스 생성
class BackgroundAsyncTask(
val progressBar: ProgressBar,
var progressText: TextView,
) : AsyncTask<Int, Int, Int>() {
// params -> doInBackground 에서 사용할 타입
// progress -> onProgressUpdate 에서 사용할 타입
// result -> onPostExecute 에서 사용할 타입
var percent: Int = 0
override fun onPreExecute() {
percent = 0
progressBar.setProgress(percent)
}
override fun doInBackground(vararg params: Int?): Int {
while (isCancelled == false) {
percent++
Log.d("async", "percent : " + percent)
if (percent > 100) {
break
} else {
// 여기서 숫자가 변하면 아래 onProgressUpdate() 인자에 들어감
publishProgress(percent)
}
try {
Thread.sleep(100)
} catch (e: Exception) {
e.printStackTrace()
}
}
return percent
}
override fun onProgressUpdate(vararg values: Int?) {
progressBar.setProgress(values[0] ?: 0)
progressText.setText("퍼센트 : " + values[0])
super.onProgressUpdate(*values)
}
override fun onPostExecute(result: Int?) {
progressText.setText("작업이 완료되었습니다.")
}
// 취소가 되었을 때
override fun onCancelled() {
progressBar.setProgress(0)
progressText.setText("작업이 취소되었습니다.")
}
}
- 메인 클래스
class AsyncActivity : AppCompatActivity() {
var task: BackgroundAsyncTask? = null
var task1: BackgroundAsyncTask? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_async)
start.setOnClickListener {
task = BackgroundAsyncTask(progressbar, ment)
task1 = BackgroundAsyncTask(progressbar, ment)
task?.execute()
task1?.execute()
}
stop.setOnClickListener {
// task?.cancel(true)
startActivity(Intent(this, Intent2::class.java)) // 엑티비티를 옮겨도 종료되지 않음
}
}
override fun onPause() {
task?.cancel(true)
super.onPause()
}
}
Realm(내장 DB) (0) | 2020.11.23 |
---|---|
Network (0) | 2020.11.23 |
Database(SharedPreference) (0) | 2020.11.20 |
Tablayout, pager(2) (0) | 2020.11.19 |
TabLayout, Pager (0) | 2020.11.19 |
댓글 영역