4th Development Practice


Thread

  • Context Switching
  •     //예제 1
        class MainActivity : AppCompatActivity() {
    
            var milk = 0
    
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
    
                Thread() {
                    for (i in 0 until 1001) {
                        println(i)
                    }
                }
    
                Thread() {
                    for (i in 1000 downTo 0) {
                        println(i)
                    }
                }
            }
        }
        //예제 2
        class MainActivity : AppCompatActivity() {
    
            var milk = 0
    
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
    
                Thread() {
                    while(true) {
                        milk++
                    }
                }.start()
    
                Thread() {
                    while(true) {
                        milk--
    
                        if (milk < 0)
                            println("배고파")
                    }
                }.start()
            }
        }

    実際、ログを表示すると、「空腹」という言葉は連続的に出力されません.「空腹」という言葉がいつ現れるか分からないからです.「空腹」という言葉は0の下でひっくり返るからです.->Context Switching.
        //예제 3
        class MainActivity : AppCompatActivity() {
    
            private lateinit var binding : ActivityMainBinding
    
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
    
                binding = ActivityMainBinding.inflate(layoutInflater)
                val view = binding.root
                setContentView(view)
    
                var pictureChangeArrayList = ArrayList<Int>()
    
                pictureChangeArrayList.add(R.drawable.cat1)
                pictureChangeArrayList.add(R.drawable.cat2)
                pictureChangeArrayList.add(R.drawable.cat3)
                pictureChangeArrayList.add(R.drawable.cat4)
    
                Thread() {
                    for (i in pictureChangeArrayList) {  //for-each문
                        Thread.sleep(1000)
                        binding.imgMain.setImageResource(i)
                    }
                }.start()
            }
        }

    エラーメッセージ:元のthreadでのみビューを処理できます.
    メインスレッド以外のスレッドではビューを処理できません!->handlerで解決!元のスレッドではない他のスレッドでビューを処理することもできます
        var handler = Handler(Looper.getMainLooper())
    
        Thread() {
            for (i in pictureArrayList) {  //for-each문
                Thread.sleep(1000)
    
                handler.post {
                    binding.imgMain.setImageResource(i)
                }
            }
        }.start()
    handlerを宣言し、上記のコードを次のように変更すると、正常に動作します.