썸네일 [Android] Retrofit2 URL Encoding 방지하기 공공데이터 사이트에서 api를 받아서 활용하는중에 계속 같은에러가 발생하였습니다. 에러를 찾아보니 GsonBuilder().setLenient().create() 를 컨버터에 붙여주면 된다는 글이 있었지만 해결되지 않았습니다. json 규격도 다 맞고, 혹시나 url이 잘못됐나 싶어 포스트맨으로도 확인해보았으나 데이터가 제대로 들어왔습니다. 인터셉터에서 띄워주는 로그를 보니 공공데이터에서 받은 서비스키가 다르게 나오고있었습니다. 제가 작성한 url 중 서비스키가 d49%3Do29%2R 이런식이었다면 d49%25253Do29%25252R 이렇게 나오고 있었는데 원인을 찾아보니 자동으로 utf-8로 인코딩 돼서 서비스키가 변경되어 나오는 것이었습니다. 공공데이터에서 받은 서비스키가 인코딩 서비스키였는데 인코..
[Android] 코루틴 Under the hood 이번시간에는 코루틴이 내부적으로 어떻게 동작하는지 확인해보겠습니다 [Continuation Passing Style] CPS == Callbacks //Kotlin suspend fun createPost(token : Token, item : Item) : Post { _ } // Java/JVM Object createPost(Token token, Item item, Continuation cont) { _ } 작성한 코루틴이 컴파일 될때 내부적으로 JVM에서 Byte 코드로 변환되면서 Continuation이 하나가 더 생기게 됩니다. (CPS) [Labels] //Kotlin suspend fun postItem(item : Item) { // LABLE 0 val token = requestT..
[Android] 코루틴 Coroutine Context and Dispatchers 이번에는 coroutine context와 dispatchers 에 대해 알아보겠습니다 [Dispatchers and threads] Coroutine 은 CoroutineContext 에 의해 실행됩니다 CoroutineContext 의 요소에 여러 요소를 설정할수 있는데 요소들 중에는 Job, Dispatchers 등이 있습니다 Dispatchers 는 Coroutine이 어떤 thread 나 thread pool 에서 실행될지를 결정하는 요소입니다 모든 Coroutine builder 는 옵셔널로 CoroutineContext 를 파라미터로 받습니다. ex) launch, async 이것을 통해 dispatcher를 지정할 수 있습니다 fun main() = runBlocking { launch {..
[Android] 코루틴 Composing Suspending Functions 1. 코루틴 왜 써야하는가 2. 코루틴 기초 3. 코루틴 Cancellation and Timeouts 이번에는 suspending functions을 조합하여 코루틴을 유용하게 사용 하는 법에 대해 알아보겠습니다. [Sequential by default] fun main() = runBlocking { val time = measureTimeMillis { val one = doSomethingUsefulOne() val two = doSomethingUsefulTwo() println("The answer is ${one + two}") } println("Completed in $time ms") } suspend fun doSomethingUsefulOne(): Int { delay(1000L)..
[Android] 코루틴 Cancellation and Timeouts 1. 코루틴 왜 써야 하는가 2. 코루틴 기초 에 이어서 이번에는 코루틴의 취소와 타임아웃에 대해 알아보겠습니다 코루틴을 정교하게 취소하지 않으면 메모리를 잡아먹기 때문에 메모리릭이 발생합니다. 코루틴을 취소하는 방법은 cancel를 호출하면 간단하게 처리됩니다. 그러나 코루틴 자체가 스스로 cancel에 대해서 협조직은 형태로 구현이 되어있어야 합니다. 그러한 특성들에 대해서 알아보겠습니다 [Cancelling coroutine execution] fun main() = runBlocking { val job = launch { repeat(1000) { i -> println("job: I'm sleeping $i ...") delay(500L) } } delay(1300L) // 1.3초 지연 pr..
[Android] 코루틴 기초 저번 코루틴은 왜 써야하는가 에 이어서 이번에는 코루틴의 기초에 대해 공부해 보겠습니다! [ First Coroutine ] fun main() { GlobalScope.launch { // 백그라운드에서 코루틴을 생성하고 진행합니다 delay(1000L) // 1초 동안 지연 println("World!") // 지연 후 출력 } println("Hello,") // 코루틴이 지연되는 동안 메인쓰레드는 계속 됩니다 Thread.sleep(2000L) // JVM을 유지하기 위해 2초동안 메인 스레드를 차단합니다 } 코루틴 문서에서는 이것을 쓰레드로 시도해 볼것을 권유했습니다. fun Main() { thread { //delay(1000L) Thread.sleep(2000L) println("world..
[Android] 코루틴 왜 써야하는가 코루틴은 구글 블로그에서도 공식으로 추천하고 있는 코틀린의 기능입니다. 블로그에 의하면 코루틴은 실시간 처리를 훨씬 쉽게 작성하고 이해할 수 있게 해준다고 합니다. 또한 Jetpack 라이브러리 (Lifecycle ,WorkManager, Room) 에도 코루틴을 지원하여 더 나은 코드를 작성할 수 있다고 합니다. [Coroutine] - 코루틴은 루틴의 일종 - 협동 루틴이라 할 수 있다 - 코루틴의 "Co"는 with 또는 together을 뜻한다 1 .코루틴은 이전에 자신의 실행이 마지막으로 중단되었던 지점 다음의 장소에서 실행을 재개한다. - 일반적으로 사용하는 함수나 루틴은 중단되는 개념이 없고 실행이되면 빠져나오고 끝인 반면에 코루틴은 실행이 되고나서 중단과 재개를 컨트롤 할수 있다 (함수의 ..
[Android] 레이아웃을 이미지로 만들어서 공유하기 Layout to Image share 하나의 화면 자체를 공유하고 싶을때 사용합니다. 작동 원리는 레이아웃을 스크린샷 형태로 갤러리에 저장한 뒤에 그 uri을 가져와서 공유하는 방식입니다. 일단 LayoutToImage 클래스를 복붙 합니다! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 public class LayoutToImage { public interface SaveImage..
[Android] 에러 Android resource compilation failed Android resource compilation failed C:\Users\krenet\AndroidStudioProjects\DailyGoal\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml:2846: error: duplicate value for resource 'attr/layout_anchorGravity' with config ''. C:\Users\krenet\AndroidStudioProjects\DailyGoal\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml:2846: erro..
썸네일 [Android] RecyclerView, ListView Adapter에서 Activity finish 하기 Adapter 에서 아이템을 클릭했을때 액티비티를 전환해야 할 경우가 있습니다그때 액티비티를 종료 시킬 수 있는 방법입니다 더 나은 방법이 있다면 댓글로 알려주시면 감사하겠습니다!
[Android] 한문장으로 모든 액티비티 종료시키기 피니쉬 하기 애매한 프래그먼트가 있어서 로그아웃을 하게되면 프래그먼트가 남아있어서 골치였는데, 로그아웃 하는 과정에서 모든 액티비티를 삭제시켜주면 되지 않을까 검색하다 찾게된 방법입니다. 아주아주 유용했습니다 ActivityCompat.finishAffinity(this); 이 한문장이면 모든 액티비티가 종료됩니다. 끝 이게 좋은 방법인지는 모르겠습니다더 좋은 방법이 있다면 댓글 부탁드립니다!
썸네일 [Android] 인텐트란? 인텐트로 액티비티 전환, 화면넘기기 인텐트란? - 어 떤 액션이 수행되는데 특정 데이터의 특정 부분을 가지고 수행하라는 선언으로 메시지를 전달하는 메커니즘이다. 액티비티 간 (컴포넌트 간)의 호출과 정보를 주고받는 경우에 사용되는 중계자 정도의 역할이다. 인텐트는 명시적 인텐트와 암시적 인텐트가 있다. 명시적 인텐트는 호출 대상이 명확하게 정의되어 있는 인텐트, 암시적 인텐트는 호출 대상이 명확하게 정의되어 있지 않은 인텐트를 말한다. 암시적 인텐트 명시적 인텐트 화면을 전환할때는 명시적 인텐트를 사용합니다. 코드를 보면 클릭시에 메인 액티비티에서 넥스트 액티비티로 넘어가라 는 코드입니다. 버튼을 클릭하기 전의 메인 액티비티 화면 버튼 클릭후의 넥스트 액티비티 화면 굉장히 간단하죠~?