NewProjectCI 내에서 프로젝트를 실행하면 위의 모든 단계가 자동으로 수행됩니다. Android Studio를 사용하여 프로젝트를 실행한 다음 Main.kt 파일을 열고 "Run MainKt"를 누를 수 있습니다.새 패키지 이름과 앱 이름에 대한 메시지가 표시됩니다.
애플리케이션 스타일설정 Theme.kt및 설정 Color.kt
앱 아이콘 교체
원치 않는 예제 파일 삭제
실행./gradlew dependencyUpdates 및 종속성 확인
사용할 준비가
이제 새 앱 작업을 시작할 준비가 되었습니다.
노트
Android 템플릿에는. github/workflowsLint 검사, 단위 테스트 및 종속성 검사가 포함됩니다.이 프로젝트 작업 흐름을 쉽게 가져와서 몇 가지 경로 변경으로 용도를 변경할 수 있습니다. 또한 test.yml에서 Instrumentation Testing 및 CodeCoverage에 대한 주석이 달린 예제를 찾을 수 있으며 깨끗한 프로젝트를 유지하도록 조언하지만 비밀 키를 교체해야 합니다. 자신과 함께.
#스하리1000명프로젝트, 한국에서 길을 잃었나요? 한국어를 못하더라도 이 앱을 사용하면 쉽게 돌아다닐 수 있습니다. 귀하의 언어로 말하면 귀하의 언어로 번역, 검색 및 결과가 표시됩니다. 여행자에게 좋습니다! 영어, 일본어, 중국어, 베트남어 등 10개 이상의 언어를 지원합니다. 지금 사용해 보세요! https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127
무작정 회사를 떠났습니다. 남들이 말하는 *(준)정년 이라는 제도를 핑계 삼으며 말입니다. 이런 저런 핑계는 있었습니다. 그 동안 무작정 살았던 흔적들 때문에 힘이 들기도 했기에 더는 감당이 되지 않는 시간들이 되어 버렸기 때문 이기도 했습니다. - 마음에 위안을 주는 나만의 핑계 일수도-
이제 회사를 떠나 살아본 이야기를 적어 볼 까 합니다. 회사를 떠난 지 13개월 차 되어 갑니다. 지금 이 시간에도 회사를 떠나야 하는 -물론 정상적으로 이직이 되는 사람들은 제외 입니다.- 분들에게 경험 해 보지 않은 시간등에 대한 이야기를 해 볼까 합니다.
*(준)정년 : 회사가 정년을 몇년 남긴 직원에게 정년에 준하는 기준으로 회사를 떠닐 수 있도록 허가 하는 제도 정년이 도래하지 않은 상태에서 떠나기 때문에 회사의 정책에 따라 일정 금액의 보상을 하기도 합니다.
오늘 적어 두고자 하는 주제는 Paging입니다. 웹 개발을 하는 경우에는 각종 framework 등을 이용해서 데이터 조회 시 UI의 부하를 줄이기 위해서 Paging을 할 수 있도록 지원을 받습니다.
xml layout 을 구현할 때는 ListView 와 Adapter을 이용해서 별로 고민을 하지 않았던 부분이기도 합니다. 아니면 많은 데이터가 적재될 때까지 사용을 해 보지 않아서 지금 이 순간에는 느려진 화면 때문에 버려진 앱을 개발했던 것일 수도 있기도 하고요.
Paging 이란
페이징 기법(paging)은 컴퓨터가메인 메모리에서 사용하기 위해2차 기억 장치[a]로부터 데이터를 저장하고 검색하는메모리 관리 기법이다.기법이다. [1]즉가상기억장치를 모두 같은 크기의블록으로 편성하여 운용하는 기법이다. 이때의 일정한 크기를 가진 블록을페이지(page)라고 한다. 주소공간을 페이지 단위로 나누고 실제기억공간은 페이지 크기와 같은프레임으로 나누어 사용한다. - from wiki 백과
이렇게 기술하고 있습니다. 그럼 android 같은 것들은 어떻게 구현을 해야 할까요? 개발자 페이지의 내용을 보면서 구현을 해 보도록 하겠습니다.
class ListViewSource(pContext : Context) : PagingSource<Int, ViewReceiveList>() {
val context = pContext
override fun getRefreshKey(state: PagingState<Int, ViewReceiveList>): Int? { return state.anchorPosition }
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, ViewReceiveList> {
return try { val nextPage = params.key ?: 1 val viewList = dataReadPage(nextPage, params.loadSize) LoadResult.Page( data = viewList, prevKey = if (nextPage == 1) null else viewList[0].id.toInt(), nextKey = if (viewList.isEmpty()) null else viewList[viewList.size - 1].id.toInt() ) } catch (e : IOException) { return LoadResult.Error(e) } }
@SuppressLint("Range") private fun dataReadPage(nextPage: Int, loadSize: Int): List<ViewReceiveList> { val returnList = ArrayList<ViewReceiveList>() val dbHandler = DBHandler.open(context) Log.e("", "readKey=$nextPage") val rs = dbHandler.selectRcvList(nextPage, loadSize) returnList.clear() while (rs.moveToNext()) { val viewRevList = ViewReceiveList() viewRevList.id = rs.getString(rs.getColumnIndex("_id")) viewRevList.strBody = rs.getString(rs.getColumnIndex("strBody")) ... viewRevList.kakaoProfileImage = rs.getString(rs.getColumnIndex("kakao_image")) returnList.add(viewRevList) } dbHandler.close() return returnList } }
DBHandler에서는 select 구문 작성 방법
다음은 여기서 필요한 dbHandler의 select 구문 처리는 어떻게 하는 가입니다. 주의할 부분은 처음 읽어 올때와 다음 페이지로 넘어갈 때 nextKey 을 어떻게 다루어야 하는 가 입니다. 그리고 sqlite에서는 limit을 이용해서 읽어오는 데이터 개수를 조정할 수 있습니다. 그것으로 1 page 분량의 데이터만 조회를 해 오는 것입니다.
fun selectRcvList(nextId: Int, loadSize: Int) : Cursor { val sql = StringBuffer() sql.append("select _id, strBody, inPhoneNumber, chkValue, regDate, eventID, kakao_profile_image from receiveList") if (nextId == 1) { sql.append(" where _id >= $nextId") } else { sql.append(" where _id < $nextId") } sql.append(" order by _id desc") sql.append(" limit $loadSize") return db.rawQuery(sql.toString(), null) }
DataView 모델에 선언하기
다음은 DataViewModel에서 데이터를 조회하는 구현 부분입니다. viewModel에서 viewSource으로 전달하면서 context을 전달해 sqlite dbHandler을 사용 시 이용하게 됩니다.
class DataViewModels (application: Application) : AndroidViewModel(application) {
... @SuppressLint("StaticFieldLeak") val context = application.applicationContext!! val listItemsList : Flow<PagingData<ViewReceiveList>> = Pager(PagingConfig(pageSize = 10)) { ListViewSource(context) }.flow.cachedIn(viewModelScope)
...
}
Compose 화면 구성 하기
이제 리스트 조회하는 Jetpack compose 화면에서의 처리를 보도록 하겠습니다.
화면에서는 LazyColumn을 이용해서 ListView Adapter의 구현과 같이 화면에 데이터를 순서대로 조회하는 구현을 해 볼 수 있었습니다. 이렇게 구현해서 데이터 개수 1만 개가 넘는 sqlite의 데이터 조회를 앱 화면에 무리되지 않는 양으로 paging을 해 조회를 구현해 볼 수 있습니다.
이렇게 구현된 샘플 앱의 이미지 화면입니다. 알림 수신기 앱의 수신 목록 리스트 화면 입니다. 1만 개의 데이터를 다 읽어 드려서 list view을 구현을 한다면 어떻게 동작을 할까는 잘 모르겠습니다. 아무튼 이렇게 구현된 앱의 화면은 부담스럽지 않게 리스트가 스크롤되는 것을 확인할 수 있었습니다.
샘플이미지
마무리
sqlite의 데이터 조회는 이렇게 구현해 보았는 데요. 가장 근접한 room을 이용한다고 해 도 그다지 다르지 않을 거라고 생각이 됩니다. online에서 데이터를 가져온다고 해도 큰 문제없이 구현을 해 볼 수 있을 듯합니다.
#스하리1000명프로젝트, في بعض الأحيان يكون من الصعب التحدث مع العمال الأجانب، أليس كذلك؟ لقد صنعت تطبيقًا بسيطًا يساعد! أنت تكتب بلغتك، والآخرون يرون ذلك بلغتهم. يترجم تلقائيًا بناءً على الإعدادات. مفيد للغاية لإجراء محادثات سهلة. ألق نظرة عندما تحصل على فرصة! https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416