#코틀린

햄깅햄깅· 2개월

질문코틀린 코루틴 실제 구현 코드에서 상태를 가지고 있어야 하는 경우에 질문이 있습니다.

안녕하세요 '코틀린 코루틴' 책을 읽으면서 공부 중인데 코루틴 내부 실제 구현 코드를 보다가 궁금한 점이 생겨 질문드립니다. suspend fun myFunction() { println("Before") var counter = 0 delay(1000) // 중단 함수 counter++ println("Counter: $counter") println("After") } 위와 같이 상태(counter) 를 보존해야하는 함수인 경우에 실제 구현이 아래처럼 된다고 나와있습니다. fun myFunction(continuation: Continuation<Unit>): Any { val continuation = continuation as? MyFunctionContinuation ?: MyFunctionContinuation(continuation) var counter = continuation.counter if (continuation.label == 0){ println("Before") counter = 0 continuation.counter = counter continuation.label = 1 if (delay(1000, continuation) == COROUTINE_SUSPENDED){ return COROUTINE_SUSPENDED } } if (continuation.label == 1){ counter = (counter as Int) + 1 println("Counter: $counter") println("After") return Unit } error("Impossible") } 여기서 궁금한 점은counter를 초기화할 때 0으로 초기화하지 않고 continuation.counter 로 초기화하는 이유가 있는지 입니다. 머릿 속으로 그려보면 var counter = 0 으로 선언하고 시작해도 원하는대로 실행이 되지 않을까.. 라고 생각됩니다.
74
2
0
무린
무린·2025-01-20
코루틴은 비동기 작업의 효율적 처리 등을 위해 일반 함수와는 다르게 실행 상태를 일시 중단했다가 재개할 수 있습니다. 이를 위해 이 함수의 상태(변수 값, 실행 위치 등)를 저장하고 관리해야 하며, 이를 위해 Continuation 객체가 사용됩니다.질문에 나온 코드에서 var counter = continuation.counter로 초기화하는 이유는,&n...
예붕예붕· 2년

질문안드로이드스튜디오 위에다가 코틀린으로 개발한 앱에 미디어파이프로 만든 AI를 갖다 붙일 수 있나요??

궁금한 게 있어 커뮤니티에 가입하게 되었습니다!  너무 생초보라 해보고 싶은 건 많은데 도와주세요!!! 카메라 API와 코틀린을 이용해서 개발한 APP에다가 번역 AI를 미디어파이프를 이용해 따로 개발하고 앱에 결합시켜보고 싶은데 방법이 궁금합니다! 아니면 모바일 어플에서 번역하는 AI를 넣을 때 주로 어떤식으로 개발하는지 사례나 공부할 방법이 있다면 알고싶습니다! 도와주세요 ㅜㅠㅜ
975
4
1
1
닥터핸
닥터핸·2023-05-15
모바일 앱에 번역 기능을 넣는 경우 번역 라이브러리를 이용하거나 번역 모델을 직접 개발하는 방법도 있지만 번역 API를 사용하는 방법도 있습니다.구글의 번역 API를 사용하면 앱에서 번역 요청을 API에 보내고 번역된 결과를 받아서 화면에 표시할 수 있습니다. 이 때 API에 번역 요청을 보내려면 구글로부터 API 키를 발급받아 사용해야 합니다.아...
무린
무린·2023-05-15
구체적인 구현에는 여러가지 요소를 감안해야겠지만 전반적인 구현 방법은 대략적으로 아래와 같은 형태가 될 수 있습니다. 1. build.gradle 파일에 아래와 같이 구글의 오픈소스 프레임워크인 미디어파이프를 이용하기 위한 라이브러리를 추가합니다. implementation 'org.tensorflow:tensorflow-lite-task-vision:0...
yj23124yj23124· 3년

질문안드로이드 뷰가 inflate 되지 않습니다.

layout(.xml) 파일에서 몇 가지 수정하는데 애뮬레이터나 핸드폰 연결해서 적용해봤는데 변경사항이 저장이 안됐습니다. 그래서 다른 코드가 잘못됐나? 하고 지우고 지우다 그냥 딱 기본 코드만 남겨놓고 변경했는데도 여전히 변화가 없습니다.   사진으로 보면 무슨 말인지 확실히 알 수 있습니다. 왼쪽은 제가 원하는 결과물이고 오른쪽은 애뮬레이터에 표시되는 화면입니다.    그리고 왼쪽과 같이 layout(.xml)파일을 수정하고 애뮬레이터 terminate 시키고 다시 실행시킨게 오른쪽 사진입니다.  동작을 안합니다..   class EditProfileActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_edit_profile) } } 위의 코드는 해당 코틀린 코드입니다. 가장 기본적인 코드만 남겼는데도 위와 같이 문제가 일어납니다.   해당 파일을 지우고 다시 만드는 방법도 있겠지만, 이 layout 말고도 다른 곳에서도 위와 같은 문제가 발생해서 가능하다면 이유를 알아서 삭제하지 않고 해결하고 싶습니다. 왜 이런 문제가 발생하는지 아시는 분 계실까요?
1.5K
2
1
0
무린
무린·2022-05-18
안드로이드 스튜디오에서 File> Invalid cache/Restart > Invalidate and Restart 를 실행해보시기 바랍니다.
yj23124yj23124· 3년

질문안드로이드 에뮬레이터에 따라 오류가 발생합니다

