Android
-
nodejs + android Socket.IO 를 이용해 소켓 통신 만들기개발/nodejs 2021. 10. 28. 21:32
NodeJs Socket Server nodejs 의 socket.io 라이브러리를 사용하면 손쉽게 클라이언트와 소켓 통신을 할 수 있는 코드를 구현할 수 있다. 코드도 몇줄 되지 않는다. 아래 코드는 typescript로 소켓 통신 부분을 구현해본 것이다. import express from 'express' import httpLib from 'http'; import socketIO from 'socket.io'; const http = httpLib.createServer(express()) const socketio = new socketIO.Server(http, {}) socketio.on("connection", (socket: socketIO.Socket) => { console.log(..
-
ListAdapter, DiffUtil개발/안드로이드 2021. 8. 20. 09:24
ListAdapter는 RecyclerView.Adapter의 확장기능으로 리스트내에 노출할 아이템의 변경 여부를 백그라운드 쓰레드에서 판단할 수 있는 기능을 제공한다. 생성자에는 DiffUtil.ItemCallback의 구체 클래스를 넘겨주는데 여기서 구현하는 두 함수를 이용해 아이템 변경 유무를 판단한다 class BookAdapter() : ListAdapter(object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Book, newItem: Book): Boolean { return oldItem.isbn13 == newItem.isbn13 } override fun areContentsTheSame(oldItem: Boo..
-
Coroutine + Retrofit | Coroutine + Room개발/안드로이드 2021. 7. 22. 21:00
Coroutine + Retrofit Retrofit 2.6.0 버전부터 suspend 함수로 api를 작성할 수 있게 됐다. 다른 Retrofit 인터페이스처럼 어노테이션을 추가하고 suspend 함수를 추가하면 빌드 될 때 Retrofit 에서 전처리한다. interface LibraryApi { @GET("/1.0/new") suspend fun getNew() : BookListResp } suspend로 쓰였기 때문에, api 를 호출하는 부분에서도 suspend 함수를 받아서 처리할 수 있다. 예로 Repository 인 경우 suspend 함수를 이용해서 아래 코드로 표현이 가능하다. withContext를 받아서 I/O 쓰레드에서 실행하도록 변경해 Main 쓰레드 안전성이 보장됐다. cla..
-
suspend fun개발/안드로이드 2021. 7. 22. 20:00
코틀린에서 추가된 suspend 함수는 Coroutine 내에서만 실행 가능한 함수다. 블로그 글마다 suspend 함수에 대해서 각각 정의가 다른데 나는 suspend 함수를 Coroutine Context를 갖고 있는 함수 정도로 정의하고 싶다. 간단한 사용법 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) CoroutineScope(Dispatchers.Main).launch { val sum = suspendSum(1, 2) // no compile error Log.d("suspend sum", sum.toStr..
-
Serializable 과 Parcelable개발/안드로이드 2021. 6. 19. 14:03
Serializable Serialization(직렬화)란 자바 시스템 내부에서 사용하는 객체를 외부의 자바 시스템에서도 사용할 수 있도록 byte형태로 데이터를 변환시키는 기술을 말하며 안드로이드 상에선 직렬화를 이용해 액티비티간 또는 서비스간 클래스 타입의 데이터를 주고 받는 용도로 주로 사용한다 아래 처럼 Student 클래스를 Serializable 선언 해준다면, 다른 액티비티에 클래스 형태 그대로 값을 전달 해줄 수 있다. Serializaable 선언 외에 추가하는 코드가 없어서 사용하기 정말 편리하다. data class Student(val name: String, val age: Int) : Serializable val intent = Intent().apply { this.putEx..
-
Kotlin - Coroutine개발/안드로이드 2021. 5. 21. 20:00
Coroutine을 공부할 때 당장 실행되는 코드를 짜려고 launch, async 함수부터 먼저 써보게 되는데(과거의 나) 이것보단 Coroutine을 이루는 구조가 무엇인지를 먼저 공부하고 유틸리티 함수를 사용하면 훨씬 이해하기가 쉽다. Coroutine을 이루는 구조는 크게 CoroutineScope과 CoroutineContext다. 아래 그림으로 보면 CoroutineScope이 CoroutineContext를 포함하는 관계다. 1. CoroutineScope CoroutineScope은 Coroutine이 활동할 수 있는 범위를 말한다. 예를 들어 Coroutine이 ViewModel의 생성주기 내에서만 동작하게 할 수 있고 Activity Lifecyle 생명주기를 따라서 동작하게 할 수 있..
-
Android 10 스토리지 정책 대처하기개발/안드로이드 2021. 5. 18. 20:40
targetSdkVersion 을 30으로 올리면 파일 절대 경로를 사용해서 접근 할 수 없기 때문에 개발자들은 지금부터 슬슬 절대 경로를 사용해서 접근하는 코드를 변경해야한다. 이번 포스트에서는 안드로이드 새로운 스토리지 정책을 적용한 과정을 다뤄본다. 1. 절대 경로 대신 Uri 를 사용하도록 변경 기존에는 ContentResolver 클래스를 이용해 파일을 읽어올 때 DATA 칼럼을 이용해서 파일의 절대 경로를 읽어올 수 있었다. 그런데 DATA 컬럼은 Android 10부터 Deprecated가 됐고, targetSdkVersion 30으로 올리면 DATA 칼럼으로 얻을 수 있는 절대 경로로 파일이 접근이 되지 않는다. private suspend fun loadVideoContent(): Cur..
-
움직이는 TextView개발/안드로이드 2021. 5. 11. 19:57
종종 화면내에서 움직이는 TextView를 만들어야 할 때가 있다. 이렇게 직선형태로 움직이는 애니메이션의 경우 TranslateAnimation 클래스를 이용해서 쉽게 구현이 가능하다. 아래 코드는 새로운 TextView를 만들고 layout에 추가한 다음 애니메이션을 실행한 코드다. 주목할 부분은 TranslateAnimation 코드다. CoroutineScope(Dispatchers.Main).launch { val movingText = TextView(requireContext()).apply { this.text = "움직이는 텍스트" this.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewG..