오늘 한 것
- 안드로이드 10 이상에서 listfiles()가 null을 리턴하는 문제 해결법
android:requestLegacyExternalStorage="true" 속성 추가 필요, 하위 버전에서 정상 동작하는지 나중에 테스트 필요
stackoverflow.com/questions/20714058/file-exists-and-is-directory-but-listfiles-returns-null
- 특정 경로 내의 mp4 파일의 정보를 데이터베이스에 삽입 성공
- 동영상 파일의 시간을 MediaMetadataRetriever 클래스를 사용하여 시간정보 추출 후 밀리초 단위에서 초단위로 변환하여 length 컬럼 삽입
- 이미 데이터베이스에 존재하는 파일은 삽입하지 않음
- 이 때, 이미 존재하는지의 여부는 location 의 동일 여부
- 새로 삽입하는 파일들의 이름이 같을 수는 없으니 이 경우는 배제하고 구현
- 걱정되는 점은 데이터베이스의 파일 개수가 N이면 시간 복잡도는 O(삽입파일 개수 * N)인데 N의 개수가 많이 크면 성능 저하가 의심됨
- 실제 내 스마트폰에서 테스트 해봤는데 MediaMetadataRetriever 에서 Runtime 오류 발생
- 디버깅 결과 손상된 영상 정보를 가져오려할때 발생함
- 예외처리로 손상된 영상 정보일 경우에는 임의로 length 0 대입
- 데이터 삽입 과정에서 2342개의 파일에서 723개의 mp4 파일정보를 데이터베이스에 삽입하는데에 15초가 걸림
- 데이터베이스의 데이터 개수가 없을 때도 이 정도이면 데이터 개수가 많아질 수록 시간이 비약적으로 길어질 듯
- 액티비티에서 해당 과정 수행 시 액티비티 검은 화면으로 마비됨
- 메인 thread에서 모든 작업 수행 불가 -> Asynctask로 수행해야할 필요성을 느낌
- 데이터베이스에 50개의 값을 대상으로 태그 검색시 1초가량 걸림
- 이 작업도 Asynctask 로 전환 필요
- 태그 검색 알고리즘 자체 개선 필요
- 실용성을 위해서는 전반적인 알고리즘 최적화가 필요해보임
- 태그 검색 시 String.contains()로 String 포함 여부 검사하는 건 무조건 아닌 것 같다. 좀 더 나은 방법이 있을 듯 (태그를 정수 형태로 변환하여 관리 등, 데이터베이스 레벨에서 String 포함 여부 검사도 한번 테스트해보자)
- 앱을 실행 시 마다 이미 파일 경로의 데이터들 전부를 대상으로 데이터베이스에 있는지 없는지 확인 작업이 필요할까? 해시값을 이용하는 등의 방법으로 변화가 감지될 때만 변화된 파일들을 대상으로 작업 수행(새로운 파일, 변화된 파일)
내일 할 일
- 데이터베이스 레벨에서 String 포함 여부 검사로 성능 개선 테스트
- 내일 참고할 링크들
select 쿼리 구현
'안드로이드 앱 개발 프로젝트1' 카테고리의 다른 글
9일차 - 데이터 삽입 알고리즘 최적화 (0) | 2021.01.19 |
---|---|
8일차 (0) | 2021.01.18 |
6일차 (0) | 2021.01.17 |
5일차 (0) | 2021.01.14 |
4일차 (0) | 2021.01.13 |