안드로이드 17

LinkZip 앱 출시 - 개인화된 링크주소 보관소

돌고 돌아 결국 링크집을 출시했다.설명 페이지 이미지가 구린건 디자이너의 힘을 빌리지 않고 내가 만들어서 그런 것. 보시고는 제작해서 주시기로 했다 ㅎㅎhttps://play.google.com/store/apps/details?id=com.linkzip.linkzip&hl=ko LinkZip - Google Play 앱어디서 봤더라 하고 잊은 게시글! 이제는 linkzip으로 관리하세요. 링크를 저장하고 마음대로 카테고리를 만들어서 관리할 수 있어요play.google.com짠. 링크를 복사하고 앱으로 들어와서 링크 추가하기를 누르면 자동으로 링크를 읽어와서링크, 제목, 요약된 메모를 입력해준다. 그룹도 맘대로 생성해서 그룹별로 링크를 저장해서 관리할 수 있고 즐겨찾기로 등록하거나저장해둔 링크를 바로 ..

잡담 2024.11.26

이직 후 근황

영상 플랫폼에서 일한다는건 꽤나 앱개발자로서 흥미롭다. 간단하게 영상 출력해보는 정도로 써본 exoplayer 가 전부였는데 컨버팅, 코덱, ffmpeg , trim , crop , 카메라 등등... 여러가지를 접해보고 있다. 여러 가지 프로젝트를 동시에 하는거보다 하나의 서비스에 몰입해서 애정을 가지고 개발하고 있는 점도 즐거움중에 하나다. 이미 라이브되고 있는 서비스다보니 업데이트 템포를 쫒아가랴 기존의 많은 코드들을 이해하고 익히는데 시간이 좀 걸렸지만 이제는 확실히 적응이 되어가는거 같다. 아직도 공부가 부족해서 헤매는 부분이 있긴하지만 어찌저찌 도움 받으며 해결해나가고 있다. 사이드 프로젝트 이야기를 좀 하자면. 이전에 하던 사이드 프로젝트는 이유는 모르겠지만 어째선가.. 팀원들이 다들 바쁘기도..

잡담 2023.11.16

Android Databinding (데이터 바인딩)

Databinding 에 대해서 알아보자. 프로젝트에서 쓰고는 있었지만 글로 정리해본 기억은 없는 것 같아서 정리하는 시간을 가지려 한다. databinding 을 사용하면 xml 파일에 data를 연결해서 activity에서 view를 따로 정의하지 않고도 xml에 연결해둔 곳으로 data를 전달하게 할 수 있는 장점이 있다. 불필요한 코드가 줄어들고 MVVM 패턴에서 쓰기에 잘 어울려서 함께 쓰는 경우가 많다. 일단 databinding 을 사용하려면 app 수준의 Build.gradle 수정이 필요하다. android { ... dataBinding { enabled = true } } //그리고 위쪽에 plugin 에도 apply plugin: 'kotlin-kapt' 라고 추가해주자. 기본 설정..

Android 2022.02.26

안드로이드 코루틴 - async와 await, LifecycleScope과 ViewModelScope

코루틴을 사용하다보면 비동기적으로 동작하는 예를 들면 네트워크 작업 같은게 있다고 예를 들어보자. 간단한 코드부터 보자. class MainActivity : AppCompatActivity() { val TAG = "MainActivity" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) GlobalScope.launch(Dispatchers.IO) { val time = measureTimeMillis { val answer1 = networkCall() val answer2 = networkCall2() Log.d(TAG,..

Android 2022.01.11

안드로이드 컴포즈 1주차 정리

1주차 코드랩에서는 기존 view 의 리사이클러뷰에 버튼이 달려있고 버튼을 누르면 레이아웃이 늘어나는 간단한 앱을 만드는 것이였습니다. 위 이미지는 코드랩에 예시로 있던 이미지인데 제가 만든것과는 조금 다르지만 거의 비슷합니다. 진행하면서 저는 제 맘대로 조금씩 변경해가면서 만들어 봤는데요. 일단 코드 전문부터 보시죠. class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { Week1JetpackComposeBasics2Theme { // A surface container using the 'backgr..

RxJava를 Event Bus 처럼 쓰기

Event Bus 라는 라이브러리는 버스 네트워크의 동작 방식과 유사하게 하나의 이벤트를 동일 채널에 연결된 모든 노드들에게 보내는 역할을 해주는 라이브러리다. 안드로이드에서는 특정 동작을 했을때 intent 하거나 fragment 와 activity 사이의 데이터 전달을 할때 bundle이나 콜백 등 이런 동작들을 할 때가 있는데 이런 동작들은 코드의 재사용성을 줄이고 코드를 복잡하게 만들어서 깔끔하지 못한 코드가 될 수 있다. 이럴때 결합도를 낮추고 UI 끼리 데이터 통신을 더 편하게 처리하는게 이벤트 버스의 개념이다. 나는 interface 를 만들어서 콜백처리하는게 코드가 증가하고 불편해서 이 개념을 빌려다 쓸때가 많다. Rxjava로 이러한 동작을 어떻게 하게 할 수 있을까? 아래 코드처럼 Rx..

안드로이드 - BottomSheet , BottomSheetBehavior

간혹 앱을 사용하다보면 위아래로 슬라이드 하면서 크기가 늘어났다가 줄어들었다가 하는 화면을 찾아 볼 수 있다. 이런 화면들 말이다. 밑의 레이아웃을 위로 당기면 높이가 늘어나고 내려도 다 사라지지는 않고 남아있는 형태의 sheet. 이런걸 만들고 싶었는데 어떻게 하면 좋을지 고민하다가 한번 만들어봤다. 언제나 그렇듯 코드로 알아보자. CoordinatorLayout 이라는게 눈에 띈다. CoordinatorLayout 은 FrameLayout 같이 좌표를 자유롭게 지정 가능하다. 한개의 parent 아래 포함된 여러개의 child view 를 behavior 라는 것을 이용해서 다양한 애니메이션 효과를 표현해 낼 수 있다. 라고 간단하게 설명가능하다 . 나처럼 바텀시트에 사용할 수도 있고 , 밑으로 스크..

Android/Android UI 2021.08.31

RxJava - Observable을 제외한 다른 생산자들

전 포스팅에서는 Observable에 대해서 알아봤다. 기본적인 생산자였는데 Observable 0개에서 n개의 데이터를 전달하는 생산자다. 기본적인 생산자로 단건(0 or 1)이 아니면 대부분 Observable을 쓴다. observer 방식으로 consumer 등록시 Observer를 구현해 전달한다. consumer 방식을 사용할 시 onNext, onComplete, onError와 onSubscribe가 있다. val observer = Observable.just(11, 12, 13) .map { if (it == 12) throw IllegalStateException() // 12에 에러 else it } observer.subscribe( { println("onNext $it") }, ..