상대적으로 예전 버전인 Nexus 5X API 27로 할 때는 viewpager의 imageView가 잘 나오는데, Pixel 4 API 31 버전 애뮬레이터로 실행했을 땐 다른 건 잘 나오는데 viewpager의 imageView가 안나옵니다.. 아래의 내용은 Logcat에서 Error인 부분을 구글링해봐도 무슨 말인지 모르겠습니다ㅠㅠ 혹시 짐작 가시는 부분이 있을까요??   2022-04-13 13:55:24.260 409-409/? E/BpTransactionCompletedListener: Failed to transact (-32) 2022-04-13 13:55:25.404 448-466/? E/installd: Couldn't opendir /data/app/vmdl467636503.tmp: No such file or directory 2022-04-13 13:55:25.404 448-466/? E/installd: Failed to delete /data/app/vmdl467636503.tmp: No such file or directory 2022-04-13 13:55:25.985 1361-1361/? E/HwDetectorWithState: a: 3 2022-04-13 13:55:26.003 571-625/? E/VerityUtils: Failed to measure fs-verity, errno 1: /data/app/~~YZS7Rea2DoNg_giQyyGNkg==/com.instagram-oNZdfjGSAub8V764Q231DA==/base.apk 2022-04-13 13:55:26.141 571-625/? E/VerityUtils: Failed to measure fs-verity, errno 1: /data/app/~~YZS7Rea2DoNg_giQyyGNkg==/com.instagram-oNZdfjGSAub8V764Q231DA==/base.apk 2022-04-13 13:55:27.801 409-431/? E/HWComposer: getSupportedContentTypes: getSupportedContentTypes failed for display 4619827259835644672: Unsupported (8) 2022-04-13 13:56:47.808 357-357/? E/[email protected]: Failed to getEnergyData 2022-04-13 13:57:13.010 918-918/? E/MmTelFeatureConn [0]: ImsRegistrationCallbackAdapter: ImsRegistration is null  
5.3K
2
1
0
무린
무린·2022-04-23
안드로이드 SDK 버전에 따라 이미지를 가져오는 방식이 다를 수 있습니다. 예를 들면 Bitmap 이미지의 경우 아래와 같이 구분이 필요합니다. fun Uri.getCapturedImage(context: Context): Bitmap? { if (Build.VERSION.SDK_INT >= Build.VERSION_CODE...
밈이밈이· 4년

질문파이어베이스에서 읽어오는 데이터 값이 저장이 되지 않습니다.

class LogInActivity : AppCompatActivity() { var userId = "" var pcType = "" var nickName = "" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_log_in) val db: DatabaseReference = Firebase.database.reference // 이미 로그인이 되어있는 경우 UserApiClient.instance.accessTokenInfo { tokenInfo, error -> if (error != null) { Log.e("Token", "토큰 정보 보기 실패") } else if (tokenInfo != null) { Log.d("Token", "토큰 정보 보기 성공") UserApiClient.instance.me { user, error -> if (error != null) { Log.e("TAG", "사용자 정보 요청 실패", error) } else if (user != null) { val id = user.id.toString() setId(id) db.child("users").child(id).child("type").get().addOnSuccessListener { val dbType = it.value.toString() Log.i("info t", dbType.toString()) setType(dbType) }.addOnFailureListener { Log.e("firebase", "Error getting data", it) } db.child("users").child(id).child("nickname").get().addOnSuccessListener { val nick = it.value.toString() Log.i("info nick", nick) nickName = nick }.addOnFailureListener { Log.e("firebase", "Error getting data", it) } /*************************/ private fun setId(id : String) { userId = id } private fun setType(t : String) { pcType = t } 데이터 저장에 필요 변수는 전역으로 설정해주었습니다. db.child("users").child(id.toString()).child("type").get().addOnSuccessListener { 이 부분의 중괄호 내에서 dbType 변수에 데이터가 잘 저장된 걸 확인했습니다. 또한 전역변수로 선언해놓은 pcType에도 저장이 되어있습니다. 하지만 위 코드의 중괄호를 나가게 되면 pcType 변수에 다시 null 값이 들어 가 있습니다.   nickName 처럼 set 메소드를 안 쓰고 직접 저장을 해도 똑같이 중괄호를 나가면 다시 null 값으로 돌아갑니다. 이와 마찬가지로 UserApiClient.instance.me에서 저장되는 id값도 중괄호를 벗어나면 null 값으로 됩니다.. 며칠 전만 해도 문제 없이 잘 저장되었던 걸로 알고 있었는데 갑자기 변수에 값이 저장이 안되니 막막합니다..   제가 코틀린을 잘못 이해하고 사용하고 있는 것인가요? 파이어베이스에서 가져온 데이터 값을 어떻게 해야 변수에 저장할 수 있는지 궁금합니다. 현재 가지고 있는 코틀린 책도 없어서 구글링으로만 코드 작성 중이라 모르는 게 많습니다 ㅠㅠ..
2.9K
3
0
knee
knee·2023-12-11
정말 감사합니다! 이 글 덕분에문제를 해결할 수 있었어요
무린
무린·2021-05-06
addOnSuccessListener는 비동기로 실행됩니다. 즉, 언제 실행이 완료될 지 알 수 없는 코드입니다. 만약 중괄호 밖의 코드를 실행되기 전에 다행히 비동기 코드가 실행되었다면 정상적으로 동작하겠지만, 중괄호 밖의 코드가 실행될 때 아직 비동기 코드가 실행되어있지 않으면 값을 가져오지 못해 오류가 발생할 수 있습니다. 다시 말해,...