반응형

Android 41

코루틴을 활용한 비동기 작업 순서

suspend 1.동사 매달다, 걸다2.동사 (공식적으로) 유예[중단]하다3.동사 (공식적으로) 연기[유보]하다suspend 함수란?suspend 키워드는 함수가 "중단 가능하다"는 것을 나타냅니다. 일반 함수와 달리, suspend 함수는 실행 중간에 중단됐다가 나중에 재개될 수 있습니다. 이는 비동기 작업을 수행할 때 스레드를 차단하지 않고도 결과를 기다릴 수 있게 해줍니다.suspend fun getUserFromApi(userId: String): User { // 네트워크 요청 (이 동안 함수 실행은 중단되지만, 스레드는 차단되지 않음) return api.getUser(userId)}suspend 함수의 작동 원리suspend 함수는 내부적으로 '상태 머신(state machine)..

Android 2025.05.15

[Android] 자바스크립트 인터페이스 실전편

자바스크립트 인터페이스로 구현한 하이브리드 앱 기능들기존 글에서 자바스크립트 인터페이스의 기본 원리와 작동 방식을 설명했다면, 이번에는 실제 프로젝트에서 구현한 다양한 기능들을 자세히 살펴보겠습니다.1. 위치 정보 서비스 구현안드로이드의 네이티브 위치 정보 API를 사용하여 웹 환경에 사용자의 현재 위치를 제공하는 기능입니다.1.1 WebAppInterface 구현class WebAppInterface( private val context: Context, private val webView: WebView,) { private val TAG = "WebAppInterface" private val handler = Handler(Looper.getMainLooper()) //..

Android 2025.05.14

[Android]SQLiteDatabase - 트랜잭션 & 비동기 처리

들어가며안드로이드 앱 개발 중 가장 까다로운 문제 중 하나는 데이터베이스 작업과 비동기 처리의 조화입니다. 최근 우리 프로젝트에서 발생한 "attempt to re-open an already-closed object: SQLiteDatabase" 오류를 해결하는 과정에서 배운 교훈과 인사이트를 공유하고자 합니다. 이 글이 같은 문제로 고민하는 개발자들에게 도움이 되길 바랍니다.문제 상황: 데이터베이스 닫힘 오류우리 앱에서는 서버로부터 다양한 데이터(상품, 광고 이미지 등)를 가져와 SQLite 데이터베이스에 저장한 후 이미지 파일을 다운로드하는 기능이 있었습니다. 특히 문제가 발생한 코드는 광고 이미지 데이터를 처리하는 메소드였습니다.이 코드는 간헐적으로 "attempt to re-open an alr..

Android 2025.05.12

[Android] 자바스크립트 인터페이스

자바스크립트 인터페이스란?@JavascriptInterface는 안드로이드 WebView 내에서 실행되는 자바스크립트 코드가 네이티브 자바/코틀린 코드를 호출할 수 있도록 하는 브리지 메커니즘입니다. 이는 마치 서로 다른 언어를 사용하는 두 세계 사이에 통역사를 배치하는 것과 같습니다.1. 기본 작동 원리자바스크립트 인터페이스는 본질적으로 두 개의 완전히 다른 실행 환경을 연결합니다:자바/코틀린 환경: 안드로이드 네이티브 코드가 실행되는 JVM(Java Virtual Machine) 또는 ART(Android Runtime)자바스크립트 환경: WebView 내부의 자바스크립트 엔진(V8 또는 WebKit)이 코드를 실행하는 공간이 두 환경은 원래 다음과 같은 이유로 완전히 격리되어 있습니다:서로 다른 프..

Android 2025.05.08

[Android] Intent

인텐트 : 액티비티가 수행할 작업을 정의할 수 있는 객체임...! -> startActivity 함수에 인자로 전달하면 댐   Android 에서 Intent를 통해 putExtra로 데이터를 전달할때, Bundle에 저장되는 데이터의 크기가 1MB로 제한되어 있는 이유는?=> Binder라는 안드로이드 IPC 메커니즘 때문이다. 큰 데이터를 전달하면 시스템 리소스(메모리, CPU 등)를 과도하게 사용하게 되어, 전체 시스템의 성능이 저하될 수 있다.  큰 데이터를 전달하면 메모리 부족으로 인해 앱이 강제 종료되거나 시스템이 불안정해질 수 있다. 예외는 Binder가 처리할 수 있는 데이터 크기를 초과했을 때 발생한다.   ✅ Java에서 Intent를 사용한 화면 전환 예제// MainActivity에..

Android 2025.02.28

[Android] Layout은 어떻게 그릴까

웹뷰에 radius를 적용하면서 삽질을 하며 공부한 내용을 정리해 보려고 한다. 항상 편리하게 제공된거만 쓰다보니 근본적인 과정을 몰랐고 이 때문에 이렇게 헤맨 것 같다. 진짜 간단한 거라도 제대로 알고 써야 하는 게 정말 중요한 것 같다.... ㅇㅔ휴..~ https://developer.android.com/guide/topics/ui/how-android-draws Android에서 뷰를 그리는 방법 | Views | Android Developers활동이 포커스를 받으면 레이아웃을 그리라는 요청을 받습니다. Android 프레임워크에서 그리기 절차를 처리하지만 활동에서 레이아웃 계층 구조의 루트 노드를 제공해야 합니다. 그리기는 레이developer.android.com https://de..

Android 2025.02.26

[Android] 웹뷰에 corner radius 적용하기 (feat. Java)

https://hantoluvcoding.tistory.com/86 [Android] WebView Url 여러개 띄우기(feat.Java)한 웹뷰에 여러 url을 띄우는 작업을 하게 되었는데 onPagedFinish에 다음 url로드를 달아 놓고 닫기 버튼을 누르니scripts may close only the windows that were opened by them. 라는 로그가 뜨며 window.close()가 작동hantoluvcoding.tistory.com 전편에 이어서..   새로운 요구 사항이 생겼는데 바로 웹뷰에 레디우스를 적용하는 것이었다. xml에서 아무리 수정해도 적용이 되지 않고 있었다. 결론부터 말하자면 webview 클래스를 상속받은 후 onDraw를 오버라이드하여 처리하였다..

Android 2025.02.26

[Android] WebView Url 여러개 띄우기(feat.Java)

한 웹뷰에 여러 url을 띄우는 작업을 하게 되었는데 onPagedFinish에 다음 url로드를 달아 놓고 닫기 버튼을 누르니scripts may close only the windows that were opened by them. 라는 로그가 뜨며 window.close()가 작동하지 않았다.  이는 사용자가 명시적으로 연 창이 아니라면 window.close() 실행을 허용하지 않기 때문이다.   이를 해결하기 위해 xml에 webView를 넣는 것이 아닌 framLayout을 선언하고 url이 여러개 있을때 한개의 url이 닫히면 새로운 webView를 생성하게 했다.  @SuppressLint("SetJavaScriptEnabled") @Override public void onVi..

Android 2025.02.25

[Android] Firebase Push Token (feat. WebView)

https://firebase.google.com/docs/cloud-messaging/android/first-message?hl=ko&authuser=0&_gl=1*dvs24r*_ga*MTQyMzQxMTk4My4xNzQxMDYyMjUy*_ga_CW55HF8NVT*MTc0MTA2MjI1MS4xLjEuMTc0MTA2MjM2Ny4xOC4wLjA.#retrieve-the-current-registration-token 백그라운드 앱에 테스트 메시지 보내기  |  Firebase Cloud Messaging4월 9~11일, Cloud Next에서 Firebase가 돌아옵니다. 지금 등록하기 의견 보내기 백그라운드 앱에 테스트 메시지 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류..

Android 2025.02.19