4th Development Practice
Thread
//예제 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を宣言し、上記のコードを次のように変更すると、正常に動作します.Reference
この問題について(4th Development Practice), 我々は、より多くの情報をここで見つけました https://velog.io/@morgankim/4th-Development-Practiceテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol