Android/Development Tips (44) 썸네일형 리스트형 안드로이드 하드웨어 비트맵 이전 글 : https://nanamare.tistory.com/170 와 관련이 있습니다. 몇일 전 아래와 같은 에러를 다시 만났습니다. Software rendering doesn't support hardware bitmaps 해당 이슈는 아래와 같은 코드에서 발생했습니다. canvas.drawBitmap(bitmap, width, height, paint); 결론적으로 "위 코드의 bitmap 이 하드웨어 비트맵이기 때문에, CPU 에 정보가 있지 않아 그려낼 수 없다." 가 원인이였는데, 이전글에서 bitmap 을 가져올 때, ALLOCATOR_SOFTWARE 옵션을 주기 때문에 아마 다른 원인이 있을 것이라고 생각하고 코드를 확인해봤습니다. uri 에서 bitmap 을 변환 시키는 것이 아닌 .. ViewModel 에서 Fragment, Activity 로 콜백을 조심하자 ViewModel 의 라이프 사이클은 Activity 나 Fragment 보다 길기 때문에 ViewModel 에서 Fragment, Activity 에 콜백 받는 것은 실수를 유발합니다 (ViewModel 에서든) 라이브데이터나 플로우를 사용하여 관찰(observe) 혹은 수집(collect) 하는 것이 좋습니다. // Activity or Fragment.kt viewModel.loadItemList() { list -> // Activity 가 Destroy 상태거나 Fragment 인 경우 not Attached 일 수 있음 // 또한 isDestroyed 혹은 isAdd 와 같은 상태를 확인하는 처리가 필요하게 됩니다 adapter.submitData(list) } Google login errorCode 12500 인 경우 먼저 1. Firebase console -> 설정 -> 내프로젝트 항목에서 지원 이메일이 제대로 등록되어있는지 체크하기 2. Firebase console -> 설정 -> 내 앱 항목에서 SHA-1 타입의 인증서가 잘 추가가 되어있는지 체크하기 3. Debug 앱 등이 있어도 BuildType 에 맞게 들어있다면 google-services.json 에 모두 담겨 오기 때문에 크게 문제 없습니다. 4. 이모든게 모두 잘 되어 있다면 Google 사용자 인증 정보에 들어가서 OAuth 2.0 클라이언트에 해당 앱의 패키지 혹은 디버그 버전 패키지가 잘 추가되어 있는지 확인 하기 저는 4번 케이스로 보통은 google 에서 자동으로 추가시켜주는데(키에 was created auto by google 식으로.. Proguard 로 난독화 된 코드 복호화 앱 개발을 하다보면, Proguard 를 적용하게 되고 이로인해, 간혹 crashlytics 혹은 google console 에 난독화가 적용된 코드가 전달 되는 경우가 있습니다.(AAB를 적용하게되면, Mapping 파일을 따로 추가하지 않아도 되지만, 난독화된 코드들이 Crashlytics 에 기록되는 경우가 있었습니다.) 따라서 해당 코드라인을 수정하려면 de-obfucated 가 필수 입니다! 매번 잊어버려서 이후에 참고할 수 있게 블로그에 정리해둡니다. 1. $ANDROID_SDK_DIRECTORY/tools/proguard/bin/proguardgui.sh 실행 ANDROID_SDK_DIRECTORY 는 안드로이드 스튜디오를 켜고, local.properties 의 sdk.dir 를 참고하시면.. Bitmap, contentUri 를 Retrofit RequestBody 에 담을 때 Tips 보통 Retrofit 를 통해 RequestBody 를 만들어 서버로 보낼 때, Bitmap -> file 저장 -> file 을 RequestBody 로 변경하여 서버로 보내는 예제들이 간혹 보입니다. contentUri 도 마찬가지로 file 로 저장하고 RequestBody 로 변경하여 서버로 보내곤합니다. 그리고 코드도 올바르게 동작합니다. 하지만 해당 과정에는 파일로 저장할 필요가 없는 케이스도 있습니다. 해당 케이스의 경우 아마 위의 방식을 사용하면 이후에 파일을 삭제하는 로직 혹은 버전이 올라가면 해당 파일을 포함한 폴더를 비워주는 작업들이 필요하게 됩니다. 이런 경우 불필요한 파일 IO 작업을 생략할 수 있는 방법들이 있습니다. 1. Bitmap 의 경우 class BitmapRequest.. Hilt 수박 겉핥기 www.youtube.com/watch?v=gkUCs6YWzEY 앞으로 Hilt 를 사용할 것 같은 느낌이 강하게 들어, 드로이드 나이츠 2020 옥수환님이 발표하신 영상 보면서 정리해봤습니다 Dependency Injection(의존성 주입) 이란 ? - 생성자 또는 메세드 등을 통해 외부로부터 생성된 객체를 전달받는 행위 의존성 주입의 특징? - 클래시간 결합도를 느슨하게 만든다 - 인터페이스 기반으로 설계되며, 코드를 유연하게 변경 가능하도록 한다 - Stub 또는 Mock 객체를 사용하여 단위 테스트를 하기가 더욱 쉬워진다 간단한 예제코드 // 의존성 주입이 없는 코드 class MemoRepository { private val db = SQLiteDatabase() fun load(id: St.. DialogFragment 를 상속하는 다이얼로그에서 dismiss 할 때 Tips // dialog 를 프로퍼티(멤버변수)로 선언했다고 가정 dialog?.dismiss() dialog = Dialog() dialog?.show(xxxFragmentManager, dialogTag) 위와 같은 코드가 있다. 대략적인 의미를 보면 1. dialog null 이 아니라면 dismiss 시키고 2. dialog 를 초기화 하고 3. 마지막으로 다이얼로그를 보여준다. 잘 작성한 코드로 다이얼로그가 중복으로 뜨는일은 없을 것 같이 느껴진다. 하지만 Configuration change(퍼미션 변경, 화면 변경, 언어 변경 등), OOM 가 일어나면 문제가 생기게 된다. 보통 안드로이드 이론 공부하면, Configuration change 가 일어나면 액티비티가 다시 시작되는 것을 우리는 알고 .. java.lang.IllegalStateException: Software rendering doesn't support hardware bitmaps 에러 수정하기 Context 와 Uri 를 사용하여, Bitmap 을 가져오는 함수가 deprecated 되어 Replacement 함수로 변경하고 나서 QA 중 에러가 발생했다. 아래와 같이 레거시 방법들을 사용하고 있었고 // (deprecated) BitmapDrawable(context.resources).bitmap // (deprecated) BitmapDrawable( context.resources, MediaStore.Images.Media.getBitmap(context.contentResolver, this) ).bitmap 사용했던 문제의 코드 ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, this)) 에서.. 이전 1 2 3 4 5 6 다음