ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TECHIT 앱 스쿨 2기: Android 41일차 (23.06.26)
    [THEC!T] 앱 스쿨2기 : Android 2023. 6. 27. 02:47
    728x90

    자료 출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 내용

     

    오늘의 시작은 안드로이드에서 쓰레드를 사용하는 것에 대한 설명을 해주셨습니다.

    강사님께서 말씀해주신 것을 간단하게 요약하자면 쓰레드는 여러 처리를 비 동기적으로 처리하기 위해 사용하며, 안드로이드는 비 동기적 처리 외 네트워크에 관련된 코드는 전부 쓰레드로 운영해야 한다고 말씀해주셨습니다. 왜냐하면 네트워크 상황이 어떻게 변할지 모르기 때문에 입니다.

     

    안드로이드는 액티비티의 코드를 처리하기 위하여 쓰레드를 발생시키는데 이것을 Main Thread 혹은 UI Thread라고 부릅니다. 화면 작업은 해당 쓰레드가 유휴 상태일때만 화면 작업이 가능하기에, 오래걸리는 작업은 별도의 Thread를 발생 시켜 처리하고 Main Thread 는 항상 유휴 상태로 유지하게 해야합니다.

     

    안드로이드는 개발자가 발생시킨 Thread에서 화면에 대한 처리를 하면 오류가 발생하였었으나, 8.0(O) 버전 이상부터는 개발자가 발생 시킨 Thread 에서도 화면 처리가 가능합니다. 이 때 코틀린에서는 일반 Thread를 사용하여도 되나, 자바에서는 runOnUiThread를 사용하여 Main Thread가 해당 작업을 처리하도록 요청해야 합니다.

     

     

    해당내용에 대한 간단한 예제 입니다.

    약 0.5초마다 화면을 갱신하는 코드 입니다.

     

    주요 코드

    package com.test.android52_threadstudy
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.os.SystemClock
    import com.test.android52_threadstudy.databinding.ActivityMainBinding
    import kotlin.concurrent.thread
    
    class MainActivity : AppCompatActivity() {
    
        lateinit var activityMainBinding: ActivityMainBinding
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(activityMainBinding.root)
    
            activityMainBinding.run{
                button.setOnClickListener {
                    timeThread()
                }
    
            }
        }
    
        fun timeThread(){
            val now = System.currentTimeMillis()
            thread {
                while (true){
                    SystemClock.sleep(500)
                    activityMainBinding.textView.text ="경과시간 : ${(System.currentTimeMillis() - now)/1000.0}초"
                }
            }
    
        }
    
    }

     

     

     

    다음으로는 BoradCastReceiver 에 대해서 설명해주셨습니다.

    브로드 캐스트 리시버는 안드로이드 OS에서 특정 상황에 발생하는 메세지를 받아 들여 동작하는 실행 단위 입니다.

    브로드 캐스트 리시버는  반드시 외부에서 접근을 하기 위한 이름을 가져야 하며, 실제 동작은 애플리케이션이 단말기에 설치가 되면 안드로이드 OS는 브로드 캐스트 리시버에 등록된 이름으로 정리하여 목록화 합니다. 안드로이드 OS에서 어떤 사건이 발생하면 사건과 관련된 이름으로 지정된 브로드 캐스트 리시버를 찾아 동작 시키며 애플리케이션에서 이름을 전달하여 실행을 요청하면 해당 이름이 지정된 브로드 캐스트 리시버를 찾아서 동작 시킵니다.

    브로드 캐스트 리시버는 평소에는 동작하지 않고, 동작 요청이 발생할 때 동작하며, 동장 요청은 이름을 통해 요청 할 수 있으며, intent filter를 통해 이름을 등록합니다.

     

    배운 내용을 바탕으로 간단한 애플리케이션을 만들어 보았습니다. (하...쉬울줄 알았는데 전혀.....)

     

     

    해당 내용을 나름 심화(?) 복습을 하다가 잘못 작성을 한건지 아니면 이해를 잘못한건지 몰라도... 영상에서는 약간 특정 조건을 완료하지 못하였습니다.  앱 2를 완전히 종료를 한 뒤 앱 1에서 버튼을 눌러 앱2 브로드캐스트리시버를 실행시켜도 알림이 오지를 않는다는 문제였습니다.

    그리고 App2Receiver 클래스에서 알림을 제대로 설정하지 못하여 검색을 통하여 해결을 하였고, 해당 부분은 강사님께 질문을 드려 알아볼 수 있도록 하겠습니다.

     

    그리고 이후에는 프래그먼트에 대해서 알려주셨습니다.

     

    음 간략하게 말하자면 액티비티 내 작은 화면 조각입니다.

    액티비티는 독립된 실행 단위로 메모리를 많이 소모하는데 독립된 실행단위가 아닌 화면만 필요한 경우 액티비티 보다는 프래그먼트를 활용하는 것이 효율적입니다.

    오늘은 강사님께서 프래그먼트를 추가하는 방법과 제거하는 방법등을 알려주셨고, 한번 스스로 검색하여 데이터의 전달 등을 확인해보라고 하시면서 문제를 내주셨습니다.

    저의 경우 Bundle을 사용하는 방법과 프래그먼트의 객체를 생성할 때 생성자로 데이터를 전달해주는 법을 알게 되었고, 저의 경우 생성자로 데이터를 전달해주는 것보다는 강사님께서 알려주신 메서드를 일부 수정하여 Bundle로 데이터를 전달하는 방법으로 강사님의 숙제를 완료하였습니다.

     

    사실과 다를 수 있으며, 제가 코드를 작성하면서 든 생각입니다.

    저는 프래그먼트는 해당 액티비티의 inner class 라는 느낌으로 해당 코드를 작성하였고, 액티비티에는 사용할 데이터 등을 저장 해놓고 프래그먼트에서는 해당 데이터를 접근하여 화면을 작성하는 느낌으로 작성하였습니다.

     

    내일 강사님이 설명해주실 때 해당 부분을 집중해서 봐야 할 것 같습니다.

     

     

     

     

     

    마무리 

    중간에 브로드캐스트리시버를 복습하면서 알림을 사용해보려고 하다가 시간이 미친듯이 지나가 버렸지만, 덕분에 강사님께 질문을 하여 좀 더 발전할 수 있는 계기가 될 것 같습니다. 진짜 지금 작성한 코드는 여기저기 문서들을 기웃기웃 거리면서 만든거라 개념이 조금 어설픈데 해당 부분을 질문하여 답변을 듣고 나서 다시 작성을 해보면 추후 실력이 늘어나는데 훨씬 도움이 될 것이라 생각합니다.

     

    오늘의 마음가짐

    가만히 있는다고 알 수 있는 것이 아니라 해봐야 안다....

Designed by Tistory.