Android 4주차 워크북
수업 내용 정리
(수업에 관련해서 기억하고 싶은 내용 및 배운 내용을 정리해주세요. 실습이 있을 경우, 실습한 내용을 캡쳐해주세요.)
✅ 실습 체크리스트
- [x] 실제 Flo앱과 흡사하게 만들었나요? - 단지 비슷해서만 되는게 아닙니다! 디자인을 실제 퍼블리싱하는 과정을 연습하는 것이기 때문에 다른 사람이 볼때 정말 플로어플인지 아닌지 헷갈릴 정도로 만들었는지 확인해주세요!
- [x] 비율 코딩이 잘 되어있나요? (xml 상의 기기를 바꿔보면서 비율코딩 확인)
- [x] 모든 View에 적절한 id(네이밍)을 매치했나요?
- [x] SongActivity의 Thread 클래스에 의해 잘 작동이 되나요?
- [x] 기능이 전부 정상적으로 작동하나요?
- [x] MainActivity의 Seekbar가 잘 작동하나요?
- [x] SongActivity의 한곡재생 버튼 클릭시 thread가 재시작이 되나요?
📌 과제가 뭔가요?
- 기본 과제
- Splash Activity 구현해보기‼️
- SongActivity Timer Seekbar 구현해보기(멈추고 다시 실행 종료 다 해보기)‼️
[구현 화면]
[과제 구현 화면]
👑 챌린지 과제 👑
- [Main] 화면 Seekbar 구현해보기‼️
- 전달받은 Song 객체를 바탕으로 화면 구성
- 종료시 ActivityResultLauncher에 Song 객체를 전달해주기 위해 setResult() 메서드 호출
- 전달받은 Song 객체로 다시 MainActivity 구성
- [Song] 화면 한곡재생 버튼 클릭 시 스레드 재시작 구현해보기 ‼️
- private fun randomPlay() { binding.songProgressSb.progress= 0 // Seekbar progress 0으로 초기화 binding.songStartTimeTv.text= String.format("%02d:%02d", 0, 0) // 진행 시간 Text 0분 0초로 초기화 song.second = 0 // 진행 시간 초기화 song.isPlaying = true // 바로 실행 setPlayerStatus(song.isPlaying) if (!timer.isInterrupted) { timer.interrupt() } startTimer() // Timer 시작 }
- [Home] 뷰페이저 자동 슬라이드 구현해보기‼️(끝 뷰페이저에 도달했다면 처음으로)
- launch{ while(true){ delay(2000) // 2초 대기 with(homePanelViewpager){ currentItem= (currentItem+ 1) % panelAdapter.itemCount } } }
- (MainActivity는 코루틴으로 구현하였습니다.)
- MainActivity에서 Seekbar의 진행도, 실행여부(실행, 멈춤) 등을 SongActivity로 전달
🎯 핵심 키워드
- Thread
- Thread의 문제점
- 문제점 : 공유 자원의 문제, 동시에 여러 Thread가 실행될 때, 하나의 Data에 Thread가 동시에 접근할 때 문제가 발생한다. 교착상태(Deadlock) 등등..
- 해결방법
- 어떤 것을 먼저 처리할지 순서를 정한다. (join()을 통해 이전 작업이 끝날 때까지 대기)
- syncronized block을 통해 해결할 수 있다.
- Thread는 동기적? 비동기적?
- Thread
- Thread를 통해 여러 로직들을 비동기적으로 처리할 수 있다. 예를 들어, A, B, C, D, E라는 작업이 있을 때,Context switch를 해가면서 A, B, C, D, E를 조금씩 처리하는 MultiTasking을 수행할 수 있다.
- A가 끝나고, B를 처리한다. → B가 끝나고 C를 처리한다 → ... → D가 끝나고 E를 처리한다. 과 같은 방식인 동기적인 작업이 아닌,
- Thread
- Handler
- Thread간의 통신을 도와주는 역할을 수행함.
- UI관련 함수는 UI(Main) Thread 외에서 처리할 수 없는데, 별도의 MainLooper를 가지는 Handler객체를 만들고, 타 Thread에서 handler객체에게 post또는 postDelayed를 호출함으로써 블럭 내의 UI로직을 처리할 수 있다.
- runOnUiThread
- UI Thread에서 동작할 수 있도록 하는 함수
- Thread의 문제점
- Thread 종료
- flag(run함수 끝내기)
- while문을 통해 flag가 False인 동안 무한정 작업을 수행하다가, 특정 작업이 끝나면 flag를 True로 바꾸어주어 Thread를 종료시킨다.
- interrupt
- Thread 객체 내부에 정의되어 있는 interrupt() 함수.
- interrupt를 발생시키면 의도적으로 InterruptedException을 발생시켜 Thread를 종료시킬 수 있다.
- flag(run함수 끝내기)
- Looper
- Looper란 Thread를 통해 생성되고 계속 반복적으로 어떠한 일을 처리하는 것을 의미한다.
- 여기서 말하는 일은 Message Queue에 있는 Message를 읽는 일을 의미한다.
- Message Queue가 비어있는 동안에는 대기하다가, Message가 들어오면 이를 적절한 Handler로 전달하는 일을 반복해서 수행하는데, 이처럼 하나의 Thread를 점유해서 Message Queue만을 위해 일하는 개념을 Looper라고 한다.
- Splash Theme
- 앱이 구동될 때, 짧은 시간동안 보여주는 시작화면을 의미한다.
- 앱의 데이터를 로딩하는 시간 동안 빈 화면을 보여주지 않기 위해 대략 1~2초간 보여주는 화면.
- 코루틴
- 코틀린, C#, 파이썬, javascript 등에서 지원하는 비동기 개념
- 경량화 Thread라고도 하며, 말 그대로 Thread에 비해 훨씬 가볍고 저렴한 비용으로 비동기 로직을 처리할 수 있다.
🔥 논의해보면 좋은 것들
- Thread 종료 후(interrupt) 다시 실행하고 싶으면 어떻게 해야할까?
- Thread는 한 번 종료되면 다시 재시작하지 못한다.
- Thread내부에서 사용하던 Data를 따로 저장해두고, Thread 객체를 다시 생성한 뒤, Thread가 기존 data를 다시 사용하도록 하게 한다.
- Thread가 유용하게 쓰이는 것들 생각해보기
- Worker Thread에서 서버로부터 Data를 받아오는 로직을 처리하는 동안, 다른 UI 관련 로직은 그대로 수행한다. (ANR, Exception 등 방지)
- Thread의 문제점에 대해 알아보고 이를 해결할 방법(interrupt,join,AsynkTask 등)에 대해 알아보기
- Interrupt
- 해당 thread 객체에 정의되어 있는 interrupt() 메서드를 호출하면 Thread 내부의 run() 메서드에 InterruptedException이 발생한다. 이를 try catch로 안전하게 처리한다.
- 예제 코드
}public static void main(String[] atgs){ Thread thread = new MyThread(); thread.start(); try{Thread.sleep(1000);}catch (InterruptedException e){} *//스레드를 종료시키기 위해 InterruptedException을 발생시킴* thread.interrupt();
- }
- public class InterruptExam {
- public void run(){ try{ while (true){ System.out.println("실행 중"); Thread.sleep(1); } }catch (InterruptedException e){} System.out.println("자원 정리"); System.out.println("실행 종료"); }
- join
- join() 메서드를 호출한 Thread는 일시 정지 상태가 된다. 실행 대기 상태로 돌아가려면 join() 메서드를 멤버로 가지는 Thread가 종료되거나 매개값으로 주어진 시간이 지나야 한다.
- 관련 메서드join(long millis)
- join(long millis, int nanos)
- join()
- AsyncTask
- doInBackground(백그라운드 로직 수행), onPreExecute(Task 실행 전 처리할 로직), onPostExecute(Task가 모두 완료된 이후 처리할 로직), onProgressUpdate(UI 관련 로직 수행)을 오버라이드하여 비동기적으로 수행할 수 있도록 한다.
- API level 30(11) 부터는 Deprecated된 class이다.
- 오직 한 번만 실행되어 재사용이 불가능.
- 직접 종료해주지 않으면 종료되지 않기 때문에 메모리 누수 발생.
- UI Thread 상에서 호출해야 함.
- Interrupt
- 코루틴 이용해보기
- CoroutineScope(Dispatchers.Main).launch{ with(binding){ val albumAdapter = LockerVpAdapter(this@LockerFragment) lockerContentVp.adapter= albumAdapter TabLayoutMediator(lockerTb, lockerContentVp){tab, position-> tab.text= information[position] }.attach() } }
📢 4주차 수업 후기
- 4주차 수업을 듣고 서로 느낀 점을 이야기해주세요!
- 핵심 키워드에 대해 완벽하게 이해했는지? 혹시 이해가 안 되는 부분은 뭐였는지? 서로 이야기해주세요!
- 트러블 슈팅(실패한 경험도 성장을 위한 경험!)
- 트러블 슈팅 양식[ 해결 방안 ]
- [ 참고 자료 ]
- [ 문제 원인 ]
- 스터디 인증샷 잊지 마세요!
❓ 모르는 것들 / 해결하지 못한 것들
모르거나 해결하지 못한 것들을 정리해서 QnA 채널이나 스터디를 통해 같이 해결해보아요!
Android 4주차 워크북
수업 내용 정리
(수업에 관련해서 기억하고 싶은 내용 및 배운 내용을 정리해주세요. 실습이 있을 경우, 실습한 내용을 캡쳐해주세요.)
✅ 실습 체크리스트
- [x] 실제 Flo앱과 흡사하게 만들었나요? - 단지 비슷해서만 되는게 아닙니다! 디자인을 실제 퍼블리싱하는 과정을 연습하는 것이기 때문에 다른 사람이 볼때 정말 플로어플인지 아닌지 헷갈릴 정도로 만들었는지 확인해주세요!
- [x] 비율 코딩이 잘 되어있나요? (xml 상의 기기를 바꿔보면서 비율코딩 확인)
- [x] 모든 View에 적절한 id(네이밍)을 매치했나요?
- [x] SongActivity의 Thread 클래스에 의해 잘 작동이 되나요?
- [x] 기능이 전부 정상적으로 작동하나요?
- [x] MainActivity의 Seekbar가 잘 작동하나요?
- [x] SongActivity의 한곡재생 버튼 클릭시 thread가 재시작이 되나요?
📌 과제가 뭔가요?
- 기본 과제
- Splash Activity 구현해보기‼️
- SongActivity Timer Seekbar 구현해보기(멈추고 다시 실행 종료 다 해보기)‼️
[과제 구현 화면]
- 챌린지 과제
- [Main] 화면 Seekbar 구현해보기‼️
- 전달받은 Song 객체를 바탕으로 화면 구성
- 종료시 ActivityResultLauncher에 Song 객체를 전달해주기 위해 setResult() 메서드 호출
- 전달받은 Song 객체로 다시 MainActivity 구성
- [Song] 화면 한곡재생 버튼 클릭 시 스레드 재시작 구현해보기 ‼️
- private fun randomPlay() { binding.songProgressSb.progress= 0 // Seekbar progress 0으로 초기화 binding.songStartTimeTv.text= String.format("%02d:%02d", 0, 0) // 진행 시간 Text 0분 0초로 초기화 song.second = 0 // 진행 시간 초기화 song.isPlaying = true // 바로 실행 setPlayerStatus(song.isPlaying) if (!timer.isInterrupted) { timer.interrupt() } startTimer() // Timer 시작 }
- [Home] 뷰페이저 자동 슬라이드 구현해보기‼️(끝 뷰페이저에 도달했다면 처음으로)
- launch{ while(true){ delay(2000) // 2초 대기 with(homePanelViewpager){ currentItem= (currentItem+ 1) % panelAdapter.itemCount } } }
- (MainActivity는 코루틴으로 구현하였습니다.)
- MainActivity에서 Seekbar의 진행도, 실행여부(실행, 멈춤) 등을 SongActivity로 전달
🎯 핵심 키워드
- Thread
- Thread의 문제점
- 문제점 : 공유 자원의 문제, 동시에 여러 Thread가 실행될 때, 하나의 Data에 Thread가 동시에 접근할 때 문제가 발생한다. 교착상태(Deadlock) 등등..
- 해결방법
- 어떤 것을 먼저 처리할지 순서를 정한다. (join()을 통해 이전 작업이 끝날 때까지 대기)
- syncronized block을 통해 해결할 수 있다.
- Thread는 동기적? 비동기적?
- Thread
- Thread를 통해 여러 로직들을 비동기적으로 처리할 수 있다. 예를 들어, A, B, C, D, E라는 작업이 있을 때,Context switch를 해가면서 A, B, C, D, E를 조금씩 처리하는 MultiTasking을 수행할 수 있다.
- A가 끝나고, B를 처리한다. → B가 끝나고 C를 처리한다 → ... → D가 끝나고 E를 처리한다. 과 같은 방식인 동기적인 작업이 아닌,
- Thread
- Handler
- Thread간의 통신을 도와주는 역할을 수행함.
- UI관련 함수는 UI(Main) Thread 외에서 처리할 수 없는데, 별도의 MainLooper를 가지는 Handler객체를 만들고, 타 Thread에서 handler객체에게 post또는 postDelayed를 호출함으로써 블럭 내의 UI로직을 처리할 수 있다.
- runOnUiThread
- UI Thread에서 동작할 수 있도록 하는 함수
- Thread의 문제점
- Thread 종료
- flag(run함수 끝내기)
- while문을 통해 flag가 False인 동안 무한정 작업을 수행하다가, 특정 작업이 끝나면 flag를 True로 바꾸어주어 Thread를 종료시킨다.
- interrupt
- Thread 객체 내부에 정의되어 있는 interrupt() 함수.
- interrupt를 발생시키면 의도적으로 InterruptedException을 발생시켜 Thread를 종료시킬 수 있다.
- flag(run함수 끝내기)
- Looper
- Looper란 Thread를 통해 생성되고 계속 반복적으로 어떠한 일을 처리하는 것을 의미한다.
- 여기서 말하는 일은 Message Queue에 있는 Message를 읽는 일을 의미한다.
- Message Queue가 비어있는 동안에는 대기하다가, Message가 들어오면 이를 적절한 Handler로 전달하는 일을 반복해서 수행하는데, 이처럼 하나의 Thread를 점유해서 Message Queue만을 위해 일하는 개념을 Looper라고 한다.
- Splash Theme
- 앱이 구동될 때, 짧은 시간동안 보여주는 시작화면을 의미한다.
- 앱의 데이터를 로딩하는 시간 동안 빈 화면을 보여주지 않기 위해 대략 1~2초간 보여주는 화면.
- 코루틴
- 코틀린, C#, 파이썬, javascript 등에서 지원하는 비동기 개념
- 경량화 Thread라고도 하며, 말 그대로 Thread에 비해 훨씬 가볍고 저렴한 비용으로 비동기 로직을 처리할 수 있다.
🔥 논의해보면 좋은 것들
- Thread 종료 후(interrupt) 다시 실행하고 싶으면 어떻게 해야할까?
- Thread는 한 번 종료되면 다시 재시작하지 못한다.
- Thread내부에서 사용하던 Data를 따로 저장해두고, Thread 객체를 다시 생성한 뒤, Thread가 기존 data를 다시 사용하도록 하게 한다.
- Thread가 유용하게 쓰이는 것들 생각해보기
- Worker Thread에서 서버로부터 Data를 받아오는 로직을 처리하는 동안, 다른 UI 관련 로직은 그대로 수행한다. (ANR, Exception 등 방지)
- Thread의 문제점에 대해 알아보고 이를 해결할 방법(interrupt,join,AsynkTask 등)에 대해 알아보기
- Interrupt
- 해당 thread 객체에 정의되어 있는 interrupt() 메서드를 호출하면 Thread 내부의 run() 메서드에 InterruptedException이 발생한다. 이를 try catch로 안전하게 처리한다.
- 예제 코드
}public static void main(String[] atgs){ Thread thread = new MyThread(); thread.start(); try{Thread.sleep(1000);}catch (InterruptedException e){} *//스레드를 종료시키기 위해 InterruptedException을 발생시킴* thread.interrupt();
- }
- public class InterruptExam {
- public void run(){ try{ while (true){ System.out.println("실행 중"); Thread.sleep(1); } }catch (InterruptedException e){} System.out.println("자원 정리"); System.out.println("실행 종료"); }
- join
- join() 메서드를 호출한 Thread는 일시 정지 상태가 된다. 실행 대기 상태로 돌아가려면 join() 메서드를 멤버로 가지는 Thread가 종료되거나 매개값으로 주어진 시간이 지나야 한다.
- 관련 메서드join(long millis)
- join(long millis, int nanos)
- join()
- AsyncTask
- doInBackground(백그라운드 로직 수행), onPreExecute(Task 실행 전 처리할 로직), onPostExecute(Task가 모두 완료된 이후 처리할 로직), onProgressUpdate(UI 관련 로직 수행)을 오버라이드하여 비동기적으로 수행할 수 있도록 한다.
- API level 30(11) 부터는 Deprecated된 class이다.
- 오직 한 번만 실행되어 재사용이 불가능.
- 직접 종료해주지 않으면 종료되지 않기 때문에 메모리 누수 발생.
- UI Thread 상에서 호출해야 함.
- Interrupt
- 코루틴 이용해보기
- CoroutineScope(Dispatchers.Main).launch{ with(binding){ val albumAdapter = LockerVpAdapter(this@LockerFragment) lockerContentVp.adapter= albumAdapter TabLayoutMediator(lockerTb, lockerContentVp){tab, position-> tab.text= information[position] }.attach() } }
📢 4주차 수업 후기
- 4주차 수업을 듣고 서로 느낀 점을 이야기해주세요!
- 핵심 키워드에 대해 완벽하게 이해했는지? 혹시 이해가 안 되는 부분은 뭐였는지? 서로 이야기해주세요!
- 트러블 슈팅(실패한 경험도 성장을 위한 경험!)
- 트러블 슈팅 양식[ 해결 방안 ]
- [ 참고 자료 ]
- [ 문제 원인 ]
- 스터디 인증샷 잊지 마세요!
❓ 모르는 것들 / 해결하지 못한 것들
모르거나 해결하지 못한 것들을 정리해서 QnA 채널이나 스터디를 통해 같이 해결해보아요!
'대외활동 > UMC 동아리' 카테고리의 다른 글
UMC 3주차 컴공선배 워크북 내용정리 (0) | 2022.03.30 |
---|---|
UMC 2주차 컴공선배 워크북 내용정리 (0) | 2022.03.22 |
UMC 1주차 컴공선배 워크북 내용정리 (2) | 2022.03.14 |
[UMC 동아리 합격] UMC 동아리 2기 합격 과정 및 후기 (3) | 2022.03.08 |