Async
2021. 5. 30. 23:11
Async ๋ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก
thread๋ฅผ ๋ง๋ค์ด์ ์์ ์ ๋ฐ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
Async ์ฅ์
Main Thread๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ํ์๊ฐ ์๋ค.
๋คํธ์ํฌ ์์ ์ ์ ์ฉํ๋ค.
Async ๋จ์
์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๊ตฌํ๋ activity๊ฐ ์ข ๋ฃ๋ ๊ฒฝ์ฐ ๋ฐ๋ผ์ ์ข ๋ฃ๋์ง ์๋๋ค.
AsyncTask๋ ํ๋๋ง ์คํ๋ ์ ์๋ค. (๋ณ๋ ฌ์ฒ๋ฆฌ ๋ถ๊ฐ)
์๋๋ก์ด๋์์ Async ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
AsyncTask๋ฅผ ์์ ๋ฐ๋๋ค
- onPreExcute : thread ์ถ๋ฐํ๊ธฐ ์ ํ ์์
- doInBackground : thread๊ฐ ํ ์์
- onProgressUpdate : ์ค๊ฐ์ค๊ฐ์ MainThread๋ก ๋ณด๊ณ
- onPostExcute : ์์ ์ ๋ค ๋ง์น ํ MainThread๋ก ๋ณต๊ท
Layout ๊ตฌํ
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AsyncActivity"
android:orientation="vertical">
<TextView
android:id="@+id/ment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AsyncTask"
android:textSize="40dp"/>
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/progrssbar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:max="100"/>
<Button
android:id="@+id/start"
android:layout_marginTop="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="์์"/>
<Button
android:id="@+id/stop"
android:layout_marginTop="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="์ทจ์"/>
</LinearLayout>
Activity ๊ตฌํ
package com.example.prac_android
import android.os.AsyncTask
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.widget.ProgressBar
import android.widget.TextView
import com.example.prac_android.databinding.ActivityAsyncBinding
import java.lang.Exception
class AsyncActivity : AppCompatActivity() {
private lateinit var binding: ActivityAsyncBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityAsyncBinding.inflate(layoutInflater)
setContentView(binding.root)
var task : BackgroundAsyncTask? = null
binding.start.setOnClickListener {
task = BackgroundAsyncTask(binding.progrssbar, binding.ment)
task?.execute()
}
binding.stop.setOnClickListener{
task?.cancel(true)
}
}
}
class BackgroundAsyncTask(
val progressbar : ProgressBar,
val progressText : TextView
) : AsyncTask<Int, Int, Int>(){
//params : doInBackground ์์ ์ฌ์ฉํ ํ์
๊ฒฐ์
//progress : onProgressUpdate ์์ ์ฌ์ฉํ ํ์
๊ฒฐ์
//result : onPostExecute ์์ ์ฌ์ฉํ ํ์
๊ฒฐ์
var percent:Int = 0
//์คํํ๊ธฐ ์ง์ ์
override fun onPreExecute() {
percent = 0
progressbar.progress = percent
}
override fun doInBackground(vararg params: Int?): Int {
while (!isCancelled){
percent++
if(percent > 100){
break
} else {
publishProgress(percent)
}
//๊ณผ์ ์ ์ ๋ณด๊ธฐ ์ํด ์๊ฐ ์ง์ฐ
try {
Thread.sleep(100)
}catch (e: Exception){
e.printStackTrace()
}
}
return percent
}
override fun onProgressUpdate(vararg values: Int?) {
progressbar.progress = values[0] ?: 0
progressText.text = "ํผ์ผํธ : " + values[0]
super.onProgressUpdate(*values)
}
// doInBackground๊ฐ ๋๋ฌ์ ๋ returnํ ํ์
์ด ๋ค์ด์ด
override fun onPostExecute(result: Int?) {
progressText.text = "์์
์ด ์๋ฃ๋์์ต๋๋ค."
}
//์ทจ์๋ฒํผ์ ๋๋ ์ ๋
override fun onCancelled() {
progressbar.progress = 0
progressText.text = "์์
์ด ์ทจ์๋์์ต๋๋ค."
}
}
728x90
'๐ป๊ฐ๋ฐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ธฐ๋ณธ ์ด๋ฏธ์ง ์ถ๊ฐํ๊ธฐ (0) | 2021.06.04 |
---|---|
Retrofit2 ์ฌ์ฉํ๊ธฐ (0) | 2021.05.31 |
TabLayout๊ณผ Pager (0) | 2021.05.29 |
๋ฆฌ์คํธ๋ทฐ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ3 : RecyclerView (0) | 2021.05.28 |
๋ฆฌ์คํธ๋ทฐ ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ2 : ListView (0) | 2021.05.28 |