본문 바로가기
KUIT-앱 개발 프로젝트 동아리

7주차 실습(2)-코루틴(coroutine)

by 농농씨 2023. 11. 10.

1주차 실습파일에서

이부분을 주석처리해주고 시작하자

// var myStringDatabase : MyStringDatabase? = null // 데이터베이스 객체 만듦

이부분도!

 

 

그러면 room db를 추가하기 전이고 dataList도 빈 ArrayList상태라서 출력해보면 아무것도 안나온다.

 

 

이번 실습에서는 coroutine으로 다른 스레드에서 데이터를 추가하고 다시 메인 스레드로 와서 ui를 그리는 작업을 해볼 것이다.

코루틴을 쓰려면 먼저 scope를 선언해야 한다.

GlobalScope도 있고 MainScope도 있지만 여기서는 새로 만들 것이다.

 

1. 스코프 선언

CoroutineScope(Dispatchers.IO).launch{ }

스코프를 통해 넘겨줄 것은 '어느 스레드에서 실행할 것이냐'에 대한 정보이고 

Dispatchers라는 object 안에 이미 다 정의되어 있으므로 골라서 쓰면 된다.

데이터를 추가할 것이므로 IO 역할을 하는 스레드에서 실행해볼것이다.

.launch는 코루틴을 만들어서 실행하겠다는 뜻이다.

실행되는 코루틴이 무슨 작업을 할지 중괄호 안에 명시하면 된다.

(람다식, 함수의 마지막에 들어가는 인자가 함수면 중괄호로 뺄 수 있다.(복습))

 

2. 코루틴 내용 선언

일단 무한반복으로1초(1000 milisecond)마다 데이터 "item" 추가되도록 함

while(true) {
    delay(1000)
    dataList.add(MyStringEntity("item")
}

 

여기까지가 IO 스레드에서 코루틴이 실행되도록 한 것임

 

그럼 데이터를 추가했으니 그걸 ui로 그려내는 걸 해보자.

 

3. ui그리기

3-1. 스레드 이동

IO스레드에서 메인스레드로 이동

while(true) {
    ...
    withContext(Dispatchers.Main) {
        binding.rvHome.adapter.notifyDataSetChanged()
    }
   
}

이동한 다음 이동한 스레드의 바인딩의 아이템의 어댑터!에

notifyDataSetChanged()라는 함수를 실행시켜준다.

데이터 변했으니 ui를 다시 그리란 뜻이다.

 

숫자도 한번 넣어주자

var count = 0

그리고 출력되는 문자에 그 변수를 넣어주자

dataList.add(MyStringEntity("item" + count++))

// MainActivity 전체코드

package com.iyr.a7thweekpractice

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager
import com.iyr.a7thweekpractice.databinding.ActivityMainBinding
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class MainActivity : AppCompatActivity() {
    lateinit var binding : ActivityMainBinding

    var dataList1 = ArrayList<MyStringEntity>() // 초기화 해야함
//    var dataList2 : ArrayList<String> = arrayListOf() // null로 선언
//    var myStringDatabase : MyStringDatabase? = null // 데이터베이스 객체 만듦
    var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

//        myStringDatabase = MyStringDatabase.getInstance(this)
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item0"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item1"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item2"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item3"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item4"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item5"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item6"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item7"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item8"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item9"))
//        myStringDatabase!!.getMyStringDAO().addMyString(MyStringEntity("item10"))
//
//        dataList1.addAll(myStringDatabase!!.getMyStringDAO().getAllMyStrings())


        CoroutineScope(Dispatchers.IO).launch {
            while (true) {
                delay(1000)
                dataList1.add(MyStringEntity("item" + count++))

                withContext(Dispatchers.Main) {
                    binding.rvHome.adapter!!.notifyDataSetChanged()
                }
                Log.d("coroutineScope", "코루틴작동")
            }
        }

        binding.rvHome.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        binding.rvHome.adapter = JustAdapter(dataList1)

    }
}

 

아이템이 계속 추가되는 걸 알수있다.

'KUIT-앱 개발 프로젝트 동아리' 카테고리의 다른 글

5주차 복습 메모  (1) 2023.11.14
7주차실습(3)-room db&코루틴 응용  (0) 2023.11.10
7주차 실습(1)-roomDB  (0) 2023.11.10
6주차 실습-Thread  (1) 2023.10.31
6주차 이론-Thread  (0) 2023.10.30