Deperecated/Android_강의

안드로이드 - 쓰레드

누알라리 2020. 2. 14. 17:07
1. 안드로이드 쓰레드

- 쓰레드는 여러 처리를 비 동기적으로 처리하기 위해 사용한다.

- 안드로이드는 비 동기적 처리 외에 네트워크에 관련된 코드는 전부 쓰레드로 운영해야 한다.

 

*동기적 작업
- 위에서 아래로 순차적으로 코드가 실행되며 작업하는 것.

*비동기 작업
- 여러개를 왔다갔다왔다갔다 하면서 마치 동시에 실행되는 것처럼 작업하는 것.

 

2. ANR 현상(응답 없음)

- 안드로이드 OS는 Activity의 코드를 처리하기 위해 쓰레드를 발생시킨다. 여기서 발생되는 쓰레드를 Main Thread라고 부르며, UI Thread(메인쓰레드에서만 화면 처리가 가능하기 때문에)라고 부르기도 한다.

- Main Thread가 현재 작업을 하지 않을 때만 화면 작업이 가능하며 Main Thread가 바쁠 때 화면 작업이나 터치가 발생하면 ANR(Application Not Respond)가 발생한다.

 

3. 화면 처리

- 안드로이드 오레오(8.0) 이하에서는 안드로이드는 개발자가 발생 시킨 쓰레드에서 화면에 대한 처리를 하면 오류가 발생한다. 따라서 이하 버전에서는 쓰레드 운영에 대한 처리를 학습해야 한다.

- 오레오부터는 메인쓰레드가 처리하도록 넘겨버린다.

 

4. 쓰레드 클래스를 생성하고 start(), stop()시키는 예시
class MainActivity : AppCompatActivity() {

    var isRunning = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener { view ->
            var now = System.currentTimeMillis()
            textView.text = "버튼클릭 : ${now}"
        }

        // 1. Activity에 있는 코드가 굉장히 바쁘면 화면 처리가 안될 수 있다.
        // ANR 유발 코드.
        /*
        while(true)
        {
            var now = System.currentTimeMillis()
            textView2.text = "무한 루프 : ${now}"
        }
        */

        // 3. 액티비티가 종료되면 안드로이드os가 굴리는 메인쓰레드만 종료되며,
        // 내가 만든 쓰레드는 계속 이어진다.

        isRunning = true
        var thread = ThreadClass1()
        thread.start()
    }

    // 2. 쓰레드 클래스 생성
    inner class ThreadClass1 : Thread()
    {
        override fun run() {
            while(isRunning)
            {
                // 100ms만큼 이 부분에서 쉰다는 뜻
                SystemClock.sleep(100)
                var now = System.currentTimeMillis()
                Log.d("test1", "쓰레드 : ${now}")
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()

        isRunning = false
    }
}