1 – Android Jetpack Navigation with Kotlin

안녕하세요, 모두 Martin Baraya입니다 오늘은 Android에 대해 배울 것입니다

제트 팩 내비게이션 먼저 제트 팩 내비게이션이란 무엇입니까? 한 화면에서 다른 곳으로 이동하는 것과 같이 앱 주변을 탐색하는 데 사용되는 제트 팩 내비게이션 또 다른 그것은 안드로이드 개발의 근본적인 부분이며 그것을하는 데 사용됩니다 하단 탐색과 같은 버튼을 클릭하는 것보다 더 복잡한 작업 제트 팩 내비게이션 작동 방식에 대해 3 가지 주요 사항을 더 이해합니다 네비게이션 구성 요소의 일부로 네비게이션 그래프, nav 호스트 조각과 탐색 컨트롤러 그래서 안드로이드 jetpack을 만들기 시작하자 안드로이드 스튜디오에서 탐색하고 안드로이드 문서 노트에 의존한다면 Android Studio에서 탐색을 사용하려면 Android Studio를 사용해야합니다 3 단계 이상의 3 단계부터 시작하자 그래서 우리는 비어있는 활동을 가진 새로운 프로젝트를 시작할 것입니다

제트 팩이나 뭐든간에 당신이 실제로 그것을 선택할 수있는 위치를 선택할 수 있습니다 바탕 화면에 jetpack이라는 빈 폴더가 있고 우리는 Kotlin으로 시작할 수 있습니다 완료 후에 API 레벨을 최소로 선택하고 gradle은 빌드하는데 약간의 시간이 걸릴 것입니다 처음부터 그래 슬레 빌드가 완료되었습니다 우리는 단편이 필요합니다

단편을 선택할 수 있습니다 우리는 그것을 주요 조각이라고 부를 수있는 뷰 모델을 가진 조각 Kotlin과 잘 맞았 어 그래서 그 후에 우리는 두 조각 더 필요합니다 그래서 우리는 빈 조각을 선택하려고합니다 이 두 상자의 선택을 취소하십시오

그냥 끝내 줘 우리는 두 번째 조각을 위해 똑같은 작업을 할 것입니다 공백, 두 번째 조각 끝 실제로 우리는 메인 프래그먼트의 주요 활동과 첫 번째 프래그먼트 및 두 번째 프래그먼트로 작업 할 수있다 조각하지만 우리는 주보기 모델을 사용하지 않을 것입니다 gradle 종속성을 가지고 있으므로이 두 줄의 코드를 추가 할 것입니다

nav 버전을 사용하면 지금 동기화를 선택할 것입니다 괜찮아 그러면 우리는 철판 최상위 레벨을 선택하고 allprojects 내부에서 이 버전의 코드 안드로이드 지원 버전을 추가하여 버전 28을 지원하십시오 지금 동기화 선택하기 그래서 지금 우리는 네비게이션 그래프를 만들 것입니다이 창을 닫으십시오 그래서 내부 자원과 레이아웃, 우리가 할 주요 활동 XML 파일 내부 그래프 작업, 먼저 텍스트보기를 삭제합니다

우리가 필요로하지 않기 때문에 우리는 서랍 레이아웃을 추가 할 것입니다 우리가 선택할 부모님은 부모님과 일치합니다 우리는 그것의 ID를 추가 할 수 있습니다, 우리는 컨테이너 이름을 이제 알았습니다 우리는 서랍 안쪽에 tage 조각을 추가 할 수 있습니다 형세 alt 키를 누르면 ID가 추가되고 nav 호스트이므로 Android 이름을 추가합니다

프래그먼트 호스팅을위한 프래그먼트 (fragment)와 우리는 제로 (dp)와 함께 너비와 하이를 할 수있다 그리고 제약 레이아웃을위한이 위치는 바로 지금이 것을위한 것입니다 우리가 선택할 수 있도록 리소스 폴더 안에 탐색 그래프 탐색을 생성합니다 새로운 Android 리소스 파일에서 리소스 유형 탐색을 선택해야합니다 nav_graph라는 이름을 짓고 ok를 누릅니다

그리고 그들의 디자인 부분에 가자 이 테이프에서 우리는 다음과 같은 주요 조각을 선택할 수 있습니다 우리는이 두 줄을 추가 할 수있는 조각 안의 주된 활동으로 되돌아 간다 기본 탐색 호스트의 코드 = true 및 탐색 그래프, 경로입니다 이것은 우리가 네비게이션과 네비게이션 그래프 안에서 만든 네비게이션 그래프입니다

주요 활동으로 전환해야합니다 주요 액티비티에는 서랍 레이아웃이 필요합니다 그래서 우리는 서랍 레이아웃을위한 변수를 만들 것입니다 그런 다음 Oncreate 메서드에서 조각을 찾기 위해 변수가 필요합니다 ID 그래서 우리는 그 이름을 지원하는 조각과 동등한 가치로 호스트 할 가치가있다

관리자가 ID로 조각을 찾으면이 ID입니다 nav 호스트 조각에 대한 이름과 형변환은 null을 받아 들일 수 있습니다 호스트에서 컨트롤러를 탐색하고 호스트에서 컨트롤러를 탐색 한 다음 네비게이션 바를 제어하고 우리가 그것을 연결해야하는 서랍 레이아웃 이 ID 컨테이너와 연결된이 drawerlayout ID this this 이제 우리는 탐색 UI를 사용하여 탐색 컨트롤러와 서랍을 연결합니다 작업 표시 줄, 설정 작업 표시 줄 탐색 컨트롤러 이것은 활동을 나타냅니다 이 변수에 대한 컨트롤러와이 변수에 대한 서랍을 탐색하면 ctrl 키를 눌러 덮어 쓰기 메소드를 만들겠습니다 이 방법과 우리는 사용자가 뒤로 버튼을 누른 다음 반환 값을 탐색 UI로 변경합니다

서랍,이 서랍을 탐색하고 해당 서랍의 활동 ID를 처리합니다 메인 프래그먼트 이제 탐색 그래프 탐색으로 전환합시다 먼저 조각 두 개를 추가하고 두 번째 조각을 추가합니다 두 번째 조각이므로 탐색 그래프에서 그래픽을 만들 수 있습니다 이 좋은 것을 사용하여 연결 액션, 위대한 생각에 대해 우리는 하나의 조각에서 연결할 수 있습니다 다른이 ID를 사용하여이 작업 ID를 사용하여 연결할 수있는이 작업 ID 한 조각에서 다른 조각으로 이제 주 프래그먼트 내부의 디자인 파트로 전환 해 보겠습니다

버튼이 두 개의 버튼 사이에 연결이 두 버튼을 사용하여 이제 우리가 할 주요 조각 안의 주요 조각으로 바꾸자 onView라는 create 메소드를 덮어 씁니다 그리고이 방법은 단편들 사이를 연결하는 데 사용되었고, 그런 다음 set onclicklistener와 같은 단편과 버튼을 연결하면 펀드를 사용합니다

버튼 ID 및 행동 ID가있는 내비게이션으로 ID별로보기 여기 네비게이션,이 쪽 우리는 이것을 바꿀 필요가있는 두 번째 버튼에 대해 동일한 작업을 수행 할 수 있습니다 button2를 클릭하면 액션 메인 프래그먼트 – 제 2 프래그먼트 그건 사실 우리가 거의 마지막에 끝났어 우리가 탐색 그래프를 살펴보고 메인 라벨의 라벨을 바꿀 거라고 생각해 원하는 집이나 원하는 물건과 첫 번째 조각, 두 번째 조각 텍스트 첫 부분을 바꿀거야 텍스트를 원하는대로 변경할 수 있으므로 첫 번째와 두 번째와 같이 만들 수 있습니다

조각 우리는 텍스트를 두 번째로 변경하려고합니다 첫 번째 및 두 번째 조각에 디자인 첫 번째 조각을 위해 우리는 같은 디자인을 추가 할 수 있습니다 두 번째 조각도 마찬가지입니다 텍스트 크기를 텍스트 스타일에 추가하기 만하면됩니다 이 물건이 이것과 그것 인 것 인이 재료 이제 우리는 android studio 에뮬레이터를 사용하여 테스트 할 것입니다

첫 번째 조각을 선택하면 첫 번째 조각이 첫 번째 조각으로 이동합니다 두 번째 조각은 두 번째 조각을 선택합니다 시청 해주셔서 감사합니다

Android Jetpack: manage UI navigation with Navigation Controller (Google I/O '18)

[음악 재생] LUKAS BERGSTROM : 안녕하세요 일찍 일어나서 우리와 함께있어 줘서 고마워

우리 천둥의 일부 3 ~ 4 건의 프레젠테이션으로 도난 당했을 수 있습니다 이 전에 Navigation Editor가 시연되었습니다 다행히도, 우리는 조금 더 자세하게 들어갈 시간이 있습니다 이전 발표보다 여기에는 많은 훌륭한 자료가 있습니다 그리고 저는 Lukas, Architecture for Architecture Components의 제품 관리자입니다

그리고 나와 함께, 나는 이안과 세르게이를 낳았다 내비게이션 구성 요소를 구축했습니다 네비게이션 네가 그것에 대해 생각한다면, Android의 거의 모든 앱에 문제가 있습니다 해결해야합니다 하지만 지금까지는 우리에게 정말로 당신을주지 않았습니다

시작 활동 이외의 작업을 수행 할 수있는 모든 것, 여러 가지 이유로, 그것에 대해 갈 가장 좋은 방법은 아닙니다 그래서 당신이 우리의 일을 생각한다면 안드로이드 개발, 탐색 용이 실제 해결책이없는 일반적인 문제였습니다 그리고 그것은 여러분에게 많은 것들이 있다는 것을 의미합니다 혼자서 해결해야합니다 그리고 조각 트랜잭션을 커밋하는 방법, 잘하면 예외를 던지지 않고, 네비게이션이 올바르게 실행되고 있는지 테스트하는 방법과 네비게이션이 발생할 때 올바른 일이 일어나고 있습니다

깊은 링크를 앱의 여러 위치에 매핑하는 방법, 당신의 앱으로 그 딥 링크 체계를 최신으로 유지하는 법 항해 구조 변경, 장소에서 논증 전달 장소 – 다시 말하지만, 우리는 오늘날 당신이 그것을 안전하게 할 수있는 안전한 방법을 제공하지 않습니다 위와 뒤로 사용자가 올바른 방향으로 이동하도록하는 방법 특히 어려운 상황에 처한 장소 앱의 네비게이션 깊숙이 깊숙이 링크 된 누군가처럼 계층 그리고 이것이 의미하는 바는 당신이 마칠 때입니다 이러한 문제를 해결하려면 일반적으로 두 가지 방향 중 하나를지나 갔다 당신은 탐색 프레임 워크의 60 %를 썼습니다

또는 오류가 발생하기 쉬운 상용구가 많이 있습니다 어디서나 내비게이션이 앱에서 발생해야합니다 따라서 코드의 병렬 라인이 여러 개 있습니다 이러한 다양한 문제를 해결하고, 전체 구조 상당히 부서지기 쉽다 그리고 개별적으로, 이러한 문제는 꽤 다루기 쉽습니다

그러나 실제 세계의 예를 보면, 당신은 그들이 꽤 털이 빠져 나올 수 있다는 것을 알 수 있습니다 앱에 항목 화면이 있다고 가정 해 보겠습니다 딥 링크를 통해 액세스 할 수 있습니다 여태까지는 그런대로 잘됐다 그러나 누군가가 개방을 통해 화면을 탐색 한 경우 홈 화면의 앱은 뒤쪽 스택에 몇 가지 다른 화면이 있습니다

그리고 그것을 치면, 우리는 그들을 원한다 항목 화면에서 앱 밖으로 가져 가지 마세요 카테고리 화면으로 이동 한 다음 홈 화면 그리고 누군가가 앱에 깊숙이 연결된다면, 우리는이 스크린들을 종합 할 필요가있다 항목 화면을 표시하기 전에 스택에 추가하십시오

그리고 타사 개발자와 이야기하면, 그는 당신이 코드를 작성하는 중일 때라고 말했습니다 이를 위해이 스크린들을 합성하는 것 앞뒤 스택에 추가합니다 하지만 딥 링크에서만 시작해야합니다 어쩌면 당신이 해결하고있는 것처럼 느낄 수 있습니다 프레임 워크의 실패 그래서 우리가하는 문제를 해결하는 것입니다

내비게이션을 시작합니다 그리고 우리가주는 것은 시각적 인 도구입니다 앱의 탐색 그래프를 수정할 수있는 이것은 XML로 표현됩니다 그리고이를 통해 사용 가능한 탐색 세트를 정의 할 수 있습니다 행동, 장소에서 장소로 전달할 수있는 논증, 시각적 전환과 같은 것들

그런 다음 하나의 탐색 통화가 활성화됩니다 그 모든 것을 런타임에 그리고 마지막으로 중요한 것은 결코 당신이 결코 한 가지를 의미하지 않습니다 프래그먼트 트랜잭션을 다시 만지는 것에 대해 걱정해야합니다 맨손으로

[박수 갈채] 따라서 탐색 그래프는 본질적으로 무엇입니까? 가능한 목적지의 집합 사람들이 내 앱에서 도달 할 수 있습니다 그리고 그것들은 대개 화면과 일치하지만 항상 그런 것은 아닙니다 그래서 네비게이션 컨트롤을 가질 수 있습니다 또는 화면의 작은 부분의 내용을 변경하는 것만으로, 하지만 일련의 탐색 대상입니다 그리고 그들을 연결하는 행동

그리고 행동은 실제로 당신이 어떻게 장소마다 갈 수 있습니다 따라서 실제로 앱에서 점 A에서 점 B로 이동하려면, 너는 정확한 항법을 부를 것이다 런타임시 조치 그러면 어떻게 생겼는지 살펴 보겠습니다 그리고 데모로 넘어 갑시다

승인 여기에서 우리가 보는 것은 일련의 탐색 목적지입니다 이들은 단편 대상이며, 다른 옵션도 가능합니다 화살촉과 그들을 연결하는 선들 행동입니다 그리고 이러한 액션은 실제로 메소드를 생성합니다

런타임에 호출 할 수 있습니다 여러분 모두 알고 있고 사랑하기 때문에이 모든 것이 XML에 의해 뒷받침됩니다 그리고 XML과 네비게이션 에디터 같은 능력을 지니고있다 그래서 둘 중 하나를 사용할 수 있습니다 여기서 화면을 추가 할 것입니다

그리고 당신이 보는 것은 일련의 이용 가능한 활동들입니다 그리고 내 애플 리케이션에 조각 좋아요, 그래서 우리는 그들에게 옵션을 추가했습니다 실제로이 질문에 성공적으로 대답하고 게임에서이기십시오 이제 액션을 추가 할 것입니다

해당 화면으로 이동합니다 큰 그리고 네비게이션 액션은 분명히 설정할 수있는 여러 가지 옵션이 있습니다 우리는 이것들에 대해 조금 더 이야기 할 것입니다 당분간, 우리는 한 가지를 할 것입니다

그래서 우리는 그들이 축하합니다 게임이 끝났음을 의미합니다 그래서 다시 타격해서는 안됩니다 더 이상 존재하지 않는 게임으로 이것이 의미하는 바는 우리가 행동하기를 원한다는 것입니다 Match 스크린으로 갑시다

그리고 그것은 내가 모든 것을 터뜨릴 것임을 의미합니다 이 목적지와 성냥 사이의 뒤쪽 스택에 화면 따라서 사용자가 축하합니다 화면에 도달하면, 그들이 뒤를 쳤을 때, 그들은 곧장 곧장 갈 것입니다 일치 화면으로 이동합니다 제가 설정할 수있는 많은 다른 옵션들, 하지만 지금은 그 얘기 만하겠습니다

돌아가 축하 화면을 다시 살펴 보겠습니다 언급 할 또 하나의 중요한 점은 여기에 설정된 핵심 사항입니다 프래그먼트 클래스입니다 이것이 런타임에 실제로 인스턴스화됩니다 레이아웃 미리보기는 여기에서 볼 수 있습니다

Navigation Editor 탐색 그래프와 관련된 레이아웃을 알고 있습니다 레이아웃과 관련이 있다는 것을 알고 있기 때문에 그 네비게이션 그래프로, 나는 두 배가 될 수있다 해당 조각의 목적지를 클릭하십시오 레이아웃 편집기로 들어가려면 큰 내가 방금 한 모든 일은 이 새 대상을 탐색에 추가 그래프, 행동, 그 팝 동작의 변화 그 행동의 전부는 내가 할 수있는 모든 것들이다

런타임에 프로그래밍 방식으로 수행합니다 따라서 탐색 편집기, XML 또는 프로그래밍 방식, 모두 잘 작동합니다 큰 그리고 지금, 나는 이것을 이안에게 건네 주겠다 좀 더 자세히 설명해 드리겠습니다

IAN LAKE : 그러면 마음에 떠오를 수있는 첫 번째 질문입니다 와,이게 완전히 새로운 길이야 귀하의 애플 리케이션의 UI를 구조화 그리고이 종류의 질문이 즉시 제기됩니다 좋아, 좋아, 내 활동이 실제로 의미하는 바는 무엇인가

권리? 모든 종류의 앱은 출발점이 매우 다릅니다 너희들이 지금있는 곳에서 – 아니면 이틀 전쯤에 앱 UI 구성 방법 일부는 매우 활동이 무거 우며 조각이 많이 무겁고 대단히 많을 수 있습니다

다른 시스템에서 모든 이들은 분명히 매우 유효한 장소입니다 그러나 우리는 활동이 더 많은 모델로 이동하고 있습니다 앱 진입 점 소유자가되는 활동보다는 앱의 콘텐츠 중 실제로는 그 세계적인 상태를 저장하게 될 것입니다

그래서 전 세계적인 항해가 가능합니다 아래쪽 탐색, 탐색 서랍, 당신은 여전히 ​​액션 바를 사용하고 있습니다 그것들은 활동이 관리하는 종류의 것들입니다 그러나 그것은 우리가 내용을 위해 NavHost라고 부르는 것에 위임합니다 그래서 우리의 멋진 슈퍼 간단한 활동 여기

우리는 상단에 액션 바를 가지고 있습니다 아래쪽에있는 하단 탐색 장치와이 큰 흰색 상자 중간에 그것은 우리의 NavHost입니다 그래서 탐색의 세계에서, 언제 당신은 다른 목적지들 사이를 항해한다 앱에서 실제로하고있는 일 그 상자 안의 모든 것을 바꿀뿐입니다

권리? 그래서 당신은 그 밖의 글로벌 네비게이션을 가지고 있습니다 우리는 당신이 그걸 갈고리로 묶을 수있는 고리를 가지고 있습니다 실제 NavHost와 동기화됩니다 그래서이 모양의 슈퍼 간단한 버전은 무엇입니까? 글쎄, 목적지에 파편을 사용한다면, NavHost 조각을 사용하고 싶을 것입니다 여기에 활동 레이아웃이 있습니다

그것은 말 그대로 우리의 한 조각입니다 따라서 탐색 조각 종속성을 포함시켜이 작업을 수행합니다 예상대로 완전히 다른 종류의 목적지를 사용하고 있다면, 아마 다른 종류의 NavHost도 가질 것입니다 사용자 정의보기 또는 무엇이든 여기에 추가 한 항목 그들이 필요로하는 다른 항목

그러나 NavHost 조각을 위해 몇 가지 편의를 설정했습니다 행동 양식 어떤 내비게이션을 설정할 수 있는가? 그래프를 XML로 사용하고 있으므로 프로그래밍 방식으로 설정하지 않아도됩니다 그래프의 시작 지점으로 이동합니다 기본적으로

그리고 파편들에 대해서 우리는 실제로 이것을 시스템 뒤로 버튼에 연결하십시오 그래서 우리는 정확히 그것을 할 수있는 방법을 제공합니다 따라서 특별히 뒤로 누를 때 재정의 할 필요가 없습니다 탐색을 위해 우리는 파편의 마법을 사용하여 모든 것을 연결합니다

이 기본 NavHost 옵션을 통해 그래서 우리의 활동이 실제로 두 줄의 코드가됩니다 그것은 두 줄이지만 수평으로 맞지 않습니다 슬라이드에 하지만 우리가 할 일은 단지 부 풀리는 것뿐입니다 우리 레이아웃, 컨텐츠보기, 그리고 위로 버튼 연결

이제는 일반적으로 큰 작업입니다 그러나 그래프의 구조에 대해 우리에게 말했기 때문에, 우리가 할 수있는 일은 이 경우, 우리는 활동에 Kotlin 확장 방법을 사용하고 있습니다

Java 사용자를위한 정적 메소드 일뿐입니다 내비게이션을 찾을 수있게 해주는 컨트롤러는 ID를 전달함으로써이 경우, NavHost 조각의 ID입니다 그리고 그것은 우리에게 위로 가기위한 액세스 권한을줍니다 그리고 옳은 것을 할 것입니다 탐색 그래프를 기반으로합니다

실제로 실제로 많은 추가 작업을 수행 할 필요는 없습니다 우리에게 그래프를 주면, 우리는 당신을 위해 이것을 할 수 있습니다 하지만 대부분의 앱에는 단 한 가지만 있습니다 실제로 당신이 가진 것이 아닙니다 어쩌면 당신은 조금 더 많은 것을 가지고있을 것입니다

그래서 우리는 두 번째 종속성 인 navigation-ui를 설정했습니다 실제로는 정적 메서드 집합입니다 네비게이션 구성 요소를 재료 설계 요소의 이러한 것들 중 일부는 하단 nav 및 사물과 같습니다 그런 종류의 글로벌 네비게이션에서 매우 그렇습니다 공간

물론 2018 년입니다 KTX, 정적 메서드를 확장으로 변경하는 개체 클래스가 작동하는 메소드 그래서 이것은 Kotlin 사용자들에게는 정말 쉽습니다 앱에 통합하고 탐색 기능을 제공합니다 그게 뭔가있는 것 같아

거기에있는 모든 구성 요소에 존재합니다 그럼이게 어떻게 생겼어? 우리가 다시 우리의 활동을 조금 더 복잡하게 만들면, 상단에 툴바를 추가하면 아래쪽 탐색보기를 추가하십시오 이 경우에도 앱 종류는 동일합니다 이전에 네비게이션 화면에서 보았던 그러나 우리가 이러한 것들을 연결하기 위해하는 일은 두 부분으로 나뉩니다 하나, 여기 메뉴가 실제로 나옵니다

당신이 각 목적지에 가지고있는 것과 동일한 ID를 사용하는 것 따라서 각 대상에는 고유 한 ID가 있습니다 그리고 실제로 메뉴 항목에 동일한 ID를 사용할 수 있습니다 그런 종류의 암시적인 링크를 구축합니다 오, 물론 홈 메뉴 항목을 클릭하면 앱의 집에 갈 것입니다

코드에서 우리는 액션 바를 설정하려고합니다 툴바를 사용하여 그런 다음 동일한 findNavController를 수행 할 수 있습니다 NavController 객체에 액세스 할 수 있습니다 그런 다음 활동에 대한 전화와 확장 기능 만 있습니다

NavController를 사용하여 작업 표시 줄을 설정할 수 있습니다 그리고 이것은 꽤 마술입니다 그러나 실제로 그것이하는 일은 실제로 네비게이션 할 때 이벤트를받을 예정이다 NavController에서 설정 한 라벨을 사용합니다 내비게이션 그래프에서 액션 제목을 업데이트하십시오

바 그리고 우리는 또 다른 도우미 방법을 가지고 있습니다 서랍 레이아웃을 사용하여 자동으로 변경하는 경우 햄버거 버튼에서 뒤로 화살표로, 당신이있는 목적지에 따라 그래서 정말로 도움이되는 패턴들 그 것들이 동기화되어 있는지 확인하십시오 마찬가지로 아래쪽 탐색의 경우 설치 프로그램을 호출하기 만하면됩니다

NavController로 설정 호출 여기에서 양방향 동기화를 다시 시도하십시오 그래서 당신이 아래의 nav에서 물건을 클릭하는 것에 따라, 그래프를 변경하고 올바른 전환을 수행합니다 물질적 지침에 근거하여, 앱 간을 이동하면서 별도의 버튼이 있다면 실제로 하단 탐색 메뉴에서 선택한 항목을 업데이트합니다 그래서 이것은 우리에게 많은 힘을줍니다 미리 빌드 된 구성 요소를 사용하고 있습니다

다른 팀이 제공 한 것입니다 모든 사용자 정의 UI가 있습니다 그래서 그 시점에서, 우리는 정말로 갈 필요가 있습니다 NavController가 실제로 당신에게주는 것을 더 깊게 살펴보십시오 그리고 아주 간단한 경우 버튼이 있습니다

당신은 어딘가로 가고 싶습니다 우리는 편리한 메소드를 가지고있다 OnClickListener를 탐색하십시오 당신은 당신이 가고 싶은 곳의 ID를주고, 어떤 대상, 어떤 작업을 트리거 할 것인지, 우리는 당신을 위해 모든 일을 할 것입니다 자, 아마도, 이것은 아마도 조금 마법 적이기 때문일 것입니다

그래서 당신은 그것을 조금 풀 수 있습니다 이 경우 다른 확장 방법을 사용하고 있습니다 보기에 그래서 NavController에 의해 만들어진 모든 뷰에서, 실제로 nav 컨트롤러에 대한 참조를 얻을 수 있습니다 findNavController를 호출함으로써, 예상대로, 해당 nav 컨트롤러를 사용하십시오

Navigate를 호출합니다 목적지의 ID로 이동하면됩니다 또는 귀하의 그래프에있는 행동 그게 전부 야 커버 아래에,이 Navigate는 실제로 많은 일을하고 있습니다

그래서 NavController는 우리가 탐색하는 탐색기와 대화하고 있습니다 그리고 파편들에 대해서 우리는 단편 네비게이터와 이야기하고있었습니다 우리가 제공합니다 그리고 그 항해자는 너에 관한 모든 것을 알고있다 탐색이라고합니다

네가 우리에게 준 때문에 네가 갈 조각이 뭔지 알아 너의 클래스 이름 그리고 모든 조각 트랜잭션을 빌드 할 것입니다 너를 위해서 그것은 Add to Back Stack을 호출 할 것입니다

그것은 당신이하는 모든 일을 할 것입니다 정보를 네비게이션에 넣으라고 말씀하셨습니다 그래프 그래서 당신이 팝 업했다면, 그것은 가고 있습니다 그런 모든 것들을 할 수 있습니다

전환은 모두이 코드 줄에 있습니다 그리고 그것 모두는 프로그래밍 방식으로 결정될 수 있습니다 – 이 방법에 추가 옵션을 추가 할 수 있습니다 미리 결정한 사항 네비게이션 그래프의 일부로 하지만 많은 장소에서 실제로는 탐색이 아닙니다 권리? 다음 출처로 전달할 정보가 있습니다 그러기 위해서는 정보 묶음을 전달해야합니다

여기에서는 문자열과 int를 전달합니다 우리는 안드로이드 KTX에서 우리의 좋은 도움이 번들을 사용하고 있습니다 그리고 그것은 작동합니다 괜찮아 이것은 많은 일에 정말로 유용합니다

그러나 똑같은 시점에서 그다지 안전하지는 않습니다 여기에 실수를한다면, 당신은 무엇을 할 것입니까? 그래서 우리는 이것을 훨씬 쉽게 만들고 싶습니다 세르게이가 우리가 한 일에 대해서 이야기 할거야 세르게이 바실리 네크 : 네, 우리가지었습니다 Safe Args Gradle Plugin이라고하는 무언가 그리고 그것은 당신을 조금 도와 줄 것입니다

그러나 우선, 우리가 해결하려고하는 것을 보자 그리고 우리의 예를 들어 봅시다 실제로 탐색하려고하는 도움말 조각 화면 이름 인수를 전달해야합니다 그리고 선택적으로 카테고리를 전달할 수 있습니다 정수형입니다

전화 사이트로 돌아가 봅시다 음, 우리 조각에서 우리는 모든 것을 올바르게 만들었습니다 우리는 스크린을 통과했으며 적절한 유형을 가지고 있습니다 우리는 범주를 통과했습니다 적절한 유형도 있습니다

하지만 실제로, [INAUDIBLE] 동안 다른 [INAUDIBLE] ,, 당신은 화면 이름을 전달하는 것을 잊을 수 있습니다 런타임 예외가 발생합니다 그리고 나 잘못하지 마라, 고치는 것은 매우 쉽다 그러나 그것은 짜증나게 느낀다 자바 스크립트 개발자는 무엇입니까? 왜이 컴파일 시간 검사를합니까? 나도 몰라

그래, 우리가 결정 했어, 좋아, 이제 우리는이 네비게이션 그래프를 가지고있다 네비게이션에 대해 모두 설명해 보겠습니다 목적지의 주장을 포함하여 XML에서 어떻게 보이는지 봅시다 그리고 그것은 매우 간단합니다 우리는 인수 이름, s-type을 추가로 지정합니다

지정된 기본값으로 그것은 당신의 주장이 선택적이라는 것을 의미합니다 그리고 이것으로 우리는 툴링을 만들 수 있습니다 일단 행동을 취하면 이 단편 또는 다른 행동이나 활동으로 이어지며, 우리는 당신이 적절한 주장을하고 그것을 확인하도록 할 수 있습니다 이제 어떻게 보이는지 살펴 보겠습니다

우리의 Gradle 플러그인과 같습니다 이제 탐색하기 위해이 특수 객체를 사용합니다 번들에 ID를 전달하는 대신 내부적으로 주제는 동일한 ID 및 동일한 인수를 통합합니다 그러나 그 객체를 얻으려면 HomeFragmentDirection 클래스를 사용합니다 그것은 당신을 위해 생성됩니다

방향 이름 접미사를 더한 프래그먼트 이름을 제안합니다 그리고이 클래스에는 정적 메서드가 있습니다 이 대상에 대해 정의 된 모든 작업에 대해 그리고 이러한 정적 메소드는 필수 인수를 통과시킵니다 그래서 우리의 경우, 그것은 우리에게 가정 논쟁을 전달하게합니다 그리고 나중에 선택적으로 나중에 설정할 수 있습니다

당신의 다른 추가적인 주장들 그리고 모든 것이 타입 안전합니다 그 후 수신 측은 매우 간단합니다 당신은 그들이 당신을 위해 생성하는 [비천 성]을 가지고 있습니다 그것은 args 클래스입니다

그래서 우리의 경우 HelpfragmentArgs입니다 그리고 그것은 당신의 주장을 모두 가지고 있습니다 당신이 조판 방식으로 정의한 것입니다 그리고이 비교적 작은 삶의 개선으로부터, 우리는 더 깊은 곳으로 간다 IAN LAKE : 네

그래서 딥 링크는 전통적으로 무언가입니다 Android가 가장 오랫동안 지원해 왔습니다 따라서 활동에 의도 필터를 추가 할 수 있습니다 딥 링크뿐만 아니라 웹 URL을 인수 할 수 있습니다 알림 및 사물에 매우 유용합니다

앱에 다시 연결하는 것과 같습니다 그러나 이것은 훨씬 더 복잡해집니다 당신은 더 복잡한 애플 리케이션을 얻을 당신이 어떻게 이런 것들을 구조하고 어떻게 말하는지와 같이, 좋아요, 통보를해야합니다 실제로 얻는 데 필요한 모든 코드는 무엇입니까? 내 응용 프로그램의 올바른 위치에 넣고 올바른 종류의 패스 여기에 정보가 있습니까? 탐색을 위해 일류 시민의 깊은 연결 고리 우리의 구조에서

실제로 두 종류의 딥 링크가 있습니다 명백한 종류 – 그래서 이것들은 알림, 앱 단축키, 앱 위젯, 새로운 액션 및 슬라이스, 당신이 만들고 일반적으로하는 것들입니다 계류중인 의도 이 앱은 다른 앱으로 전달하는 모든 것입니다 또는 말하기를 시스템에, 나는이 특정 장소로 ​​가고 싶다

내 앱에서 사물의 암시 적 측면은 웹 URL 주변에 더 많이 있습니다 및 맞춤 구성표 URL 그래서 이것들은 당신의 앱을 실행시키는 다른 앱이 될 것입니다 그리고 우리는 이들 모두를 네비게이션 용으로 처리합니다 명시 적 딥 링크의 경우 특정 클래스가 있습니다

NavDeepLinkBuilder라고합니다 그리고 인생의 유일한 목표는 딥 링크입니다 네비게이션 그래프의 특정 목적지로 이동 ID로 그러나 그것은 모든 일을 할 것입니다 말하기는 쉽지만 조금 더 어렵습니다 실제로 모든 것이 시스템에서 작동하는지 확인하십시오

그러나 NavDeepLinkBuilder를 만들면, 당신은 맥락으로 그것을 창조한다, 당신은 그것을 준다 당신의 그래프, 목적지, 당신이 가지고있는 모든 논쟁 그러면 Create Pending Intent를 호출 할 수 있습니다 그리고 우리는 여기서 모든 일을하고 있습니다 올바른 합성 백 스택을 생성하려면, 그래프 내에서 그리고 둘 다 있다면 여러 액티비티, 부모 액티비티도 사용합니다

그리고 우리는 그것을 함께 전달하고 올바른 의도로 올바른 장소에 도착할 때 당신은이 의도를 유발합니다 그런 다음 알림을 통해 전달합니다 당신은 실제로 이것보다 더 많은 것을 할 필요가 없습니다 모든 올바른 행동 암시 적 딥 링크의 경우 – 이것들은 다시 웹 URL에 대한 링크입니다

권리? 이 경우에, 뭔가가있는 대신 프로그래밍 방식으로 생성 한 탐색 그래프에 포함하는 정보입니다 여기에 딥 링크 요소가 추가됩니다 우리가 그래프에 인수와 액션을 추가 한 것처럼, 이들은 단지 깊은 링크 일뿐입니다 물론 비주얼 에디터에서 우리 모두를 할 수 있습니다 대상에 대한 속성의 일부로 앱과 마찬가지로 간단합니다 : uri

그리고 당신은 우 리를 전달합니다 자, 이것은 정적 인 uri입니다 이것은 지루하고 바보입니다 그리고 그들이하는 하나의 URI 만 가지고있는 많은 앱이 있습니다 그래서 우리는 물론 와일드 카드를 지원합니다

따라서 와일드 카드로 *를하고 싶다면 완전히 지원됩니다 목적지에 대한 인수를 작성하려면, 실제로 중괄호를 사용할 수 있습니다 그러면 URL을 구문 분석하고 해당 값을 추출합니다 너의 args을 위해 너에게 그들을 준다

다시 같은 종류의 안전한 args, 이제 당신은 URL에서 직접 얻을 수 있습니다 그리고 재사용 할 필요가 없습니다 당신은 이미 그것이 무엇을 해야하는지 알고 있습니다 마찬가지로 두 가지를 결합 할 수도 있습니다 좀 더 복잡한 패턴을 만들고 싶다면, 완전히 할 수있다 우리는 또한 자동 검증을 지원합니다

앱 링크를 사용하여이 동음 이의어를 건너 뛰는 경우 화면 우리는 당신이 같은 종류의 일을 할 수 있는지 확인하기를 원했습니다 네비게이션도 사용하고 있다면 여기에서는 HTTP, HTTPS를 중단했다고 가정합니다 그래서 우리가 여기에서하는 일은 실제로 둘 다하고있는 것입니다

우리는 HTTP, HTTPS를 말하고 있습니다 자, 서버가 모두 HTTPS라고 가정합니다 하지만 URL을 실제로 제어 할 수는 없습니다 다른 앱도 여기에 포함됩니다 어쩌면 그들은 실수로 귀하의 URL에서 S를 가져 갔을 것입니다

우리는 여전히 그것들을 모두 지원하기를 원합니다 그래서 우리는 이것을 단지 편리한 방법으로 사용합니다 하나 대신 두 줄을 사용하는 대신 물론 사용자 정의 체계에서도 작동합니다 그래서 당신이 특별히 설정 한 자신 만의 계획이 있다면 앱의 경우 딥 링크에 첨부 할 수도 있습니다 이제 가장 중요한 부분은 우리가 공구 공간을 가로 질러 일했다

그래서 네비게이션 에디터 외에도, 우리는 또한 명시 적 합병 팀과도 협력했습니다 따라서 하나의 탐색 그래프 요소 만 추가하면됩니다 그래프를 가리키는 매니페스트의 활동, 그래프의 모든 딥 링크 그러면 올바른 의도 필터로 확장됩니다 우리는 당신을 위해 모든 것을 만들겠습니다 Android Studio에서 Manifest Merger보기로 이동하면 네비게이션 파일에서 정확한 라인을 볼 수 있습니다

그 의도 필터를 생성했습니다 그래서 이것은 우리가 이제는 하나의 진리를 가지고 있다는 것을 의미합니다 내비게이션 그래프에서 이것이 꺼내지 않을 거라는 걸 알아라 당신이 기대하는 것과 동기화 할 수 있습니다 당신이 논쟁을 바꿀 때 그것은 동기화되지 않을 것입니다

XML 파일의 이름 이 모든 것은 일을하는 중심적인 장소 중 하나입니다 우리는 이것이 훨씬 쉬워 진다고 생각합니다 기본적으로 모든 암시 적 딥 링크 종류의 사례 물론 우리는 이것이 ActionView URL 인 모든 작업을 수행합니다

웹 URL의 경우와 동일합니다 선에 직접 추가 된 것을 볼 수 있습니다 그리고 그들 중 다수가 있다면, 그것은 실제로 당신에게 정확히 어떤 라인을 말할 것입니다 여러 그래프가 연결된 경우 다른 활동으로, 그들은 모두 잘 작동합니다 그래서 다른 주제 중 하나는 모든 아키텍처 구성 요소에서 정말로 중요합니다

테스트 중입니다 네비게이션 테스트는 매우 어렵습니다 그리고 이것은 우리가 가고있는 어떤 것입니다 알파 기간 동안 계속 살펴보아야합니다 그리고 우리는 여러분의 의견도 모두 정말로 원합니다

하지만 네비게이션에서 테스트를 생각하는 것에 대해 토론하고 싶었습니다 세상은 그렇게 보일 것입니다 따라서 목적지 사이의 모든 링크가 내비게이션을 통과 한 경우 테스트하기가 훨씬 쉽습니다 고립 된 목적지 권리? 각 대상을 자체적으로 테스트 할 수 있습니다

그런 다음 발신 에지를 테스트하거나 들어오는 논쟁과 다룰 필요가없는, 오, 그것은 실제로 오른쪽 조각 거래를 했나요? 네비게이션 컨트롤러에서만 테스트 할 수 있기 때문에 수평 그래서 이것은 우리가 가고있는 어떤 것입니다 더 많은 시간을 보냅니다 어제 조각난 이야기에서 우리는 실제로 정말로 조각 자체를 만들기 위해 말했어 훨씬 더 테스트 가능합니다

그래서 일종의 패키지 거래입니다 우리는 Navigation Controller에 테스트를 구축하려고합니다 그러나 또한 시험 할 수있는 목적지를 건설하는 것을 시도한다 그래서 지금 당장 뭔가를하는 데 관심이있을 것입니다 에스프레소 테스트를하고 테스트하고 싶습니다

오, 내가 뭔가를 탐색 할 때, 그것은 올바른 장소로 이동합니까? 글쎄, 우리는 실제로 Add-on Navigator navigate 리스너를 가지고 있습니다 그래서 실제로 그것을 NavController 's에 연결할 수 있습니다 항해자와 콜백을해라, 오, 이 버튼을 클릭하면 올바른 위치로 갔습니까? 그래서 이것은 우리가 꽤 성공적으로 찾은 한 가지 방법입니다 테스트 물건에서 물건을 완전히 블랙 박스 분명히 NavController를 삽입하려면 또는 다른 방법을 사용하십시오, 그것들은 또한 완벽하게 유효한 방법입니다 설정하는 것

오늘 당신은 무엇을 가지고 놀 수 있습니까? 그리고 당신은 무엇을 가지고 놀 수 있습니까? 당신은 이틀이 걸렸습니다 당신은 그것을보아야 만합니다 권리? 알파 100-alpha01입니다

우리는 버그 수정의 긴 활주로를 제공하고 있습니다 및 개선 사항 그리고 그것은 정말로 2 개의 주요 인공물, 항해 조각 (탐색 런타임 종속성 포함) 전이 의존성 및 또한 NavHost 조각과 조각 네비게이터 조각 목적지를 사용해야합니다 내비게이션 UI 의존성뿐만 아니라, 이러한 정적 메서드가 있습니다 그리고 탐색을위한 모든 의존성에 대해, 우리는 Kotlin을 사용한다면 대시 KTX 버전을 가지고 있습니다

그래서 우리는 정말로 코 틀린을 만들려고 노력했습니다 네비게이션 세계에서 일류 시민, 특히 몇몇 것들을 위해서 프로그래밍 방식의 그래프를 작성하는 경우처럼 구성 네비게이션 전체를 읽고 있다고 서버의 그래프, 우리는 Kotlin DSL을 가지고있다 Kotlin 확장 프로그램의 일부로 훨씬 쉽게 사용할 수 있습니다 니가 코 틀린을 쓰고 있다면

그래서 할 일이 많아서 루카스 이야기를 할거야 우리가 갈 곳에 대해서 루카스 버그 스톰 : 네 한 메모, Android Studio 32 미리보기가 필요합니다

Canary 14가 이것을 사용했습니다 그리고 그것을 다운로드하고 사용해보십시오 거기에 좋은 것들이 많이 있습니다 그래서 이것은 분명히 될 것입니다 아키텍처 구성 요소의 핵심 요소 그러나 JetPack 전반적인

따라서 JetPack을 사용하여 우리가 취한 동일한 접근 방식을 취할 것입니다 아키텍처 구성 요소 빈 종이처럼, 우리는 Android 개발자 경험이 무엇을 원합니까? 그리고 훨씬 더 광범위하게 적용하십시오 탐색은 결국 일부가 될 것입니다 기본 경험의

그래서 우리가 안정되면 새로운 프로젝트를 만듭니다 Android Studio에서 기본적으로 네비게이션 편집기에서 시작하고 꽤 위대한 세상이어야합니다 JetPack을 지금 사용해 볼 수 있습니다 지금 당장은 훨씬 좋은 소개가 있습니다 안드로이드 개발의 모든 주요 부분이 무엇인지

따라서 램프를 사용하는 것이 훨씬 쉽습니다 그리고 우리는 시간이 지남에 따라 이야기를 확대하기를 고대하고 있습니다 당신이 갈 수있는 더 많은 대화가 있습니다 Android KTX 및 페이징에서 페이징, 특히, 정말 멋진 깊은 라이브러리입니다 너와 함께 묶어서 너를 위해 많은 것을 해 JetPack의 다양한 아키텍처 구성 요소 네가 그렇게한다면 나는 너를 격려한다

당신보다 더 많은 것들을 가진 목록보기 주어진 시간에 기억을 유지할 수있다 이 페이징 토크에 정말로 가고 싶습니다 그리고 우리는 당신의 피드백을 원합니다 먼저이 세션에 대한 귀하의 의견을 기다리고 있습니다 그러나 더 중요한 것은, 우리는 여러분의 의견을 원합니다

네비게이션 구성 요소에 우리가 알파에 착수하는 이유는 우리가 이렇게 생각하기 때문이 아닙니다 정말로 시험받지 못했고 시험받지 못했습니다 우리는 실제로 이것을 시험해 보았습니다 하지만 우리는 알파 우리는 많은 피드백을 받기를 원하기 때문에 API를 잠그기 전에 커뮤니티의 베타로 전환하십시오

그러니 당신이 그것을 시험해 볼 수있는 좋은 시간입니다 당신에게 맞는 것을 알려주십시오 무엇이 우리에게 알려주지 않고 직접 우리와 대화 또는 우리의 공공 이슈 추적자에 우리는 당신의 의견을 듣고 싶습니다 귀하의 의견은 정말 중요했습니다

이 여행의 모든 ​​지점에서 확실하게 우리가 올바른 문제를 공격하고 있다고 올바른 솔루션을 제공합니다 그러니 시험해 보시고 어떻게 생각하는지 말해주십시오 그리고 고마워 [박수 갈채] [음악 재생]

Android Jetpack: Introducing Navigation Component

[음악 재생] LYLA FUJIWARA : 앱 주위를 탐색하여 한 화면에서 다른 화면으로 이동하는 것을 의미하며, 안드로이드 개발의 절대적으로 기본적인 부분입니다 역사적으로 의도 또는 조각을 사용하여이 작업을 수행 할 수 있습니다

버튼을 클릭하는 것과 같은 간단한 경우, 충분히 쉬웠다 하지만 뭔가를 조금 더하고 싶다면 어떻게 할까? 복잡한? 예를 들어 하단 탐색과 같은 공통 패턴을 연결합니다 당신은 당신의 아래쪽 네비게이션 보기가 실제로 탐색 할뿐만 아니라 올바른 버튼을 강조 표시합니다 아, 그리고 그것은 백 스택을 일관된 방식으로 처리합니다 사용자가 길을 잃거나 혼란스럽지 않게됩니다

이러한 경우는 새 탐색 요소 빛난다 탐색 요소는 컬렉션입니다 라이브러리, 플러그인 및 툴링 Android 탐색을 단순화합니다 Bottom과 같은 일반적인 패턴을 설정하는 것을 넘어 네비게이션이 더 쉽고, 컴포넌트가 백 스택을 처리하고, 프래그먼트 트랜잭션, 인수 전달, 탐색 기반 애니메이션 및 딥 링크를 제공합니다 중요한 것은이 네비게이션 정보를 모으는 것입니다

앱의 시각화 된 위치에 배치합니다 네비게이션 그래프 네비게이션 구성 요소가 작동합니다 파편과 활동으로 상자의 다른 화면에서 작동하도록 라이브러리를 확장 할 수도 있습니다 사용자 정의보기와 같은 구현 탐색 구성 요소의 몇 가지 예를 살펴 보겠습니다

하나의 활동이 스와핑 된 행동 여러 조각 고려해야 할 이유가 궁금하다면 싱글 액티비티 모델, Ian Link의 탁월한 토크, 내가 노트에 링크 한 승인 탐색 구성 요소에 대해 생각하는 한 가지 방법 함께 작동하는 세 가지 주요 부분이 있다는 것입니다 조화롭게 네비게이션 그래프, NavHostFragment, 및 NavController

탐색 그래프는 새로운 자원 유형입니다 정보를 포함하고 중앙 집중화하는 XML 파일입니다 네비게이션 관련 이제이 정보를 시각화 할 수 있습니다 Android에서 사용할 수있는 새로운 탐색 편집기에서 스튜디오 3

3 이것을 생성하는 것은 그래픽 편집기이며, 잘, 네비게이션 그래프 이러한 각 스크린을 목적지라고하며, 또는 네비게이션 할 수있는 장소 이 예에서는 모두 조각입니다 이제이 화살을 여기 행동이라고 부릅니다

그들은 다른 경로를 나타냅니다 사용자가 귀하의 앱을 사용할 수 있음을 나타냅니다 액션 중 하나를 클릭하면, 당신은 임베디드 정보 전체를 볼 수 있습니다 목적지간에 전달되는 데이터, 트랜지션 애니메이션, 백 스택 조작 등이 포함됩니다 목적지를 클릭하면 딥 링크 같은 것을 볼 수 있습니다

URL 및 시작 옵션 이것은 모두 그래프의 XML의 일부입니다 좋아요 다음에는 NavHostFragment가 있습니다 이것은 레이아웃에 추가 할 조각 위젯입니다

조각 탐색을하고 있다고 가정합니다 그것은 기본적으로 안으로 및 밖으로 교환하는 창 포함 된 다른 단편 대상 네비게이션 그래프에서 퍼즐의 마지막 부분은 NavController입니다 각 NavHostFragment에는 NavController가 있습니다 Kotlin 또는 Java 코드에서 사용할 것입니다

그리고 이것이 실제로 네비게이션에 지시하는 것입니다 일어난다 그래서 이런 코드를 작성하면, 그러면 NavController는이 탐색 작업을 수행합니다 그 정보를 바탕으로 탐색 그래프에 있었고 궁극적으로 NavHost 조각에 표시되는 조각을 바꿉니다 이제 여기에 액션의 XML ID를 사용하고 있습니다

따라 가기위한 액션 화살표를 지정하려면, 하지만 더 나은 방법은 탐색을 사용하는 것입니다 구성 요소의 SafeArgs 플러그인 SafeArgs 플러그인은 코드를 생성합니다 타입 안전 네비게이션을 사용할 수있게 해준다 인수 전달

먼저 코드에 Gradle 플러그인을 추가합니다 그러면 네비게이션 그래프를 기반으로 클래스가 생성됩니다 이 방향 수업을 만들거야 액션이있는 모든 대상에 대해 모든 목적지에 대해 Args 클래스를 작성합니다 인수가있다

원래 내비게이션 진술서를 가져 가면, 생성 된 클래스에서 스왑 할 수 있습니다 너는 이렇게 생겼어 XML ID로 동작을 참조하는 대신, 당신은 당신에게 행동이 있는지 확인하고 있습니다 실제로 목적지와 관련이 있습니다 액션의 인수를 설정할 수도 있습니다

잘못된 유형으로 전달하면 코드가 컴파일되지 않습니다 당신이 통과 한 논점을 얻는 것은 쉽습니다 GeneratedArgs 클래스를 사용하기 만하면됩니다 당신은 타입에 대해서만 안전한 접근을 할 수 있습니다 올바르게 명명 된 인수 어제의 핵심 가치 쌍에 대해 걱정할 필요가 없습니다

그래서 간단한 탐색이었습니다 아래쪽 탐색을 설정하는 것에 대해 이야기 해 봅시다 탐색 구성 요소에는 다음이 포함됩니다 Java 및 KTX의 추가 탐색 UI 라이브러리 지원이있는 Kotlin의 확장 옵션 메뉴, 하단 탐색, 탐색 보기 및 탐색 서랍 또한 작업 표시 줄, 도구 모음, 축소 도구 모음

우리의 아래쪽 nav를 위해, 당신은 아래쪽 nav를자를 것입니다 XML을 정상적으로 처리합니다 ID가있는 XML 메뉴를 만들 수도 있습니다 대상의 XML ID와 일치하는 아래쪽 탐색을 원하는 네비게이션 그래프 가기 위해 그런 다음 탐색 UI를 사용하여 나머지 부분을 연결합니다

Kotlin에서는이 편리한 확장 기능을 사용합니다 이 한 줄의 코드에는 NavController가 있습니다 실제 탐색을 처리하고 머티리얼 디자인 모범 사례를 반드시 따라야합니다 백 스택 관리가 진행됨에 따라 그 위에, 그것은 강조 표시를 처리합니다 올바른 하단 버튼

이제 우리는 단지 몇 가지 파트만을 탐구했습니다 네비게이션 구성 요소의 탐색에 대한 더 깊은 트레킹을 위해, 코드 랩과 문서를 확인하십시오 모두 아래에 링크되어 있습니다 해피 코딩 및 행복 탐색

Android Jetpack: ViewModel

[제트 블래스트] LYLA FUJIWARA : Google I / O 2017에서, 우리는 라이프 사이클 라이브러리를 발표했습니다 라이프 사이클 라이브러리는 일련의 라이브러리 및 지침입니다

메모리 누출을 피하고 일반 Android를 해결하기 위해 수명주기 문제 이제 Lifecycle Library 20이 출시되었습니다 그것은 제트 팩의 일부입니다 또한 데이터 바인딩과의 새로운 통합도 포함됩니다

Lifecycle Library의 ViewModel 클래스 둘러보기입니다 ViewModel은 앱의 UI 데이터를 보유합니다 생존하는 구성 변경도 가능합니다 이것이 실제로 유용한 이유입니다 휴대 전화 회전은 구성으로 간주됩니다

변화 구성 변경으로 인해 전체 활동이 발생 함 찢어지고 다시 만들어지기 위해서 데이터를 올바르게 저장 및 복원하지 않은 경우 파괴 된 활동에서 그 데이터를 잃을 수도 있습니다 이상한 UI 버그 또는 심지어 충돌로 끝납니다 그렇다면 ViewModel을 입력하십시오

물론, 구성 변경 사항은 유지됩니다 모든 UI 데이터를 활동에 저장하는 대신, 대신 ViewModel에 넣으십시오 이제 이것은 구성 변경에 도움이됩니다 그러나 그것은 또한 일반적인 좋은 소프트웨어 디자인 일뿐입니다 Android 용으로 개발할 때 공통적으로 나타나는 한 가지 함정 많은 변수, 논리 및 데이터를 넣고 있습니다

당신의 활동과 파편으로 이것은 크고, 유지 보수가 불가능한 클래스의 엉망을 만듭니다 단일 책임 원칙을 위반합니다 ViewModel을 사용하여 해당 책임을 쉽게 나눌 수 있습니다 ViewModels은 보유에 대한 책임이 있습니다 UI에 표시 할 모든 데이터 그리고 그 활동은 오직 책임이 있습니다

해당 데이터를 화면에 그리는 방법을 아는 사람 사용자 상호 작용을 수신하지만이를 처리하는 것은 아닙니다 앱이 데이터를로드하고 저장하는 경우, 저장소 클래스를 만드는 것이 좋습니다 "App 아키텍처 안내서"에 설명되어 있습니다 ViewModel이 비대화되지 않도록하십시오 너무 많은 책임이 있습니다

이것을 피하기 위해 발표자 클래스를 만들 수 있습니다 보다 완전한 클린 아키텍처를 구현할 수 있습니다 ViewModel을 만들려면 결국 ViewModel 클래스를 확장합니다 그런 다음 UI 관련 인스턴스 변수를 이전에 귀하의 ViewModel에 귀하의 활동에 있었던 그런 다음 활동의 onCreate에서 당신은 프레임 워크 유틸리티 클래스에서 ViewModel을 얻는다

호출 된 ViewModel Provider ViewModel Provider가 액티비티 인스턴스를 가져옵니다 이것은 다음을 허용하는 메커니즘입니다 당신은 장치를 회전시키고, 기술적으로 새로운 활동을 얻습니다 예를 들어, 활동 인스턴스가 연관되어 있는지 항상 확인하십시오

같은 ViewModel를 사용합니다 ViewModel 인스턴스를 사용하면 Getters 및 Setters를 사용하여 액세스하십시오 활동의 UI 데이터 기본 생성자를 수정하려는 경우 현재 매개 변수가 없으므로 ViewModel Factory를 사용해 커스텀 생성자을 작성할 수 있습니다 이제는 ViewModel의 가장 간단한 사용 사례입니다

그러나 ViewModel 클래스도 잘 작동하도록 설계되었습니다 LiveData와 데이터 바인딩 이 모든 기능을 함께 사용하면 반응적인 UI를 만들 수 있습니다 이는 자동으로 UI를 말하는 멋진 방법 일뿐입니다 기본 데이터가 변경 될 때마다 업데이트됩니다

이것은 ViewModel에있는 모든 데이터를 가정합니다 화면에 표시하려는 내용은 LiveData에 래핑됩니다 그런 다음 데이터 바인딩을 정상적으로 설정해야합니다 다음은 데이터가있는 예제 XML입니다 바인딩 레이아웃 태그와 변수 태그 귀하의 ViewModel에 대한

그런 다음 당신의 활동이나 단편에서, XML에 사용 된 변수를 바인딩과 연관시킵니다 다음은 활동이있는 예입니다 새로운 코드 행 setLifecycleOwner가 있습니다 바인딩을 통해 LiveData 객체를 관찰 할 수 있습니다 ViewModel에서

그리고 그것은 본질적으로 LiveData가 업데이트 될 때마다 바인딩 업데이트를 허용합니다 ViewModel이 화면 상에 표시됩니다 이제 LiveData 필드를 직접 참조 할 수 있습니다 XML의 ViewModel에서 가져옵니다 이것을 바인딩 어댑터와 결합하면, 당신은 상용구의 많은 부분을 이동할 수 있습니다

당신의 활동에서 벗어난 논리 Android Studio 31에서이 기능을 사용할 수 있습니다 이상이므로 올바른 버전인지 확인하십시오 자세한 내용은 LiveData 소개 (영문)를 확인하십시오

문서에서 좋아, 몇 가지 모범 사례로 마무리하겠습니다 첫 번째 팁, 결코 ViewModels에 컨텍스트를 전달해서는 안됩니다 이것은 파편, 활동, 또는 전망 앞서 보았 듯이 ViewModels는 특정 활동 및 조각 수명주기보다 오래 지속됩니다

ViewModel에 액티비티를 저장한다고 가정 해 보겠습니다 화면을 회전하면 해당 활동이 삭제됩니다 이제 참조를 보유한 ViewModel이 생겼습니다 파괴 된 활동에 그리고 이것은 메모리 누수입니다

따라서 애플리케이션 컨텍스트가 필요한 경우 ViewModel 수명주기를 초과하면 Android ViewModel을 사용하십시오 대신 하위 클래스 여기에는 사용할 응용 프로그램에 대한 참조가 포함됩니다 OK, 두 번째 팁 ViewModels는 추가로 사용하기위한 것입니다

onSaveInstanceState에 ViewModels는 프로세스 종료 후에도 살아남지 못합니다 리소스 제한으로 인해 그러나 onSaveInstance 번들은 않습니다 ViewModels는 방대한 양의 데이터를 저장하는 데 유용합니다 onSaveInstanceState 번들,별로

ViewModel을 사용하여 최대한 많은 UI 데이터 저장 해당 데이터를 다시로드하거나 재생성 할 필요가 없습니다 구성 변경 중 한편, onSaveInstanceState는, 가장 작은 양의 데이터를 저장해야 함 프로세스가 종료 된 경우 UI 상태를 복원하는 데 필요 프레임 워크에 의해 예를 들어, 사용자의 모든 데이터를 저장할 수 있습니다 ViewModel 내에 있지만 사용자의 데이터베이스 ID 만 저장하면됩니다

onSaveInstanceState에 있습니다 바라기를 이것은 새로운 ViewModel을 시험해 보는 데 영감을주었습니다 클래스 자체에서 또는 다른 아키텍처 구성 요소와 함께 사용할 수 있습니다 ViewModels 또는 ViewModels를 사용하는 방법에 대해 자세히 알아 보려면 내가 방금 언급 한 정보의 아래의 문서를 확인하십시오 [제트 블래스트]

Android Jetpack: LiveData

LYLA FUJIWARA : Google I / O 2017에서, 우리는 라이프 사이클 라이브러리를 발표했습니다 메모리 누출을 피하기위한 일련의 라이브러리 및 지침 일반적인 Android 수명주기 문제를 해결할 수 있습니다

라이프 사이클 라이브러리는 20을 기록했습니다 또한 이제는 Jetpack의 일부이며 새로운 통합이 포함됩니다 데이터 바인딩 이것은 Lifecycle 라이브러리의 LiveData 클래스 둘러보기입니다

LiveData는 관찰 가능한 데이터 홀더 클래스입니다 또한 라이프 사이클을 인식합니다 예제를 살펴 보겠습니다 당신은 당신의 UI를 가질 것입니다 이 LiveData 객체를 갖게 될 것입니다

화면에 표시 할 데이터가 있습니다 UI는 LiveData 객체를 관찰합니다 이는 UI에 업데이트 알림이 표시되기를 원하는 것과 같습니다 따라서 LiveData가 변경되면, UI가 알림을 받고 UI가 표시됩니다 새 데이터로 다시 그릴 수 있습니다

간단히 말해서 LiveData를 사용하면 데이터와 동기화되어 화면에 어떤 일이 일어나고 있는지 자, 실제 코드가 있습니다 LiveData 객체는 일반적으로 ViewModel 클래스에 보관됩니다 ViewModel이 무엇인지 확실하지 않으면 걱정할 필요가 없습니다 비디오를 확인하십시오

액티비티를 만들고 ViewModel을 만들고 있다고 가정 해 보겠습니다 사용자 프로필 이 사용자 LiveData 객체가 있습니다 이 객체는 User 객체를 포함합니다 자, 이제 너의 활동을 끝내고, ViewModel 클래스에서 해당 LiveData를 가져옵니다 LiveData에서 호출을 관찰합니다

첫 번째 인수에 대해서는 UI를 전달하고, 이 경우 활동 두 번째 인수는 "관찰자"이며, 이것은 단지 콜백 일 뿐이다 여기에서 코드를 호출하여 UI를 업데이트합니다 이제 LiveData를 호출하여 변경할 수 있습니다 setValue 또는 postValue

UI 스레드에서 실행중인 경우 setValue를 사용하고, 백그라운드 스레드에서 실행중인 경우 postValue를 사용하십시오 setValue 또는 postValue가 호출 될 때, LiveData는 활성 관찰자에게 알립니다 Android Studio 31 이상을 사용하는 경우, LiveData와 ViewModel은 Databinding과 함께 작동합니다 일반적으로 View Model을 바인딩하고 바인딩 할 것입니다

ViewModel에서 설명하는 XML 레이아웃으로 비디오 이제 ViewModel과 Databinding을 연결 한 후 레이아웃을 추가하려면이 단일 행 변경을 추가하면됩니다 귀하의 LiveData가 올바르게 관찰되도록 XML에 바인딩 될 때 이제 XML의 참조를 ViewModel에 포함시킬 수 있습니다 LiveData는 함께 저장됩니다

데이터 바인딩을 사용하는 경우 더 이상 수동으로 설정하지 않아도됩니다 이 관찰자들 따라서이 LiveData 옵저버 코드를 만드는 대신 내가 너에게 보여 줬던 그 모든 상용구를 제거하십시오 대신, TextView의 XML은 LiveData를 참조합니다 직접

LiveData를 다른 관찰 가능 항목과 다른 점 그것은 또한 생명주기를 인식하고 있다는 것입니다 즉, UI가 화면에 있는지, 오프 스크린 또는 파괴 LiveData는 UI 상태에 대해 알고 있습니다 당신이 Observe를 부를 때 당신이 그것을 통과했기 때문입니다 OK, LiveData의 라이프 사이클의 이점은 다음과 같습니다

인식 그러니 당신의 활동이 스크린 상에 없다고 가정 해 봅시다 LiveData는 쓸모없는 UI 업데이트를 실행하지 않습니다 액티비티 또는 UI가 삭제되면, 관측 연결은 자동으로 정리됩니다 LiveData

따라서 우연히 방아쇠를 당길 수는 없습니다 오프 스크린이거나 파괴 된 활동이나 단편 자체를 다시 그립니다 이것은 인터페이스와 클래스들 때문에 부분적으로 가능하다 또한 라이프 사이클 라이브러리에서 프레임 워크 클래스에서 사용됩니다 이 수업은 – 라이프 사이클은 Android를 나타내는 객체입니다

라이프 사이클 및 상태; LifecycleOwner는 다음과 같은 객체에 대한 인터페이스입니다 AppCompatActivity와 같은 라이프 사이클이있다 또는 활동 프래그먼트; 마지막으로 LifecycleObserver, 이것은 라이프 사이클을 관찰하기위한 인터페이스이다 좋습니다, 그래서 LiveData는 수명주기 관찰자입니다 그것은 당신의 필요를 추상화합니다

활동 또는 요소 화 된 수명주기를 직접 처리 할 수 ​​있습니다 이것이 바로 LiveData로 작업 할 때 필요한 기본 사항입니다 왜 유용할까요? 좀 더 복잡한 사용법에 대해서도 언급 할 것입니다 방은 LiveData와 잘 작동하도록 제작되었습니다 방은 자동으로 LiveData 객체를 반환 할 수 있습니다

데이터베이스 데이터가 변경되고 데이터가있을 때 알림 백그라운드 스레드에로드됩니다 이렇게하면 UI를 쉽게 업데이트 할 수 있습니다 데이터베이스가 업데이트됩니다 소개의 방에 대해 더 자세히 알아볼 수 있습니다 룸 비디오

또한 LiveData는 map, switchMap 및 MediatorLiveData라는 클래스 사용자 정의 변환을위한 것입니다 지도를 사용하면 LiveData A의 출력에 함수를 적용 할 수 있습니다 결과를 LiveData B로 다운 스트림 전파하십시오 예를 들어, LiveData를 사용하여 사용자 객체를 가져올 수 있습니다 대신에 사용자의 결합 된 문자열을 출력합니다 이름과 성

SwitchMap 함수 변환 지도와 많이 비슷하지만 매핑 기능을 위해 값 대신 LiveData를 방출합니다 예를 들어 여기에 사용자가 많은 경우, 아마도 룸 데이터베이스에 저장되어있을 것입니다 이러한 사용자를위한 검색 기능이있을 수 있습니다 switchMap을 사용하면 사용자 ID에 대한 LiveData를 갖게됩니다 ID가 변경 될 때마다 사용자 조회 기능 이 ID로 호출됩니다

이제 LiveData는 새로 발견 된 사용자를 참조합니다 LiveData 좋아, 그럼 얼마나 많은 시간이 있더라도 이 조회 함수를 호출하고 다른 LiveData를 가져오고, 귀하의 UI는 LiveData 결과를 한 번만 관찰하면됩니다 switchMap의 힘입니다 이제 자신 만의 맞춤 데이터를 만들고 싶다면 변형, 당신은 봐야한다 MediatorLiveData 클래스에서

MediatorLiveData에는 추가 및 제거 방법이 포함되어 있습니다 원본 LiveData 개체 그러면 이벤트를 결합하고 전파 할 수 있습니다 이러한 모든 소스의 다운 스트림 LiveData 시작하기는 간단합니다

그러나 실험을위한 많은 잠재력이있다 이 수명주기를 관찰 할 수 있어야합니다 바라기를 이것은 당신에게 뭔가를 키우는 데 영감을주었습니다 그리고 언제나처럼, 문서는 링크되어 있습니다

Android Jetpack: Room

[로켓 블래스트 끄기] FLORINA MUNTENESCU : Google I / O 2017에서 우리는 방으로의 문 열어, 끈기 SQ Lite를 통해 추상화 레이어를 제공하는 라이브러리 Room은 버전 2

0에 도달했으며 Jetpack의 일부입니다 신고 한 버그를 수정하고 일부 기능을 추가했습니다 너는 물었다 방의 주요 구성 요소를 살펴 보겠습니다 지원되는 쿼리를 확인하고, 마이그레이션 구현 방법 및 테스트 방법 데이터베이스 작업

사용자 테이블을 원한다고 가정 해 보겠습니다 너는 그 테이블의 모든 줄을 원해 사용자 클래스의 인스턴스가됩니다 해당 실체로 수업에 주석을 답니다 테이블 이름을 정의하지 않은 경우 클래스 이름을 사용하고 싶다

tableName으로 필수 기본 키를 설정하고, 및 선택적 열 정보 그러나 열의 이름을 변경하려는 경우에만 가능합니다 그렇지 않으면 필드 이름이 사용됩니다 그리고 그게 다야 방이 사용자 테이블 작성을 담당합니다

너를 위해서 이것이 엔티티가 완료되는 방법입니다 그러나 데이터베이스의 데이터에 액세스하는 방법이 필요합니다 간단히 말해 데이터 액세스 개체 인 DAO를 사용합니다 보다 정확하게 인터페이스를 생성하십시오

@Dao 주석을 달아주세요 이 인터페이스에서 모든 메소드 선언 데이터베이스 작업에 필요한 해당 SQL 쿼리로 주석을 달기 방에서 이러한 방법을 구현합니다 지원되는 쿼리는 삽입, 업데이트, 삭제, 쿼리, 및 rawquery rawquery를 제외한 모든 항목을 검사합니다

컴파일 타임에, 당신이 잘못된 쿼리를 작성하면 즉시 확인할 수 있습니다 엔티티와 DAO를 하나로 묶는 클래스 방 데이터베이스입니다 방 데이터베이스를 확장하는 추가 클래스를 만듭니다 주석 달기 엔티티와 해당 DAO를 선언하십시오

쿼리를 자세히 살펴 보겠습니다 쿼리 및 rawquery의 반환 유형 전체 엔티티 일 수도 있지만 필드의 서브 세트 일 수도 있습니다 구아바 또는 옵션으로 작업하는 경우 Java 유틸리티 패키지에서 리턴 유형으로 사용하십시오 즉, 값이없는 경우 귀하의 질의를 만족 시키려면 귀하의 질의 Optionalempty 또는 Optional

absent를 반환합니다 어떤 옵션을 선택 하느냐에 따라 다릅니다 이 모든 쿼리는 동기식입니다 동일한 스레드에서 실행됨을 의미합니다 당신이 그 (것)들을에서 방아쇠를 당기는 당신

방은 오류를 던져 모범 사례를 따르도록 보장합니다 주 스레드에서 쿼리를 실행하는 경우 따라서 Android에서 스레드를 처리하는 기본 방법을 사용하십시오 그리고 당신이 메인 스레드에서 벗어 났는지 확인하십시오 비동기 쿼리도 지원하는 방 LiveData 또는 RXJava로 작업 할 때 게다가 LiveData를 반환하는 쿼리, 또는 [? flowable,?]는 관찰 가능한 질의이고, 매번 알림을 받음을 의미합니다

테이블의 데이터 또는 테이블 업데이트 데이터베이스 스키마를 변경할 때마다 열이나 표를 추가하거나 이름을 변경했기 때문에, 당신은 그 변화를 다루는 방법을 데이터베이스에 알릴 필요가있다 데이터베이스 클래스에서이를 수행하려면 먼저 데이터베이스 버전을 업데이트해야합니다 둘째, 마이그레이션 클래스를 구현합니다 이전 스키마에서 마이그레이션을 처리하는 방법을 정의하는 새로운 것에 그런 다음 세 번째로 해당 마이그레이션 클래스를 추가합니다

데이터베이스 필터의 매개 변수로 사용합니다 마이그레이션을 트리거 한 후 룸 마이그레이션을 확실히하기 위해 스키마의 유효성을 검사합니다 올바르게했다 마이그레이션을 처리하지 않으려면, 데이터베이스 데이터를 보존 할 필요가 없으며, fallbacktodestructivemigrations를 호출하십시오 데이터베이스를 구축 할 때

파괴적인 데이터베이스 재현 on 특정 버전에서만 호출 출석 정지 그리고 해당 버전의 번호를 제공하십시오 따라서 엔티티, DAO, 데이터베이스 및 마이그레이션이 있습니다 어떻게 테스트합니까? DAO를 테스트하려면 Android JUnit을 구현해야합니다 in-memory 데이터베이스를 만드는 테스트

메모리 내 데이터베이스는 데이터를 보유합니다 그 과정이 살아있는 동안에 만, 이는 모든 테스트 후에 데이터베이스가 파괴된다는 것을 의미합니다 비동기 쿼리를 테스트하려면 instanttaskexecutorrule을 사용하십시오 각 작업을 동 기적으로 실행합니다 앱의 구현에서 결국 다른 클래스의 DAO를 참조합니다

이러한 클래스를 단위 테스트하려면 DAO를 조롱하십시오 또는 가짜 버전을 구현하십시오 여기에 또 다른 팁이 있습니다 에스프레소 테스트를 수행하기 위해 비동기 쿼리를 사용하는 코드, 계수 법을 확장하다 작업을 시작하고 마칠 때 작업을 계산합니다 마지막으로 마이그레이션을 테스트하는 것을 잊지 마십시오

먼저 데이터베이스 스키마를 탐색하고, 다른 유용한 테스트 규칙 인 마이그레이션 테스트를 사용하십시오 이 클래스를 사용하면 이전 버전의 데이터베이스를 만들 수 있습니다 각 마이그레이션을 실행하고 유효성을 검사하십시오 당신이해야 할 일은 데이터가 이전 버전에 삽입했습니다 이전 후에도 존재합니다

승인 그래서 이것을 요약 해 봅시다 상용구가 적은 코드 컴파일 타임 검사 된 쿼리 마이그레이션을 쉽게 구현할 수 있습니다

높은 수준의 테스트 용이 그리고 데이터베이스 유지 확인 주 스레드에서 멀리 떨어져 일하십시오 모든 Room의 품질은 데이터베이스로 작업하는 것이 더 쉽고 즐겁습니다 당신은 더 나은 애플 리케이션을 제공합니다 [로켓 발사 끄기]

Modern Android development: Android Jetpack, Kotlin, and more (Google I/O 2018)

[음악 재생] 안녕, 안녕 다른 이야기에 오신 것을 환영합니다

현대 Android 개발에 오신 것을 환영합니다 나는 우리가 시작하기 전에, 이 태양은 나보다 훨씬 밝다 그래서 우리는 이것을해야 할 수도 있습니다 그래서 우리는 안경을 끼울 수 있습니다 슬라이드를 보지 않거나 안경을 착용하지 마십시오

그리고 아무것도 보지 마라 그래서 재미있을 것입니다 CHET HAASE : 오늘이 일이 어떻게 진행되는지 살펴 보겠습니다 현대 Android 개발에 오신 것을 환영합니다 나는 안드로이드 툴킷 팀의 Chet Haase입니다

Romain Guy : 저는 Android 프레임 워크 팀의 Romain Guy입니다 뭔가를 내리십시오 CHET HAASE : 그리고 우리는 많은 것들에 대해 이야기 할 것입니다 이미 알고 계시 겠지만 우리에게 일어났습니다 우리가 당신에게 조언과 정보를 어떻게 제공했는지 오래 동안 안드로이드를위한 좋은 앱을 개발할 수 있습니다

그리고 그 정보는 수년에 걸쳐 변했습니다 새로운 기능, 새로운 API, 플랫폼의 새로운 성능, 모든 종류의 것들 그리고 약간 혼란 스럽습니다 정보 검색을 할 수 있습니다 일부 문서 사이트에서도 가능합니다

정말로 정보를 얻지 못한다 현재 많은 상황에 적용됩니다 그래서 우리는 그것을 모두 함께 포장하고 싶었습니다 2018 년에 중요한 일들에 대한 우리의 견해가 있습니다 Android에 대해 생각해보십시오

ROMAIN GUY : 올해 안드로이드는 10 년, Chet가 말했듯이, 시대에 뒤 떨어진 많은 정보가 있습니다 때로는 스택 오버플로에 대한 블로그를보고, 누군가 뭔가에 대해 정말로 화가났다 우리가 10 년 전에 말했던 화 내지 마 괜찮아 모든것은 변한다

상황이 진화합니다 우리가 당신을 싫어하기 때문이 아닙니다 우리가 틀렸기 때문이 아닙니다 그것은 다른 시간 이었기 때문입니다 – 다른 필요, 다른 장치 그래서 우리는 그 중 일부에 대해 이야기 할 것입니다

차이점을 이해하고 있는지 확인하십시오 사물을하는 현대적인 방법 그리고 일을하는 오래된 방법, 우리는 슬라이드에 약간의 힌트가있다 따라서 슬라이드 중 일부는 이와 같이 보일 것입니다 우리가 시작하자 이제 타임 라인을 살펴 봅시다

이것은 일종의 안드로이드 역사입니다 2008 년에 10이 나왔다가 분명히, 우리는 몇 년 동안 많이하지 않았다 [웃음] 나는 거기에서 무슨 일이 일어나고 있는지 모른다 나는 거기에 넣을 것들을 생각할 수 없었다

최적화, 최적화, 최적화 그리고 나서 Android Studio가 나왔습니다 그게 뭐야? ROMAIN GUY : 웹에 따르면, 우리는 나쁜 API를 개발하는 데 바빴다 [웃음] CHET HAASE : 분명히, 그것들은 당신이 원하는 것이 아니 었습니다 그래서 우리는 지난 몇 년 동안 더 잘 해냈습니다

그래서 Android Studio가 나왔고 Eclipse에서 이제 Android Studio에 더 풍부한 기능을 구축했다 우리가 그 당시에 할 수 있었던 것보다 예술이 나왔다 그것은 KitKat에서 기본적으로 꺼졌으며 Lollipop에서만 실행되는 런타임입니다 우리의 권장 사항 중 일부에서 보게 될 것입니다

정말로 변화했기 때문에 거기에서, 시간이 지남에 따라, 우리가 당신을 바라 보는 방식 코드를 작성해야합니다 사전 Dalvik 정보가 꼭 필요하지는 않습니다 예술 세계에 적용한다 Recycler보기가 해제되었습니다 List의 더 나은 버전이기 때문에 중요합니다

더 많은 유연성을 가진보기 그러나 또한 우리는 부품을 출시하기 시작했습니다 연결 라이브러리에서 연결이 끊어졌습니다 플랫폼 릴리즈에서 이 새로운 기능을 사용할 수 있습니다 모든 릴리스에서 애플리케이션에서 네가 신경 써 줬어

잠시 후, 우리는 Constraint Layout Android Studio에 내장되어 있습니다 반대로 실제로 API를 디자인하는 더 풍부한 방법 XML을 직접 타이핑하는 다양한 방법을 제공합니다 코 틀린 – 작년에 나온 것 같아요 나는 모른다 일부 IO 회의 또는 뭔가

아키텍처 구성 요소 – 이는 작년에 발표되었습니다 가을에 10 새로운 일을하는 방식 해결하려고하거나, 적어도 도움을줍니다

안드로이드와 관련된 많은 복잡한 문제들, 커뮤니티로부터 피드백을받는 것 이 API를 사용하여 당신을 쉽게 해줍니다 그것이 전체 목표입니다 Studio Profilers, 훨씬 더 풍부한 방법 성능 측정 항목이 실제로 무엇인지 알아 내기 위해 귀하의 응용 프로그램에 대한 KTx, 나온 확장 라이브러리 몇 달 전에 코 틀린에게 그리고 최근 페이징 라이브러리가 나왔습니다

이번 주에 10을 기록했습니다 그래서 이것은 일종의 일종의 범위입니다 그것은 시간이 지남에 일어났습니다 나는 2008 년과 2013 년 사이에 더 많은 일이있을 것이라고 확신합니다

나는 그것이 무엇인지를 기억할 수 없다 알았어 우리는 도구로 시작할 것입니다 다음은 당신이 알고있는 도구입니다 이 도구 인 Hierarchy Viewer를 얼마나 많이 사용하셨습니까? 오, 꽤 잘됐다

모두는 아니다 그래서 그것은 Hierarchy Viewer라는 도구였습니다 그것은 SDK의 일부입니다 독립형 애플리케이션이었습니다 그 전에 실제로 다른 버전이있었습니다

그게 내가 원래 주말에 쓴 것이 었어 플랫폼을 최적화하기위한 디버깅 도구가 필요했기 때문입니다 그리고 웬일인지, 우리는 SDK에서 그것을 출하하기 시작했다 가장 빠른 도구는 아니 었습니다 그것은 가장 좋은 도구가 아니 었습니다

사실,이 사람은 우습게도, 실제로 자고있는 시간을 많이 보내고있었습니다 그들의 책상에서 그것은 매우 흥미 롭습니다 전에는 그 기술을 전혀 사용하지 않았습니다 그것은 효과가 없었습니다

이제 우리는 그것을 훨씬 더 나은 것으로 대체했습니다 레이아웃 검사기 (Layout Inspector) Android Studio의 일부입니다 좋은 장점 중 하나는 한 번에 여러 검사 훨씬 더 빠릅니다

따라서이 도구를 사용하지 않았다면 사용하십시오 그것은 당신의 계층 구조를 분석하는 매우 쉬운 방법입니다 임베딩 및 마지 닝과 같은 다양한 디버깅, 심지어는 실적이 좋지 않을 수도 있습니다 서로 겹친다 코드를 프로파일 링하는 오래된 방법이 또 하나 있습니다

이것을 추적보기라고합니다 따라서 Trace View는 이미 존재하는 도구입니다 2007 년에 Android 팀에 합류했을 때 주변에있었습니다 꽤 오랫동안 여기에서 우리는 이클립스 내부의 동작을 봅니다

이전에는 독립형 도구였습니다 Trace View에서 우리가 가진 문제점 중 하나는 원래 버전은 계장 된 프로파일 러였습니다 그래서 많은 오버 헤드가있었습니다 그것은 호출 된 모든 메소드에서 실행 중입니다 그것은 해석 모드에서 실행 중이었습니다

그래서 그 숫자를 정말로 믿을 수는 없습니다 그래서이 방법은 3 밀리 초가 걸렸습니다 그건 사실이 아니야 그 방법은 실제로 그것보다 훨씬 빠르다 당신이 할 수있는 유일한 일은 상대 시간을 비교하는 것입니다

다른 방법들 사이 심지어 방법이 네이티브 코드를 호출하면 네이티브 코드가 영향을받지 않습니다 그래서 네이티브 코드를 호출하는 모든 메소드 숫자가 너무 잘못 되었기 때문에 비뚤어졌습니다 수년에 걸쳐 샘플링을 추가했습니다 이 도구에 프로파일 링

하지만 여전히 사용하기가 어려웠습니다 우리 중 몇 명만이 내부적으로 사용하고있었습니다 왜냐하면 그것은 그렇게 위대하지 않았기 때문입니다 몇 년 후 다행히 Systrace를 도입했습니다 따라서 Trace View를 통한 Systrace의 큰 이점 당신에게 포괄적 인 시각을 제공한다는 것입니다

전체 시스템의 추적보기는 얼마나 많은 시간을 알려줍니다 애플리케이션 내부의 모든 코드 라인에 지출하고 있으며, 원래 하지만 때로는 성능 문제 시스템의 다른 곳에서 왔습니다 어쩌면 너는 무언가에 막혔을거야 그것은 다른 과정에 있습니다

그래서 Systrace는 당신에게 필요한 견해를 제공합니다 그 전에 우리는 완전히 눈이 멀었습니다 이제는 새로운 프로파일 러가 있습니다 Android Studio에 도입되었습니다 나는 그들이 3

2 또는 31의 일부라고 생각한다 나는 정말로 기억하지 않는다 그러나 프로파일 러 탭으로 이동하면, 당신은 CPU의 실시간 그래프를 보게 될 것입니다 응용 프로그램과 추억 사용 [INAUDIBLE] 귀하의 응용 프로그램의

그리고 CPU 그래프를 더블 클릭하면, 당신은 그 견해에 도달 할 것입니다 Trace View와 매우 유사합니다 다시 말하지만 훨씬 빠르며 네이티브 코드 프로파일 링, 인스트루멘털 프로파일 링, 샘플링 프로파일 링 및 심지어 Systrace 이것은 지금부터 사용해야 할 도구입니다 이것이이 그래프의 모습입니다

그래서 우리는 이제 4 개의 그래프를 믿습니다 우리는 CPU 1, 메모리 1, 네트워크 1, 에너지 1 내가 네트워크를 사용하지 않아서 무엇을위한 서버인지는 확실하지만 너희들이 그걸 이해하고 그것을 잘 활용할 것입니다 그리고 그것이 마치 CPU 프로파일 러에 들어갑니다 그래서 당신은 화염 그래프를 얻습니다 데이터를 분석하는 여러 가지 방법이 있습니다

제가 좋아하는 것은 화염 그래프입니다 모든 기능을 채색 할 것입니다 서로 다른 색상의 전화 그들이 얼마나 많은 시간을 들여야하는지 붉은 색이나 진한 오렌지색으로 보이는 것들 애플리케이션 내부의 병목 현상입니다 따라서 응용 프로그램 내에서 드릴 다운하는 아주 쉬운 방법입니다

병목 현상을 식별 할 수 있습니다 이것이 네이티브 프로파일 러입니다 Android 80부터 사용할 수 있으며, 그래서 그것을 실행하려면 오레오 이상이 필요합니다 그리고 나는 새로운 메모리 프로파일 러에 대해 간략하게 언급했다

그래서 우리는 메모리 추적을하기 위해 DDMS라는이 도구를 사용합니다 다시 말하지만, 그것은 독립형 도구였습니다 Eclipse 플랫폼에서 빌드되었습니다 그렇지 않기 때문에 사용하기가 정말 어려웠습니다 신분증의 일부

어떤 시점에서 ID에 다시 추가했습니다 그리고 그것은 거의 유일한 좋은 길이었습니다 당신은 당신이 찾고 있는지 여부를 볼 수 있습니다 잘못된 곳에서의 기억 예를 들어, 드로잉을하고 있는지 여부 또는 레이아웃 또는 터치 처리를하고 있는지 여부를 나타냅니다

이제는 Studio의 일부입니다 그래서 당신이 보여주는이 그래프를 볼 때, 실시간으로, 메모리 사용량, 당신 다른 버킷도 볼 수 있습니다 그래서 당신이 얼마나 많은 기억을하는지 말해 줄거야 Java 힙에서 사용하거나 얼마나 많은 기본 메모리 당신이 사용하고있는 그래픽 메모리의 양 따라서 문제의 출처를 정확히 찾아 낼 수 있습니다

화면에서 보듯이 슬라이스를 만들 수도 있습니다 그 시간 동안 모든 할당을 보여줄 것입니다 스택 추적을 볼 수 있으며 참조를 폴드 할 수 있습니다 가장자리 프로파일을 덤프 할 필요가 없습니다 에지 [INAUDIBLE] 사용

jhat을 실행하고 이러한 끔찍한 모양의 웹을 볼 필요가 없습니다 사용하던 UI 아직 모든 일을 처리하지는 못하기 때문에 때때로 jhat에 가야하지만 아주 좋은 방법입니다 기억력이 있다면 시작할 수 있습니다 애플리케이션 내부의 문제

레이아웃 디자인이 이렇게 사용되었습니다 그것은 기사 디자인입니다 흥미로운 이유는 안드로이드가 나왔을 때, 모두에게 XML 로의 전환을 유도하는 것은 매우 어려웠습니다 많은 분노한 개발자를 기억하십시오 UI를 빌드하는 Java 코드를 작성하려고했습니다

그리고 이제, 우리는 당신에게 이것을주었습니다 따라서 이것은 비주얼 레이아웃 비주얼 에디터입니다 이제 화가 많이 들었습니다 누가 시각 도구가 아닌 XML 만 사용하고 싶어하는지 그래서 우리는 단지 새로운 것을 발명해야만한다고 생각합니다

당신이 이것을 사용하기 시작하게하는 미끼로서 CHASE HAASE : 나는 단지 상수라고 생각한다 엔지니어들이 무엇이든 불만 스러울 것입니다 당신이 그들에게주는 새로운 옵션 로망 가이 : 특히 프랑스 인 경우

그리고 도구의 새로운 기능에 대해 이야기하는 경우, 모션 레이아웃을위한 새로운 도구를 살짝 봤습니다 제약 레이아웃을 사용하여 애니메이션을 만들 수 있습니다 Nicola와 John은 다시 그것을 보여줄 것입니다 생각, 내일 또는 목요일 그러니 그 이야기를 찾아보십시오

그래서 우리는이 비주얼 디자이너가 오직 시작 우리가 할 수있는 일은 훨씬 더 많습니다 우리는 아직 모든 것을 구축 할 시간이 없었습니다 그러나이 새로운 모션 레이아웃 편집기는 다음 단계입니다 시각적 인 피드백을 통한 애니메이션 제작 – 실시간 시각적 피드백 – XML을 사용하는 것보다 훨씬 좋음 런타임 및 언어, Chet

잘 지내세요 그래서 달빅 너무 슬퍼하지 마세요 Dalvik은 굉장 했어 그것은 무엇을하도록 설계 되었는가? 공간에 최적화되어 있었습니까? G1이 나왔을 때, 192 메가 였고, 그 중 48 개가 64 세 – 작은 부분이 응용 프로그램에 액세스 할 수있었습니다 CHET HAASE : 매우 적은 양의 메모리 실제로 응용 프로그램에서 사용할 수있었습니다

그래서 Dalvik은 런타임으로, 자체 또는 모든 힙에 대해 많은 메모리를 차지합니다 그리고 물건을 저장해야하는 곳 따라서 장치가 좋아짐에 따라, 기억이 커지면서 반드시 그런 것은 아니었다 도매 방식으로 최적화 할 수있는 능력을 갖추어야한다 우리가 필요했던 것

어떤 시점에서 그들은 기본적으로 시작되었습니다 우리가 말했던 것처럼 Art 런타임의 처음부터, KitKat에서 나왔고 Lollipop에 기본으로 설치되었습니다 그러나 Dalvik 시대에, 우리는 기본적으로 그로부터 나온 권고안을 가지고 있었다 할당과 같은 것들 때문에 정말 비싸다 힙을 걸 으면서이 물건을 넣을 장소를 찾아야했습니다

그리고 힙은 시간이 지남에 따라 파편화되었다 그것은 비록 그것이 많은 공간을 거기에서 가지고 있었다고해도, 그것은 연속적으로 많은 공간을 가질 필요는 없었습니다 그 물건을 넣을 장소를 찾으러 그리고 컬렉션도 정말 비쌌습니다 결국 당신은 시간이 지남에 따라 물건을 배정 할 것입니다

그리고 나서 결국 기억을 잃을 것입니다 그리고 그렇게 할 때 – 당신이 애니메이션의 중간에있을 때, 당신은 UI 스레드를 사용하고 있습니다 비트 맵을위한 공간을 할당해야합니다 공간을 찾을 수 없으므로 GC를 더 잘 실행하십시오 아마 2 ~ 3 개의 프레임을 잃을 것입니다

Dalvik은 실제로 모든 항목을 수집해야했기 때문에 더 이상 참조없이 그래서 우리가 가진 권고 중 일부는 기본적으로 가능할 때마다 물건을 할당하지 마십시오 그것은 틀림없이 우리가 프레임 워크 안에서 삶을 살아가는 방법입니다 우리는 당신의 내적 루프이기 때문에 응용 프로그램 개발자가 그렇게하는 것이 좋습니다 내가 생각하는 권고 중 하나 지역 사회는 타격을 본 적이있다

열거 형을 사용하지 않았습니까? 열거 형 구조가 밝혀 졌기 때문에 – 클래스 구조체는 int 객체보다 훨씬 큽니다 권리? 그리고 우리는 ints를 온통 사용합니다 메모리 양을 최소화하려고하기 때문에 우리는 또한 시간을 최소화하려고 노력한다 우리는 새로운 객체를 만들고 있습니다 원시 타입을 전달하는 것

우리는 또한 원시 타입이 멋지다고 말했다 침대는 시원하고, 수레는 시원합니다 대문자 I 정수, 그렇게 차갑지 않다 또한 차가운 것이 오토 박싱입니다 표준 콜렉션 클래스를 사용할 때, 이 정보에 많은 정보가 저장되어 있다면 원시 타입과 그것들은 autoboxed in and out되고 있습니다

또는 다른 패턴과 접근 방식을 사용하는 경우 이러한 것들을 객체로 생성하게하고, 너는 우리가 가진 도구에서 볼 수있다 그 시간에, 너는 오토 박싱과 즉석 배정 그리고 결국에는 GC가 시작됩니다 너는 조금 더 싫어한다 현대 세계에서 우리는 이제 예술을 가지고 있습니다

성능에 최적화되어 있습니다 그것은 메모리 최적화를 위해 처음부터 만들어졌지만, 성능을 위해 최적화 할 수 있습니다 그리고 이것은 메서드 호출 항목 측면에서 성능입니다 할당 및 컬렉션에 최적화되어 있습니다 빠른 할당 및 수집 몇 가지 이유가 있습니다

그 중 하나는 대형 물체를 위해 별도로 마련된 것입니다 그래서 모든 것을 같은 힙에 놓는 대신에, 큰 물체를위한 공간을 찾아야 만한다 모든 작은 것들 중에, 그것은 모든 비트 맵을 넣습니다 별도의 힙에 모든 큰 개체가 전체적으로 표시됩니다 큰 오브젝트를위한 공간을 찾는 것이 더 쉽습니다

그러면 작은 개체가 별도의 힙에 들어갑니다 또한, 정말 멋지다, 그것은 조각 모음을 할 수 있습니다 Dalvik은 조각 모음을 할 수 없으므로 시간이 지남에 따라 할당됩니다 결국에는 충분한 공간이 없었습니다 당신이 필요로하는 것을 위해서

그래서 당신은이 애매한 오류 메시지를 얻을 것입니다 그곳에는 메가 바이트가 없기 때문에 단지 48 메가 바이트 무료 당신이 깨닫기 전까지는 많은 의미를 갖지 않습니다 아마도 힙이 조각난 것 같습니다 우리는 그것에 대해 많은 것을 할 수 없습니다

이제 할 수 있습니다 Art에서는 힙을 조각 모음합니다 이전 릴리스에서는 응용 프로그램이 조각 모음을 수행 할 때 조각 모음을 수행했습니다 백그라운드에 있었다 이제 응용 프로그램이 실제로 조각 모음을 수행 할 수 있습니다

뿐만 아니라 전경에 있습니다 그래서 더 좋은 방법 이제 우리가 가진 권고 사항은 필요한 경우 할당하고 할당하십시오 괜찮아 사실 열거 형을 사용하면 걱정하지 않습니다

어서 [CHEERING] 분명히, 당신은 돌보아, 그래서 당신이 그들을 즐기시기 바랍니다 우리는 여전히 원칙적으로 사용하지 않는 경향이 있습니다 많은 프레임 워크 코드와 API에서 로망 가이 : 나는 그것을 사용한다 CHET HAASE : 그들은 때때로 거기에있다

그러나 내가 말했던 것처럼, 우리는 여전히 내부 루프입니다 그래서 우리는 더 보수적 인 경향이 있습니다 반드시 애플리케이션 코드에 있어야합니다 적절한 유형을 사용하십시오 나는 여전히 원시적 인 타입이 정말로 멋지다고 생각한다

하지만 그걸 알아? 오브젝트 유형이있는] 렉션을 사용해야하는 경우에는 정상입니다 그러나이 휴대 전화는 여전히 제약이있는 기기라는 점에 유의하십시오 메모리는 48 또는 64 메가 사용할 수 없습니다, 하지만 다른 모든 것들과 여전히 공유되고 있습니다 사용, 해당 시스템에서 실행 중 또한 배터리는 정말 중요합니다

배터리를 사용하는 것이 중요합니다 가능한 한 오랫동안 언제나 끊임없이 일을하고 있다면 만약 당신이 끊임없이 쓰레기를 만들고 그것을 모으고 있다면, 아트는 훨씬 빠릅니다 그러나 예술은 여전히 ​​실제로 작업을해야합니다 할당하고 수집하고, 모든 것들은 힘을 사용합니다

따라서 배터리가 전력을 사용한다는 것을 기억하는 것이 좋습니다 어쩌면 네가 보수적 인 태도로 너는하려고하는거야 또한 프레임 워크처럼 내부 루프를 인식해야합니다 병목 현상 단단한 루프에서 일을하지 마십시오

성능에 문제가 발생할 수 있습니다 ROMAIN GUY : 안드로이드가 시작되었을 때, 팀은 자바 프로그래밍 언어 응용 프로그램을 만들려면 그 많은 이유가있었습니다 주요한 것은 매우 인기있는 언어였습니다 수백만 명의 개발자가 이 언어를 사용하는 방법을 알고있었습니다 훌륭하고 자유로운 도구가 많이있었습니다

따라서 빠른 채택을 위해 정말 도움이되었습니다 Android 플랫폼의 시간이 지남에 따라, 우리는 때때로, 새 버전의 언어를 채택하는 데 약간의 시간이 걸립니다 우리는 최근 자바 프로그래밍 언어 버전 18 나는 그들이 1

10에 달하고 있다고 생각한다 그러나 그것은 수년 동안 우리를 섬겼습니다 작년에 다행히도 우리는 완전한 지원을 발표했습니다 Kotlin 프로그래밍 언어 용 얼마나 많은 사람들이 지금 그것을 사용하고 있습니까? [CHEERING] 괜찮아

CHASE HAASE : 그들을 지켜라 하나 둘 셋 넷 ROMAIN GUY : 거의 모두 5 번 이상 이었어 로망 가이 : 우리는 몇 가지 슬라이드를 유지할 것입니다

그래서 우리는 작년에 그것을 2017 년에 발표했습니다 우리는 JetBrains와 긴밀히 협력하고 있습니다 우리는 도구가 Kotlin과 잘 작동하는지 확인합니다 우리가 필요한 기능에 액세스 할 수 있는지 확인하십시오 전반적으로, 우리는 그것을 좋아하기 때문에 코드를 읽고 쓰기가 더 즐겁다

우리는 코드를 읽고 쓰는 데 너무 많은 시간을 소비합니다 그건 중요합니다 여기에 몇 가지 예가 있습니다 그들은 읽기가 어려울 것입니다 그러나 여러분 모두가 Kotlin을 작성하는 방법을 알고 있기 때문에 괜찮습니다

이러한 예제는 Kotlin 확장에서 가져온 것입니다 그래서 나는 그들을 정말로 빨리 지나갈 것이다 나는 명명 된 매개 변수를 좋아한다 메소드의 오버로드를 여러 개 만들 필요가 없습니다 또는 빌더 모든 시간

정말 유용한 인라인 함수를 사용할 수 있습니다 확장 프로그램을 만들 때 또는 그래픽을 만들 때도 코드, 예를 들면 우린 그걸 봤어 연산자 운영자에게 과부하가 걸릴 수 있습니다

당신은 그것에 조심해야합니다 이 문제를 상당히 악용 할 수 있습니다 일단 X로 불리는 고정 연산자를 만들었습니다 왜냐하면 그것은 벡터에 대한 교차 곱처럼 보이기 때문입니다 그러지 마

그것은 끔찍한 생각입니다 나는 끔찍한 생각이기 때문에 그것을 GitHub에 넣었습니다 소멸 할당을 할 수 있습니다 따라서 POJO가 있으면 컴포넌트 1, 2, 3 등으로 불리는 메소드 그런 다음 여러 개의 과제를 수행 할 수 있습니다

한 줄의 코드로 이것은 Android KTx의 예입니다 우리는 정수를 파기합니다 따라서 이동 및 마스킹을 수행 할 필요가 없습니다 바이트와 ​​정수의 데이터 클래스가 있습니다

모든 게터와 두 개의 문자열을 만드는 매우 쉬운 방법 같음 및 해시 코드 그래서 당신은 할 필요가 없습니다 IntelliJ에 알려주기 위해 바로 가기를 입력해야합니다 그것은 우리가 저지르는 게으름의 수준입니다 Kotlin에 도달했습니다 그래서 환상적입니다

그리고 마지막으로 그렇습니다 나는 그저 나에게, 내가 할 수있는 일을 부르고 싶었다 너무 매력적 Kotlin은 매우 영리하다 그들이 언어로 내린 의사 결정 그리고 그들 중 하나는, 예를 들면, lambda가 함수의 마지막 매개 변수 일 때, 그들은이 특별한 구문을 사용할 수 있습니다 너는 람다를 통과 할 필요가 없다

함수에 대한 매개 변수로 중괄호를 열 수 있습니다 바로 코드를 입력하십시오 외모와 느낌이 훨씬 자연 스럽습니다 우리가 새로운 것을 디자인 할 때 지금하고있는 일 중 하나입니다

플랫폼의 API – Android P로 시작 – 우리는 Java API가 이러한 규칙으로 가득 차 있음을 확인합니다 단일 추상 메소드 인터페이스가있을 때, 우리는 인터페이스를 사용하는 매개 변수 매개 변수 목록의 끝 부분에있다 Kotlin 개발자가 이익을 얻을 수 있도록 언어의이 특정 기능에서 그리고 우리는 점점 더 많은 것을 할 것입니다 지원 라이브러리 및 향후 API에 대한 정보를 제공합니다 그래서 아직 Kotlin을 사용하지 않는 당신들에게는, 프로젝트에는 Kotlin과 Java가 모두 포함될 수 있습니다

모든 신청서를 Kotlin으로 전환 할 필요는 없습니다 응용 프로그램에 추가하는 다음 클래스는 Kotlin, 또는 기존 클래스를 변환 할 수 있습니다 우리는 1 톤의 린트 수표를 가지고 있습니다 누락 된 것이 있으면 Tor에게 알려주십시오 그것은 당신 앞에서 꽤 많이 쓸 것입니다

그리고 바로 저지하십시오 보푸라기 수표를 쓸 때 일종의 기계입니다 Android 확장 프로그램을 확인하십시오 다시 한번 Jake Wharton의 이야기가 있습니다 나는 목요일 아침에 그것에 대해 생각한다

흥미로운 점에 대해서 이야기 할 것입니다 스타일 가이드도 만들었습니다 그래서 아직 자바 가이드를 사용하고있는 여러분 – 내 말은, 우리는 실제로 하나도 가지지 않았다는 것입니다 하지만 소스 코드를 따르고 있다면, 당신은 아마 당신의 들판에 M의 접두사를 붙일 것입니다 우리가 그렇게하지 않는다는 것을 알면 행복하게 될 것입니다

더 이상 Kotlin 첫째, 우리가 정말로 그것을 좋아하지 않기 때문에, 그리고 네가 정말로 할 수 없기 때문에 어쨌든 Kotlin의 속성 구문 때문입니다 우리는 또한 상호 운용성 가이드가 있습니다 코드를 작성하려고한다면 그것은 두 자바 개발자 모두가 소비하기위한 것이다 및 Kotlin 개발자, [INAUDIBLE] 자바 코드 또는 코 틀린 코드 작성 우리는 당신에게 설명 할 수있는 가이드가 있습니다

API 작성 방법 그래서 그들은 두 언어로 자연스럽게 사용될 수 있습니다 그리고 그것들은 우리가 스스로 따라가는 지침입니다 플랫폼 및 지원 라이브러리에 포함 된 새로운 API CHASE HAASE : API에 대해 이야기 해 봅시다 우선 Android의 레이아웃, 그 (것)들의 낱단이있다, 그러나 이들 사람들이 시간이 지남에 따라 다루는 중요한 것들입니다 우선 AbsoluteLayout이있었습니다

그리고 사용하기 쉽습니다 왜 그렇지 않습니까? 그럼 정확히 어디서 볼 수 있을까요? 너는 그걸 원해, 그렇지? LinearLayout, 당신은 그 것들을 중첩 할 수 있습니다 원하는만큼 깊게 UI를 정확하게 얻을 수 있습니다 너 찾고있어 FrameLayout, 괜찮습니다

당신이 그것을 곁눈질로 본다면, AbsoluteLayout과 같은 것입니다 로망 가이 : 그게 우리가 말할 수있는 가장 좋은 것입니다 괜찮아 GridLayout, 밝혀졌습니다 그것은 사용하기에 조금 복잡합니다

그러나 우리는 그것을 이해할 수 있으며 유연성이 매우 뛰어납니다 그곳에 그리고 RelativeLayout, 우리는 그것이 비싸다고 들었습니다 우리가 사용해야 할 것인가 아닌가? 그래서 현대 세계 다음은 AbsoluteLayout에 대한 우리의 생각입니다

우리는 단지 그것을 분명히하고 싶습니다 [LAUGHTER AND APPLAUSE] CHET HAASE : 이것이 더 이상 사용되지 않는 유일한 이유 하나의 중요한 클래스가 있기 때문입니다 하위 클래스는 – ROMAIN GUY : 아니, 더 이상 사용되지 않습니다 사용되지 않습니다 CHET HAASE : 더 이상 사용되지 않습니다

승인 글쎄, 우리는 그걸 사용하지 않았고, 그 정도면 충분하다 웹보기가 AbsoluteLayout에 있기 때문에 우리가 취할 수있는 것처럼 죄송합니다 사용하지 마십시오

잘하면, 당신은 아니에요 LinearLayout, 여전히 실제로 사용하는 것이 좋습니다 특히 간단한 경우 네가 깊고 깊게 중첩되어 있다면, 그때 당신은 깊고 깊게 틀렸고, 더 나은 해결책이 있습니다 우리는 슬라이드의 맨 아래에 그것을 올릴 것입니다

FrameLayout, 간단한 사용 사례에서도 괜찮습니다 너는 거기에 그 한가지를 넣어야한다 적절한 패딩과 마진을 유지해야합니다 그것은 그곳에있는 일종의 것입니다 ROMAIN GUY : 그리고 FrameLayout의 더러운 비밀 이 경우 AbsoluteLayout이라는 것입니다

여백을 올바르게 사용하면 기본적으로 AbsoluteLayout을 가지고 있지만 그렇게하지 마십시오 그것들을하지 마십시오 그러지 마 GridLayout– 사실은 문제를 제외하고 도구와 함께 사용하도록 의도 된 실제로 도구를 썼다 로레인 가이 : 우리가 잊은 것 같아

아마도 가장 좋은 레이아웃이 아닐 것입니다 당신의 상황을 위해 그 주위에 머리를 감쌌다 승인 거기에 더 나은 해결책이있을 수 있습니다 RelativeLayout– 우리는 ConstraintLayout이, 일반적으로 더 나은 해결책입니다

나는 그것을 능력의 부분 집합으로 생각할 것이다 RelativeLayout 그것은 많은 기능을 가지고 있습니다 아이들의 상대적 위치 선정, 서로에 대해 그러나 그것은 상대적인 위치 지정 방법을 더 많이 가지고 있습니다 가이드 라인 및 그들이 수행 한 새로운 기능 중 일부 ConstraintLayout에서 작업

제가 설명하기를 좋아하는 방식은 ConstraintLayout입니다 작동하는 RelativeLayout입니다 CHET HAASE : 또한 그것에 대해 가장 좋은 점은 도구와 밀접하게 통합되어 있습니까? 그것은 같은 사람들에 의해 직렬로 작성되었습니다 도구를 사용하면 디자인 도구가 실제로 작동 함을 의미합니다 잘 레이아웃, 그 반대, 잘, 그들은 API를 만들었고 도구는 결코 따라 잡지 못했습니다

그건 거기에 해당하지 않습니다 우리는 20을 언급했다 아직 20이 아닙니다

나는 그것이 곧 20이라고 말할 것이다 그래서 20에 등장 할 것을주의 깊게 살펴보십시오 이번 주 존과 니콜라의 이야기 아마도 그 물건들 중 일부는 넘어갈 것입니다

AbsoluteLayout에 대한 최종 생각 로레인 가이 : 그냥 알기 쉽습니다 그래서 UI 툴킷에 클래스가 있습니다 AdapterView는 여러 위젯의 기본 클래스입니다 그래서 ListView, GridView 및 갤러리

그리고 그들은 수년 동안 우리를 잘 봉사했습니다 그들은 몇 가지 문제가있었습니다 그들은 유지하기가 어려웠다 GridView는 사용되지 않았다고 생각합니다 꽤 많은 앱으로 꽤 오래 동안, 어쩌면 응용 프로그램에 대한

갤러리는 수평 ListView와 비슷합니다 오랫동안 사용하지 않을 것이라고 확신합니다 그리고 우리는 잠시 그것을 확실히 보지 못했습니다 어쨌든 내가 너라면 네가 사용하지 않을거야 아마 작동하지 않습니다

여기에 몇 가지 문제가 있습니다 따라서 AdapterView에는 어댑터가 있으며, 어댑터가 데이터 세트간에 인터페이스됩니다 및보기 자체 어댑터에서 할 수있는 일 중 하나 데이터 세트의 변경 사항을 뷰에 알립니다 문제는 당신에게만 알릴 수 있다는 것입니다 거친 변화의 당신이 할 수있는 말은, 어이, 뭔가 바뀌 었습니다

너무 불합리하게도 ListView에서 우리는 변경된 사항을 파악하려고하는 많은 코드가 있습니다 네가 우리에게 말할 수 있다면 좋지 않을까? 너 아마 알고 있기 때문에? 우리에게 말할 수없는 API를 만들었습니다 그래서 그것은 바보 같은 짓입니다 우리는 당신에게이 패턴을 따르라고 말하기도했습니다보기 보유자

그래서 View Holder – 그리고 그것은 하나입니다 내가 많은 사람들을 보았던 것들 중 View Holder에 대한 온라인 미친 제품이기 때문에 당신이 써야 할 번호판 그것은 실제로 매우 중요했습니다 나는 돌아가서 우리의 오래된 회담 중 하나를 들여다 보았다 보기 홀더 패턴을 사용하면 초당 10 프레임 추가 당신은 T-Mobile G1에서 ListView를 스크롤하고있었습니다

그 당시에는 많은 문제가있었습니다 더 이상 필요하지 않습니다 그러나 RecyclerView 덕분에 API의 일부로, 이제 어쨌든 무료로 받으실 수 있습니다 그리고 마지막으로 애니메이션 AdapterView에서는 애니메이션을 사용할 수 있습니다

그래서 예를 들어, ListView 항목이 데이터 세트에서 사라졌습니다 그리고 아이템을 사라지게하고 싶습니다 나머지 항목은 붕괴되어 갭을 닫습니다 ListView를 사용하여이 작업을 수행 할 수 있습니다 이 코드를 약간만 작성하면됩니다

Chet는 몇 년 전에 블로그 포스트를 썼습니다 [웃음] ListView 애니메이션 중 하나였습니다 우리는 당신에게 보여주는 일련의 비디오를 가지고있었습니다 다른 것들을하는 법 ROMAIN GUY : 이것은 코드의 일부입니다

미래 옵저버 만 이해하면됩니다 과도 상태 및 측정 및 메모 및 애니메이션이 포함됩니다 다소 어려웠습니다 그래서 이제 대신 RecyclerView가 있습니다 감사하게도

그래서 이것은 단지 바보 같은 응용 프로그램입니다 처음 RecyclerView를 실제로 사용했을 때 몇 달 전 이었어 그것은 훨씬 쉬웠다 정말 좋았어요 RecyclerView의 다른 버전을 만들 수있었습니다

RecyclerView에 대한 좋은 점 여러 위젯을 사용하는 대신 데이터 세트에 대해 효과적으로 다른 레이아웃입니다 단일 RecyclerView에 대한 레이아웃을 지정할 수 있습니다 이 코드는 레이아웃이 다른 동일한 코드입니다 RecyclerView의 관리자 CHASE HAASE : 나는 또한 그것들 모두가 수직적 이었지만 실제로는 가로 배치

몇 년 동안, 사람들은 우리에게 수평을 어떻게 할 것인지를 물었습니다 오, 쉽습니다 CHASE : 수평 ListView ROMAIN GUY : ListView에서 회전을 설정하기 만하면됩니다 그런 다음 모든 터치 이벤트를 차단해야합니다

그들을 회전 시키십시오 그리고 아마 몇 가지 더 많은 API가 있습니다 무시할 필요가 있기 때문에 어쨌든 그것은 쉽다 그래, 비밀 가장 쉬운 방법은 휴대 전화를 돌리기 만하면됩니다 90도

시스템의 일부로 더 쉽게 사용할 수 있습니다 최신 릴리스의 UI 향상 ROMAIN GUY : 그리고 RecyclerView에 관한 좋은 점 중 하나 – 훨씬 더 나은 방법으로 많은 일을합니다 우리는 페이징을 가지고 있고 우리는 프리 페칭을 가지고있다 API가 더 좋습니다

레이아웃 관리자를 변경할 수 있습니다 자신의 레이아웃 매니저를 작성할 수 있습니다 그러나 애니메이션 또한 무료로 제공됩니다 그래서 우리가 방금 본 코드와 같습니다 특히 RecyclerView를 사용하면 얻을 수있는 것 세밀한 변경입니다

아이템이 있다면 우리에게 말해 줄 수 있어요 제거 된 항목 항목이 추가되면 어떤 항목이 추가됩니까? 변경된 항목의 범위, 아니면 모든 것이 바뀌 었다고 말할 수 있습니다 이것은 당신과 우리에게 훨씬 좋습니다 좋아

좋아 파편 옛날 우리는 그 파편들 정말 복잡했습니다 또한이 문제를 해결할 것입니다 그래서 우리는 반드시 모든 것이 정확하거나 가지고있는 것은 아닙니다

사람들이 필요로하는 모든 API가 있으므로 개선점을 넣으십시오 플랫폼 릴리스로 그런 다음 응용 프로그램은 해당 플랫폼에 장치가 출시되었습니다 따라서 현대적인 조언은 플랫폼 버전을 사용하지 않는 것입니다 우리는 이후 모든 코드를 이식했습니다

지원 라이브러리에있는 모든 수정 사항을 작성하려면, 우리는 이제 더 이상 사용하지 않는 조각들을 사용했습니다 핵심 플랫폼에서 그래서 거기에 사용하지 마십시오 지원 라이브러리 또는 Jetpack 버전 조각을 사용하십시오 우리는 더 많은 선을 거기에두고 있습니다

그래서 그것들을 사용하고, 우리는 계속하고 있습니다 개선하기 이번 주에 파편에 관한 이야기가 있습니다 – 내일 아침에 CHASE HAASE : 내일은 Adam과 Ian으로부터 그러므로 사물에 대한 더 많은 정보를 듣기 위해 그것을 확인하십시오

우리가하는 일과 길 조각을 사용하는 것이 조금 더 쉬워야합니다 그 중 하나가 새로운 탐색 컨트롤러입니다 그래서 체크 아웃하십시오 그것은 파편에 일종의 빌드입니다 그것은 그들에게 의존하지 않습니다

의존성은 없지만 그렇습니다 만들고 탐색 할 수있는 기능을 구축하십시오 응용 프로그램의 화면 사이 활동은 단편과 매우 밀접하게 관련됩니다 예전에는 기본적으로 Android 애플리케이션 여러 활동들로 구성되었습니다

이것이 모든 안드로이드 애플리케이션의 애플리케이션 흐름이었습니다 우리는 개발자가이 작업을 수행 할 것을 기대했으며 개발자는이 작업을 수행했습니다 앱의 한 화면에서 이동하려는 경우 다른 사람에게, 당신이 의도를 시작하면, 당신은 새로운 창을 얻습니다 거기에 당신을 데려 오기위한 창 애니메이션이 있습니다 거기 있네

새로운 접근법은 가능한 한 단일 활동을 사용하는 것입니다 그것은 사용자에게 훨씬 풍부한 경험을 선사합니다 그 창문 애니메이션들 – 음, 그들은 움직이고 있어요 하지만 그들은 재미있는 일을하지 않습니다 사용자를 돕는 아무 것도하지 않습니다

응용 프로그램의 한 상태에서 다른 상태로 전환합니다 대신 기본적으로 완전히 다른 창 너가 실제로 할 수있을 때 볼 수있게된다 단일 활동 방식을 사용하여 동일한 Chrome 유지 응용 프로그램 주위 같은 행동을 할 수도 있습니다 바에서 콘텐츠가 아래로 바뀌면서 또는 더 풍부한 애니메이션을 사용하십시오

핵심 플랫폼 애니메이션 또는 조각으로 가능 애니메이션 그러니 계속해서 활동을하십시오 신청서에 상황이있을 수 있습니다 다른 진입 점이있는 곳, 특히 누군가가 당신의 신청서에 올 수있는 길이가 길다 와

그런 다음 별도의 활동을하는 것이 적절합니다 그것이 그 정보를 폭로하는 방법입니다 하지만 그렇지 않으면 단일 활동을 사용해보십시오 조각은 단일 활동 응용 프로그램에는 필요하지 않지만, 하지만 그들은 이것에 많은 도움을 줄 수 있습니다 특히 최근 개선 된 점이 몇 가지 있습니다

그리고 네비게이션 콘트롤러도 마찬가지다 건축물 여기 오래된 조언이있었습니다 몇 년 전– OK, 2016 년 기본적으로 2 년 전 Dianne Hackborn이 게시했습니다

G +에서 우리는 대개 응용 프로그램 개발자로부터이 질문을받습니다 여기서 우리는 애플리케이션 아키텍처 그들은 그들의 신청서에서 사용해야합니다 그리고 우리의 대답은 항상, 우리는 상관하지 않습니다 우리는 당신이 아닙니다

우리는 귀하의 신청서가 어떻게 작동하는지 알지 못합니다 우리는 최고의 아키텍처를 모릅니다 귀하의 신청서에 대해서는 귀하가 직접 결정하십시오 그리고 보통 다음과 같은 질문이 있습니다 예, 알 겠어

하지만 어떤 아키텍처를 사용해야합니까? 그래서 Dianne은 기본적으로 이렇게 말했습니다 이 모든 것을 한 번 우리는 상관 없어 우리가 가지고있는 구성 요소들 – 콘텐츠 제공자, 활동, 서비스 – 이들은 시스템 수준의 구성 요소입니다 그들은 주변의 건축물이 아닙니다

당신은 당신의 어플리케이션을 빌드합니다 그러므로 적절한 것을 만드십시오 귀하의 응용 프로그램에 대한 새로운 조언은 실제로, 우리는 당신에게 몇 가지 권장 아키텍처를 제공하게되어 기쁩니다 사람들이 적어도 좋아할 것이라고 밝혀 졌기 때문에 말이되는 몇 가지 일반적인 조언, 우리는 지금 우리가 그것을 가지고 있다고 믿습니다

특히, 아키텍처 구성 요소의 경우, 우리는 우리가 많은 의미가 있습니다 우리는 사용하기 쉬운 API를 가지고 있습니다 당신은 그 주위에 구축 할 수 있습니다 우리는 당신이 이것을 사용하도록 요구하지 않습니다 자신에게 맞는 아키텍처를 사용하십시오

하지만 핵심 아키텍처가 있습니다 우리는 일해야한다고 믿습니다 새로운 애플리케이션을 시작하는 경우, 팀에 새로운 개발자가 있다면 말이됩니다 우리가 일한 이유 중 하나 Android 아키텍처 구성 요소 포함 어려운 문제를 해결하는 것이 었습니다 가장 어려운 문제 중 하나는 Android 수명주기였습니다

그리고 우리의 대답은, 당신이해야 할 모든 것입니다 이 도표를 이해하고 암기합니다 그리고 누군가 외부에서 자신의 버전을 만들었습니다 그 다이어그램은 실제로 이렇게 보입니다 당신이 이것을 보았다면 이해하기가 훨씬 쉽습니다

따라서 기본적으로 알아야 할 모든 것이 있습니다 항상 네 머리 속에 문제는 기본적으로 당신의 활동에 많은 방법들을 만들어라 라이프 사이클을 추적하고 관리 할 수 ​​있습니다 당신은 창조와 시작과 멈춤을 다루고 있습니다

다시 시작하고 일시 중지하면 물건을 다룰 것입니다 뿐만 아니라 파괴에서 Create에서 너무 많이 사용하고있을 것입니다 당신은 아마 경주 조건뿐만 아니라 당신의 시작과 당신의 중지에서 누출, 그리고 당신은 아마 일시 중지 및 이력서에서 그 일을하고있을 것입니다 게다가

그리고 당신은 왜 당신이 파괴에 대해 무시하고 있는지 정확히 알지 못합니다 그러나 누군가는 당신이 아마해야한다고 말했습니다 그래서 우리도 그렇게 할 것입니다 그러는 동안 실제로는 수명주기 상태 만 알고 있습니다 당신이 그 방법들을 오버라이드한다면

우리는 당신에게 그 질문을하는 방법을주지 않았습니다 우리는 그것이 내부적으로 무엇인지 압니다 우린 너를 비밀리에 들여 보내지 않을거야 따라서 쿼리 할 API가 없습니다 그래서 모든 메소드를 오버라이드 할 필요가 있습니다

그리고 나서 당신은 거기에 너무 많은 코드를 집어 넣게됩니다 기본적으로 너무 많은 논리가 모든 곳에서 일어나고 있습니다 새로운 접근 방식은 라이프 사이클이라는 객체가 있다는 것입니다 소유자 라이프 사이클 객체를 요청할 수 있습니다

그런 다음 상태를 쿼리하거나 당신이 어떤 라이프 사이클 상태인지 알고 싶다면, 또는 관찰자를 설정할 수 있습니다 그런 다음 해당 메소드에 콜백을 가져올 수 있습니다 이렇게하면 별도의 장소로 추상화 할 수 있습니다 기본적으로 모든 활동 코드를 포기하지는 않습니다 이 정보

하지만 당신은 그것을 어디에 두는 지 귀하의 응용 프로그램에서 감각 다행히도 우리는 lifecycle owner의 하위 클래스를 오버라이드합니다 또는이를 조각과 AppCompat 모두에서 구현하십시오 활동 그래서 지원 라이브러리에서 이것을 사용하십시오

수명주기 소유자입니다 따라서 기본적으로 수명주기를 얻기 위해 쿼리 할 수 ​​있습니다 그런 다음 거기에서 나가십시오 그래서 우리는 당신이 활동할 모델에서 출발했습니다 기본적으로 모든 라이프 사이클 종속 로직이 포함되어 있습니다

활동이 훨씬 더 작을 수있는 모델로, 그 논리를 꺼내 다른 것으로 추상화하십시오 그곳에는 생명주기 관찰자를 설정하고, 원하는 콜백을 얻으십시오 우리는보기와 데이터에서 비슷한 문제를 겪고 있습니다 우리에게는 활동이 있으며, 우리는이 모든 정보를 가지고 있습니다 거기에 대한 견해에 대해

그리고 우리는 그 견해에 대한 자료를 가지고 있습니다, 우리는 데이터가 언제 바뀌는지를 알아야합니다 또한 라이프 사이클을 추적해야합니다 그래서 우리는 잘못된 시간에 물건을 새거나 물건을 부르지 않습니다 그래서 우리는 결국 너무 많은 것을 가지고 끝납니다 이제는 LiveData에 대한 개념이 생겼습니다

배치 할 수있는 ViewModel 그 물건들 당신은 활동에서 그것을 추출 할 수 있습니다 그 모든 정보를 그곳에 넣을 수 있습니다

그걸 관찰해라 이제 활동에서, 당신은 정말로 보기 및 참조 정보 만 제공 ViewModel에 전달합니다 그런 다음 모든 논리를 ViewModel에 넣으십시오 그것은 LiveData 객체를 사용하고 있습니다 자체 라이프 사이클을 처리하므로 사용자는이를 관찰 할 수 있습니다

훨씬 나아 졌어 덜 버기 데이터의 경우, 당신에 대한 우리의 논쟁은 당신 스스로에 달렸습니다 우리는 귀하의 데이터를 관리하지 않습니다 너가 원하는 것을해라

그리고 많은 데이터베이스 솔루션이 있습니다 우리는 플랫폼에 SQLite를 가지고 있습니다 가서 사용하십시오 너 자신을 노크 해 도대체 무엇이

우리는 그 사업을 시작하고 싶지 않습니다 새로운 접근 방식은 실제로 데이터를 위해 뭔가를 제공한다는 것입니다 SQLite를 기반으로 구축되었지만 실제로는 빌드 시간 확인 기능을 제공하므로 사용자는 이러한 쿼리를 전송 한 다음 런타임에 오류가 발생합니다 그러나 빌드 타임과 통합시이 문제를 볼 수 있습니다 우리가 이전에 본 라이브 데이터 (LiveData) 또는 원할 경우 독자적으로 할 수 있습니다

우리는 데이터베이스 솔루션을 인수하려고하지 않습니다 우리는 더 나은 지역 영구 이야기를 단순히 제공하고 있습니다 우리가 이전에했던 것보다 더 쉽게 당신을 위해 전체 다이어그램은 다음과 같습니다 여기서 유일한 새로운 요소는 저장소에 대한이 아이디어입니다

기본적으로 추상화하는 패턴입니다 데이터의 출처 그래서 그것이 지역이나 웹에서 오는 경우, 나머지 국민들에게는 중요하지 않습니다 그것을 쿼리하고 있습니다 거기에서 추상화를하는 것은 좋은 일입니다 데이터 페이징

그래서 우리는이 것을 CursorAdapter라고 불렀습니다 그것에 대해 좋은 요소가있었습니다 그것은 데이터베이스 커서에 대한 지원을했습니다 좋았어 그러나 그것은 ListView에만 국한되었으며, 기본적으로 비효율적 인 문제가있었습니다

페이징 크기, 그런 것들 우리는 AsyncListUtil을 더 유용하게 사용했습니다 그러나 일을하기에는 너무 비효율적이었습니다 웹 거래를 좋아합니다 그래서 우리는 현대 안드로이드에 새로운 모델을 가지고 있습니다

우리는 데이터 페이징을 가지고 있습니다 이번 주 10 페이징 라이브러리, 그것에 대해 좋은 것들이 있습니다 따라서 RecyclerView와 함께 작동합니다 세분화 된 데이터 변경 사항을 처리합니다

훨씬 효율적으로 백그라운드 스레드를 아주 쉽게 사용할 수 있습니다 변경 사항을 관찰 할 수 있으므로 LiveData와 통합됩니다 그러나 다시 한번, 우리는 당신에게이 아키텍처를 강요하지 않습니다 RxJava2를 사용하고 있다면, 매우 쉽게 또한 유연한 데이터 가져 오기 옵션, 그래서 창 크기를 지정할 수 있습니다

그리고 이런 일들을 원할 때 물론, 항상 상충 관계가 있습니다 나는 데이터 페이징에 대해 나쁜 점을 발견했다 그 이름이 지루하다는 것입니다 ROMAIN GUY : 그래픽

그래서 우리가 안드로이드를 시작했을 때 우리는 OpenGL ES 10 만 가지고있었습니다 셰이더도 없었어요 우리는 소프트웨어 렌더링으로 모든 것을하고있었습니다 그것은 몇 년 동안 쟁점이었습니다

초기 장치에는 충분히 빠릅니다 우리가 타블렛 폼 팩터를 치면 문제가되기 시작했다 이전에는 9 개의 패치를 많이 사용했지만, 너의 일부는 고통 받았다고 확신한다 9 개의 패치를 작성함으로써, 또는 더 나쁜 것은 UX 디자이너에게 설명하려고 시도하는 것입니다 그것들을 만드는 법

검은 점들은 어디에 두 시나요? 그들은 어느쪽에 가야합니까? 나는 아직도 모른다 오늘날까지 TextureView 대 SurfaceView, 우리는 미리보기 토크에서 그걸 만졌어 기본적으로 항상이 문제가있었습니다 당신은 통합 할 수있는 덜 효율적인 TextureView를 사용합니까? ListView 및 애니메이션과 같은 다른보기와 더 좋게, 또는 SurfaceView를 사용합니까? 그리고 비트 맵 관리는 어려웠습니다

많은 사람들이 응용 프로그램을 만들었고 나간다 비트 맵을 만들려고했기 때문에 메모리 오류가 발생했습니다 당신은 캐싱을해야하며, 이것은 어렵습니다 그리고 우리의 대답은 근본적으로, 어, c'est la vie이었습니다 그래서 지금

OpenGL 31 및 32가 있습니다 콘텐츠 쉐이더가 있습니다 Vulcan을 사용하면 저급 그래픽 렌더링을 수행 할 수 있습니다

우리는 어디에서나 하드웨어 가속을 수행합니다 VectorDrawables는 기본적으로 대부분의 드로어 블을 대체했습니다 및 응용 프로그램의 비트 맵 우리에게는 작은 응용 프로그램이 있습니다 당신은 지원할 필요가 없습니다 – 여러 밀도를 지원하는 것이 훨씬 쉽습니다

이전과 같이 많은 배치를 필요로하지 않습니다 우리가 지금하고있는 일 우리가 너와 노력하고 있니? 아주 자주, 응용 프로그램 개발자는 솔루션을 찾기 위해 우리를 찾습니다 그러나 공동체가 – 즉, 너 – 우리가 생각하는 놀라운 도서관을 지어왔다 당신이 사용해야하는 것이 맞습니다 예를 들어 글라이드 (Glide) 또는 피카소 (Picasso) 또는 로티 (Lottie) 그들이하는 일에 뛰어납니다

비트 맵을 관리하려는 경우 또는 Lottie와 함께 미친 복잡한 애니메이션을 만들고 싶습니다 당신은 그것들을 사용해야합니다 우리는 뭔가를 재창조하는 데 시간을 낭비하지 않을 것입니다 이미 거기에 존재하고 우리는 생각합니다 그것이하는 일에 아주 능숙합니다

그러니 그 라이브러리를 사용하십시오 다시 한 번, 이것을 알아라 아마도 SurfaceView를 사용해야 할 것입니다 더 이상 TextureView가 아닙니다 시간이 오래되었습니다

마지막으로 우리는 당신의 코드를 프로파일 링하라는 말을 사용했습니다 우리는 가능한 한 작업을하지 말라고 말하곤했습니다 메모리 소비를 최소화 할 수 있습니다 하지만 이제는 더 나은 장치가 있습니다 우리에게는 많은 코어가 있습니다

우리는 많은 RAM을 가지고 있습니다 우리는 더 나은 언어를 가지고 있습니다 더 나은 런타임입니다 따라서 대신 코드 작성에 필요한 작업을 수행해야합니다 가능한 한 작업을 피하고 또한 최소화 메모리 소비

CHET HAASE : 그 장치가 밝혀지기 때문에 여전히 제약이있다 그 점을 명심해야합니다 배터리 수명은 중요하며 대역폭은 귀중합니다 이 모든 것이 사용자 경험에 기여합니다 따라서 사용자가 실제로 아직도 이런 것들에 대해 보수적이다

애플리케이션에 최상의 성능 제공 그게 맞아 우리는 당신에게 감사하고 싶다 그리고 다른 방법이있다 이것을 말하십시오 그리고 우리는 끝났다고 생각합니다

고맙습니다 [박수 갈채] [음악 재생]

Android Jetpack: sweetening Kotlin development with Android KTX (Google I/O ’18)

[음악 재생] JAKE WHARTON : 안녕하세요 제이크는 제이크입니다

코틀 린 물건에 대한 안드로이드 팀에서 일하고 있습니다 오늘은 Android KTX에 대해 이야기 할 것입니다 그리고 난 그냥 가지 않을거야 거기에있는 물건들을 묶어서 나는 그것보다 조금 더 재미있게 만들고 싶다 그래서 나는 약간의 일부터 시작하려고합니다

작년에 Google I / O에서 작년에 여기 있었는데 Android 유형에 대한 확장 기능을 작성할 수 있습니다 이 예와 같이 ViewGroup 내부의 뷰를 반복하는 코드 이 일반 코드를 확장 프로그램으로 가져올 수 있습니다 그리고이 확장이하는 일은 타입을 향상시키는 것입니다 우리가 통제하지 않는 ViewGroup 유형

기본적으로 멤버 함수를 만들 수 있습니다 그건 실제로 멤버 함수가 아닙니다 실제로 바이트 코드에서 정적 함수로 변합니다 우리가 향상시키고 자하는 기능으로 그래서 우리는 원래 코드를 취할 수 있습니다 명시적인 for-loop가 있었고이 새 멤버를 사용합니다

우리가 의도 한 것의보다 간결한 버전을 만들 수 있습니다 실제로 시각적으로 구분됩니다 일반 멤버 함수에서 이탤릭체로 표시됩니다 어두운 황색을 사용하면 실제로 노란색이됩니다 그러나 이것은 회원에게 전화하는 것과 의미 상으로 동일합니다

또는 의의는 의미 상 동등한 느낌을주기위한 것입니다 그리고 자주 시작됩니다 확장 기능에 대해 이야기하고, 당신이 생각하기에, 음, 이것이 아주 유용하다면, 왜 우리는 D 그룹에 직접 기능을 넣지 않습니까? ViewGroup은 왜 for-each와 for-each 인덱스를 제공하지 않는가? 람다를 필요로합니까? 그리고 정말로, 그 이유는 람다 때문입니다 우리가 Java 8이나 Kotlin에서 lambda를 넘길 때, 기본적으로, 그 방법을 먹는 익명의 클래스를 만들어야합니다 클래스 로딩을 유발합니다

그러나 Kotlin은 언어 기능, 우리는 그 람다의 할당을 제거 할 수 있습니다 함수를 인라인으로 표시함으로써, 확장의 본문이 호출 사이트로 복사되고, 우리는 제로 오버 헤드 추상화가 있습니다 다른 예를 살펴 보겠습니다 API 23에서 우리는 시스템 서비스를 얻을 수있었습니다 클래스 유형에 따라 그리고 27

1 개의 지원 도서관에서, ContextCompat 버전은 모든 API 수준에서 작동하도록 추가되었습니다 이것을 인라인 인 확장 프로그램으로 가져올 수도 있습니다 이전과 같지만 람다를 포함하지 않습니다 이게 다른 점은 무엇입니까? reified라고하는 것입니다 자, 이것은 컴파일러 트릭입니다

그 트릭이하는 일은 타입 정보 컴파일 타임에 알려진 일반의, 런타임에 사용 가능하도록 만들 수 있습니다 그래서 이것이 우리가 할 수있는 것입니다 그렇지 않으면 우리는 classjava를 호출 할 것입니다 알림 관리자에서 이제 그 정보를 추상화 할 수 있습니다

이 연장 뒤에 그래서 우리의 호출 코드가 이제는 단순화되었습니다 제네릭을 통과 할 수 있어야합니다 그리고 그것이 구체화 되었기 때문에, 그것의 구현은 classjava를 호출 할 수있는 액세스 권한이 있습니다

따라서 뷰의 패딩을 업데이트하려면 우리는 4 가지 중 2 가지만 지정합니다 매개 변수 -이 경우에는 왼쪽과 오른쪽 모두를 업데이트합니다 우리는 기존 패딩을 꺼내야합니다 안드로이드가 필요하기 때문에 상단과 하단에 대한 당신은 네 가지 모두를 지정해야합니다 이것은 우리가 다시 치료할 수있는 것입니다

확장 기능을 사용합니다 여기서 핵심은 각 인수에 대해 우리가 정의한이 새로운 기능에 대해, 우리는 기본값을 지정하고 있습니다 그리고 그 기본값 해당 인수에 값이 제공되지 않을 때 사용됩니다 그래서 우리는 호출하는 코드를 우리는 4 개 모두를 지정하고 있으며, 이제는 2 개로 지정합니다 하지만 여기서 문제는 우리가 제거한 것입니다

두 가지 주장 그러나 우리는 두 가지를 공급하기 때문에, 코 틀린 (Kotlin)은 이것을 처음 두 가지 의미로 생각합니다 후자의 두 개는 기본값이 사용되는 곳입니다 이것은 우리가 의도 한 바가 아닙니다 우리는 왼쪽과 오른쪽, 그것은 첫 번째와 세 번째입니다

또 다른 언어 기능이 여기에 도움이되는데, 이름이 매개 변수입니다 매개 변수의 이름을 지정함으로써, 우리는 컴파일러에게 두 개의 인수 중 어떤 것을 말할 수 있습니다 우리가 지정하고 그것을 채울 수 있도록 다른 사람의 기본값은 승인 Android API에는 여러 가지 복합 유형이 있습니다 이들은 점, 직사각형, 쌍과 같은 것들입니다

심지어 위치 클래스 이러한 복합 유형은 단지 래퍼 일뿐입니다 작은 개별 데이터 조각 주위 이 경우 사각형이있는 API를 호출합니다 그것은 네 개의 주위를 둘러싼 합성물입니다 – 왼쪽, 위쪽, 오른쪽, 그리고 바닥 – 직사각형의 값

계산을해야하는 경우 이러한 복합 형의 내부의 값에 근거 해, 당신은 그것들을 개별적인 값들 또는 변수들로 끌어 내야 만합니다 그 계산을하기 위해서 그리고 잠재적으로, 그들을 다시 모으십시오 확장의 도움으로이 문제를 피할 수 있습니다 이것은 약간 다릅니다 연산자라는 새로운 키워드가 있습니다

운영자는 Kotlin이 특별한 호출 사이트 구문을 사용할 수있게 해줍니다 그리고 각 연산자 함수는 매우 구체적인 이름을 가지고 있습니다 잘 알려진 이름 당신은 어떤 이름도 만들 수 없습니다 그리고 그 이름은 당신이 어떤 콜 사이트 구문을 정의하는지 창조하려고합니다

이 경우 구성 요소라고합니다 그리고 구성 요소를 사용하면 기능을 사용할 수 있습니다 Kotlin의 파괴라고합니다 그래서 개별적으로 철수해야했던 우리의 원래 코드 네 가지 구성 요소가 이제이 호출 ​​사이트를 사용할 수 있습니다 사각형이 자동으로 작성된 구문 4 개의 값에 압축을 풀고 4 개의 변수에 할당 우리가 선택한 이름으로 이것에 대해 정말 멋진 점은, 나중에 그 사람에 대해 신경 쓰지 않는다면 그 사람을 생략 할 수 있습니다

그리고 당신이 중간에있는 사람들에 관심이 없다면, 그것들을 밑줄로 지정할 수 있습니다 그리고 만약 우리가 단지 두개의 값을 꺼낼 필요가 있다면, 우리는 그것을 매우 간결하게 할 수 있습니다 승인 숙련 된 Kotlin 사용자가 알 수도 있습니다 그게

음, 우린 뒤집혔을거야 슬라이드로 돌아갈 수 있을까요? 승인 이 코드는 어떻게 우리는 문자열에는 숫자 만 포함됩니다 기본적으로 문자를 반복합니다

Kotlin의 for-in 구문을 사용합니다 그것이 자인지 여부를 확인합니다 문자에 대한 확장 함수 사용; 값을 true 또는 false로 설정합니다 그것이 자릿수가 아닌 것을 발견 할 때마다 숙련 된 Kotlin 사용자 인 경우, 당신은 모든 기능에 대해 알고있을 것입니다

string 상에 존재하는데, 그것은 동일한 루핑을 캡슐화한다 술어를 지정할 수있게 해줍니다이 경우, 입니다 실제로는 인라인 함수입니다 그래서 우리가 가지고있는 것과 똑같은 일을 할 수 있습니다

이전 슬라이드에 썼다 그러나 흥미로운 점은 Android는 실제로 이것을위한 내장 함수 그리고 나는 많은 사람들이 실제로 이것이 존재한다는 것을 알지 못한다 그리고 이것은 우리가 실제로 취할 수있는 것입니다 확장으로

그러나 당신은 궁금해하기 시작합니다 연장에있는 그것의 무게? 이 정적 메서드를 사용하면 어떤 가치를 얻을 수 있습니까? 내선 번호로 전화 할 수 있습니까? 글쎄, 하나, 그것은 방법을 변경 우리가 더 자연스럽고 관용적 인 느낌을 갖기 위해 코 틀린에서 – 확실한 그러나 여전히, 우리가 이것에서 추출한 가치가 있습니까? 우리가 이걸로 얻은 것 중 가장 큰 것 IDE에있을 때 문자열이 있습니다 당신은이 질문을하기를 원한다 그것은 숫자 만 포함합니다

TextUtils의 정적 메서드가 있다는 것을 모르는 경우, 당신은 아마 그것을 결코 발견하지 못할 것입니다 확장 기능을 사용할 때 IDE에서 타이핑을 시작하면, 실제로이 확장 기능과 자동 완성 기능을 보여줍니다 다른 곳보다 훨씬 더 쉽게 발견 할 수 있습니다 Enter 키를 누릅니다 그리고 당신은 그것을 얻습니다

괜찮아 그래서 여기에 몇 가지 확장 기능을 설명했습니다 나는 너에게 조금 생각 나게하고 싶었다 이러한 확장의 힘, 사실 우리는 오직 존재하는 언어 기능을 활용하고 있습니다 Kotlin에서는 Java 언어가 아닙니다

실제로,이 예제 중 일부는 우리는 나머지 동안 계속 돌아갈 것입니다 이 이야기 그래서 내가 방금 보았던 모든 확장 기능들 Android KTX 라이브러리에 포함되어있다 2 월 초 발표했습니다 그 이후로 두 번의 발표가있었습니다

화요일 현재, 그것은 제트 팩 (Jetpack)의 일부입니다 Jetpack으로 버전이 지정됩니다 그래서 화요일에 Core-KTX는 10 알파 1이되었습니다 버전이 만들어지고 출시 될 예정입니다

미래의 젯팩 (Jetpack) 도서관이있다 그래서 우리는이 Core-KTX를 출시 할 때 호출했습니다 그것은 이상한 이름의 종류이었다 그것은 말이되지 않았습니다 이것은 프레임 워크에서만 유형의 확장을위한 것입니다

많은 사람들이 도서관 자료를 추가 할 수 있을지 제안했습니다 그리고 우리는 no라고 말하는 것에 대해 매우 단호했습니다 바라건대 지금은 훨씬 더 의미가 있어야합니다 그러나 이것조차도 사실이 아닙니다 Core-KTX가 처음에는 support-compat에 의존했기 때문입니다

Support-compat은 이전 버전과의 호환성을 제공합니다 Android 프레임 워크에있는 것들의 버전 이전에는 ContextCompat로 예제를 보여 줬습니다 이것은 support-compat에서 나온 것입니다 그리고 지금, 제트 팩 브랜드와 안드로이드 X 패키지, support-compat이 핵심이되었습니다

이제 Core-KTX는 Core와 함께합니다 그래서 우리는 우리가 무엇을하고 있는지 알았습니다 우리가 이것을 시작했을 때 그리고 지금, 그것은 단지 갚기 시작했습니다 다른 Jetpack 라이브러리와 함께, 실제로 몇 가지 새로운 KTX 라이브러리가 있습니다

그것으로 시작됩니다 그래서 우리는 fragment, collection, SQLite를 가지고 있습니다 최신 구성 요소, 탐색 및 작업 런타임 용 나중에 조금씩 발견 할 수있는 방법을 알려 드리겠습니다 하지만 범위 지정에 대해 조금 이야기하고 싶습니다

무엇을해야할지 여부를 결정하는 방법에 대해 이 라이브러리들 중 하나에 들어가십시오 괜찮아 그래서 Core-KTX 03에서는 확장 기능을 제공했습니다 그게 그렇게 보였어

서명을 보면 연산자입니다 그리고 그것은 색상으로 작동합니다 이름은 플러스입니다 그래서 이것은 우리가 정상적인 더하기 구문을 사용하여 추가, 함께 두 가지 색상 합성 서명은 확실히 확장입니다

하지만이 몸은 매우 다른 것처럼 보입니다 우리가 본 다른 확장보다 상당한 양의 코드가 여기에 있습니다 당신이 안으로 볼 경우, support-compat, 현재 코어입니다 컬러 유틸리티 클래스가 있습니다 그리고 그 컬러 유틸리티 클래스는 정수 색상에서 작동하는 합성 색상이라고하는 메소드입니다

전경과 배경을 가져갈 수 있습니다 그것들을 하나의 색깔로 바꾸십시오 구현을 배치하기에 적합한 후보입니다 그 확장 기능이 무엇인지 이 클래스에 모든 사람이 사용할 수 있도록 자바 언어에서 사용할 수 있습니다 또는 Kotlin 언어

그래서 Core-KTX 10에서는 실제로 해당 ColorUtils에 위임하기 위해 다시 작성되었습니다 따라서 Java 언어 사용자는 해당 기능을 사용합니다 그러나 Kotlin 사용자는 향상된 구문을 사용합니다 그리고 우리가 얘기 한 확장 기능을 살펴 본다면 지금까지, 그들의 몸, 구현 이 함수들 중, 그들은 모두 사소한 것입니다

그들은 대단히 사소하다 그리고 그것은 의도적으로 설계된 것입니다 그리고 이것은 나를 몇 가지 원리를 다루도록합니다 우리는 KTX 확장이 가져야한다고 정의했습니다 따라서이 첫 번째 기능은 기능을 적용하려는 것입니다

그것은 이미 존재합니다 새로운 기능을 추가하려면 그것들은 업스트림으로 리디렉션되어야합니다 그들은 언어 불가지론 자입니다 두 언어 모두 그들을 이용하십시오 이것의 다른 예 – 몇 가지 HTML compat stuff와 path iterator가있었습니다

이후 Core-KTX에서 처음으로 구현 된 코어로 업스트림으로 이동 가능 두 언어로 사용됩니다 이러한 모든 확장에 공통적 인 또 다른 사항 인라인으로 표시되어 있다는 것입니다 우리가 첫 번째 행을 인라인하는 이유는 맨 위에있는 것 – 람다 할당을 피하기 위해서입니다 두 번째의 경우, 우리가 수정 된 제네릭을 사용하고 있기 때문에, 우리는 실제로 컴파일러에 의해 인라인을 사용해야합니다 세 번째, 구성 요소 1, 맨 아래 1 모두 인라인입니다

네가 쓰지 않는 것에 대한 앨리어스 만 확장 기능이없는 경우 우리가 뭔가를 본다면 Core-KTX에는 인라인이 아닙니다이 반복자 확장자가 있습니다 우리가 Kotlin 's for / in을 사용할 수있게 해주는 ViewGroup에 뷰와 ViewGroup을 반복하는 구문 이것은 매우 구체적인 이유로 인라인되지 않습니다

그리고 그것은이 함수의 구현이 익명 클래스를 정의합니다 만약 우리가 이것을 인라인했다면, 당신이 그것을 사용하면 익명의 클래스가 호출 사이트에 정의됩니다 그래서 갑판의 크기, 방법 수, 및 클래스 로딩 우리는 명시 적으로이를 인라인으로 만들지 않습니다 우리는 단일 구현을 모든 발신자가 다시 사용할 수 있습니다

그래서 우리는 인라인이 아닌 확장 기능을 기본값으로 사용합니다 할당 이유 그리고 나는 이것이 정말로 KTX 스타일 확장 만 가능합니다 일반적인 Kotlin 코드에서 이것은 권장하지 않습니다 인라인 기본 설정을 원하지 않습니다

실제로 가지고있는 잠재력이 있기 때문에 긍정적 인 것보다는 당신의 코드에 부정적인 영향 괜찮아 그래서 우리가이 확장을 보여 주었을 때, 나는 인라인 수식어가 사실과 결합 된 방법에 대해 이야기했다 람다가 있다는 것,이 확장을 허용합니다 제로 오버 헤드 추상화

검증 된 경우, 우리는 능력을 얻습니다 더 많은 선언적 버전을 가짐 지정하지 않고도 호출 사이트에서 조회를 수행 할 수 있습니다 콜론 콜론 classjava 패딩을 업데이트하기 위해 기본값을 사용합니다

각 인수를 지정할 필요가 없기 때문에, 인수의 하위 집합을 지정하는 이름 매개 변수 우리는 실제로 제공하고자합니다 구조 조정의 경우에는 멋진 구문을 사용합니다 이를 통해 우리는 컴포넌트 변수를 분리 할 수 ​​있습니다 합성 오브젝트의 이것은 유용합니다 이것은 우리가 가지고있는 사실에 의해 가능합니다

Kotlin에서 연산자 오버로딩 우리는 또한 우리가 어떻게 더하기 색상을 추가 할 수 있었는지에 대해서도 이야기했습니다 이 경우 정적 메서드 확장의 별칭을 지정합니다 이는 발견 가능성을 높이는 데 도움이됩니다 당신이 그렇지 않으면 몰랐을 내장 헬퍼가 존재합니다

그리고 컬렉션과 유사하지만 그렇지 않은 유형의 경우 실제로 컬렉션, 우리는 능력을 가지고 그들을 가상 컬렉션으로 변환 우리는 언어의 용역을 사용할 수 있습니다 마치 실제 컬렉션 인 것처럼 그래서 이들 각각은 매우 Kotlin 특정 언어를 가지고 있습니다 사용하는 기능 그리고 우리는 이러한 모든 확장 기능이 Kotlin 언어의 일부 기능을 활용하도록 정의 자바 호출자에게는 그렇지 않다

우리는 API를 수정하는 것만으로도 확장 기능을 제공하지만 확장 기능을 제공합니다 레버리지를 사용하여 사용하는 것이 더 즐겁다 이러한 Kotlin 관련 기능 승인 우리가 자주 얻는 제안 중 하나 setOnClickListener와 같은 것을 가져 오는 것입니다

확장을 작성하면 Click 또는 OnClick과 같은 것을 사용하여 호출 할 수 있습니다 이것은 호출 코드를 허용합니다 setOnClickListener를 호출 할 필요없이, 클릭의 단축 버전을 얻습니다 이 언어의 기능을 활용하고 있습니까? 글쎄, 우리는 확장 함수를 사용하고 있지만 실제로는 그렇지 않습니다 우리는 단지 짧은 별명을 만들고 있습니다

이 확장 프로그램에서 얻을 수있는 가치는 무엇입니까? 글쎄, 우리는 몇 가지 적은 문자를 입력하고 있습니다 그러나 실제로, 그것은 어쨌든 자동 완성됩니다 그러나 더 나쁜 것은, 우리가 여기서 선례를 세울 것인가 이 확장 기능을 추가하여? 모든 청취자에게이 작업을 수행 할 예정입니까? 그래서 이것이 뭔가 좋은 예입니다 우리는 명시 적으로 KTX 라이브러리에서하고 싶지 않습니다 당신이 그 용어에 익숙하지 않다면, 우리는이 코드를 골프라고 부릅니다

가능한 한 최단의 코드를 만들려는 욕구를 가지십시오 이것은 우리가하고 싶지 않은 것이다 코드를 더 짧게 만들려고 여기에 온 것은 아닙니다 승인 지금은 또 하나의 제안이 있습니다

그리고 나는 사람들이 사용하는 것을 보았다 Android의 경우 다양한 API 레벨로 인해 우리는 아주 자주 당신을 지원해야합니다 SDK int 주변의 IF 검사를 참조하십시오 그래서 이것을 꺼내는 유혹을받을 수 있습니다 확장 기능으로 이것의 조금 더 많은 선언적 버전

비교를 확장 함수로 옮깁니다 인라인 함수이기 때문에 오버 헤드가 없습니다 람다는 마지막 매개 변수입니다 그래서 우리는 멋진 Kotlin 호출을 얻습니다 사이트 구문

그리고 이것은 우리의 IF 진술을 이것으로 변환합니다 자, 이것 자체만으로는 너무 끔찍하지 않습니다 우리는 실제로 어떤 언어 기능도 활용하지 않습니다 다시 말하지만, 마지막 것과 비슷하지만 여전히 별명입니다 하지만 최소한이 점은 조금 더 논쟁 할 수 있습니다

그것의 공로 때문에 그러나 문제가 있습니다 이 두 문장은 동일하지만, 오, 한가지는 최소한 정적 SDK SDK int, 그리고 나서 그들은 조금 더 가깝습니다 이것이 이것이 덜 타당한 이유 중 하나입니다 하지만 한 가지는 IF 문 프로그래밍 언어의 아주 원시적 인 구조입니다

IF 문은 IF 문이 아니기 때문에, ELSE와 같은 구조가 있습니다 요구 사항이 변경되면 어떻게 될까요? 이 두 가지 행동을 바꿔야한다고 다른 버전? 당신이 작성한이 확장 프로그램을 사용했다면, 이 사건을지지하기 위해 IF 문을 사용하여 다시 변경해야합니다 또는 함수를 수정해야하는 경우, 어쩌면 지금은 두 개의 람다가 필요합니다 한 명은 19 세 이상이고 한 명은 사건입니다 네가 아니야 이 함수에서는 두 개의 람다를 사용하지 않기 때문에, 우리는 특별한 후행 람다 구문을 잃어 버렸습니다

이제 우리는 내부적으로 인수로 전달해야합니다 괄호는 이전에 비해 우리는 그렇지 않았습니다 즉각적으로이 확장은 붕괴되기 시작합니다 다른 조건부 분기를 도입하면 어쩌면 API 전반에서 동작을 다르게해야 할 수도 있습니다 세 가지 다른 방법으로 – 글쎄, 우리가 확장 프로그램이이를 가능하게 할 수 있습니다

이 확장에 대해 다른 점은 IF 문과 비교하면 우리가 가정하고있는 것입니다 확인하고 싶은 조건부 보다 크거나 같음 우리가 람다에서 뛰고 싶은 행동, 우리는 단지 19 플러스에서 뛰고 싶습니다 글쎄, 많은 시간, IF 문 중 일부는 – 다시, SDK int -는 작거나 같을 것입니다 그리고 이제는 순서대로 두 번째 확장이 필요합니다 사용 사례를 지원합니다

그래서 이것은 뭔가의 또 다른 예입니다 우리가하려는 게 아니야 우리는 단 한 번의 사용으로 최적화하고 싶지 않습니다 사례 또는 특정 유스 케이스, 확장 만 한 가지 일을 지원합니다 그리고 나서 좀 더 복잡한 것으로 옮겨야 할 때, 당신은 원래의 행동으로 되돌려 야합니다

확장 프로그램을 통해 당신이 필요로하는 모든 것을 표현하기 그것이 존재하지 않는다면 표현할 수 있습니다 승인 지금까지 우리가 얘기해온 모든 확장 기능 Core-KTX 라이브러리에있는 것들이었습니다 나는 많은 연장을 겪고 싶지 않다 이 다른 도서관에 있습니다

다시 한 번 조금씩 발견 할 수있는 방법을 보여 드리겠습니다 하지만 나는 하나를 만지고 싶다 그래서 KTX 단편에는 확장이 있습니다 트랜잭션을 캡슐화합니다 beginTransaction과 commit 함수를 이동합니다

확장 기능으로 호출합니다 우리는 인라인 함수를 사용할 수 있다는 사실을 사용합니다 및 람다를 다시 0 오버 헤드로 변환합니다 맡은 일 우리의 호출 코드는 조금 더 짧아지고, 이제 우리는 람다 본문과 트랜잭션을 사용합니다

조각을 사용했다면 커밋이 유일한 커밋 기능이 아니라는 것을 알아라 실제로는 여러 가지가 있습니다 그래서 우리는 뭔가를함으로써 이것을 모델링 할 수 있습니다 같은 부울을 제공 할 수 있도록 상태 손실을 허용할지 또는 허용하지 않을지 여부 당신이 저지를 때 이것은 수용하기가 정말로 쉽습니다

그러나 그것은 일종의 무언가에 반대한다 나는 이전에 말했어 오, 우리는 이것을 사용할 수 있도록 콜 사이트를 업데이트 할 수 있습니다 내가 앞서 말한 것에 위배된다 구현의 영향을 최소화하는 방법에 대해 이야기했습니다

이러한 확장의 이것은 인라인 함수이기 때문에, 그리고 나서 우리는 이제 인라인 내부에 조건부를 넣습니다 함수, 그 조건부가 인라인되고있다 모든 콜 사이트로 그래서 모든 콜 사이트가 이제 그 내부에 조건부가 있어야합니다 이것은 실제로 나쁜 것입니까? 글쎄, 우리가 바이트 코드를 보면 호출 사이트에서 생성됩니다

우리가 허용 상태 손실을 true로 지정할 때 – 너는 정말로 이해할 필요가 없다 여기에서 무슨 일이 일어나고 있는지 이해하기위한 바이트 코드 기본적으로 세 가지 함수 호출이 있습니다 첫 번째는 beginTransaction입니다 두 번째는 람다 내부에 있던 교체 작업입니다

세 번째 것은 commitAllowingStateLoss에 대한 호출입니다 IF 문은 없습니다 조건부는 없습니다 그리고 이것은 인라인 함수이기 때문에 인수는 부울이므로, 컴파일러는 실제로 컴파일 타임에 가치 그리고 컴파일 시간에 알고 있기 때문에, 그것은 실제로 죽은 코드 제거를 할 수 있습니다

실행될 수없는 분기를 제거하십시오 그리고 실제로 바이트 코드에서, 당신이 그렇지 않으면 쓰려고했던 것과 동등한 것 실제로 커밋 기능이 많이 있습니다 지금 커밋하고 커밋 할 수있는 방법이 있습니다 따라서 우리는 추가 Boolean을 추가하여이를 지원할 수도 있습니다

그리고 똑같은 일이 여기서 일어납니다 이제 그들은 중첩되어 있지만, 데드 코드 제거 단 하나의 기능 만 있도록 결과 바이트 코드를 호출하십시오 승인 이러한 모든 I / O 릴리스의 노력의 일환으로, 우리가 한 일 중 하나 Kotlin 특정 생성을 시작합니다 Android에서 게시하는 라이브러리보기 프레임 워크 자체

그래서 보시다시피 그 파란색 상자에 참조 문서를 방문 할 때, 네가 원한다면 실제로 너에게 물어볼거야 Kotlin 특정 버전의 플랫폼을 보는 방법 또는 Android X 라이브러리 또한 왼쪽 탐색 창에서 아래로 스크롤하면 맨 아래에는 링크도 있습니다 그리고 이것들은 Kotlin의 이러한 라이브러리에 대한 견해입니다 그래서 여러분이 말하길, 조각을 볼 때 패키지를 사용하면 조각에 대한 확장 프로그램을 볼 수 있습니다

문서 안에 있습니다 더 이상 완전히 분리되지 않습니다 한 가지 당장 실종 됐어 우리가 너에게 실제로 말하지 않는다는거야 이것들이 유래 한 인공물의 좌표

곧 올거야 또한 Core-KTX의 확장, 플랫폼 유형을 확장하고 아직 플랫폼 문서에 표시됩니다 그러나 이것은 우리가 원했던 것이다 나가서 일하고 있다는 것을 보여 주려고 그리고 두 가지가 곧 나올 것으로 기대합니다

괜찮아 나는 안드로이드 KTX에 대해 이야기하기 위해왔다 그러나 Kotlin 확장 기능은 없습니다 Android 관련 정보 우리가하고있는 일은 건물 확장입니다

이 도서관을 좀 더 Kotlin에게 친숙하게 만들기 위해 그리고 그것은 모든 도서관이 할 수있는 것입니다 그래서 저는 그 방법들에 대해서 이야기하고 싶습니다 우리는 도서관을 어떻게 더 많이 만들 수 있을지에 대해 생각합니다 Android 라이브러리 모두에 적용되는 Kotlin에 친숙하고, 당신이 쓰고있는 도서관에도 적용됩니다

또는 당신이 사용하고있을 수도 있습니다 도서관을 만드는 첫 번째 방법은 실제로 Kotlin-friendly입니다 Kotlin에서 모든 것을 다시 쓰는 것입니다 분명히 이것은 모든 도서관에서 가능하지 않다 그러나 그것은 확실히 어떤 사람들에게는 선택 사항입니다

앱 전용 비공개 라이브러리 인 경우 귀하의 저장소에 있거나 귀하의 회사 내부에 있습니다 이미 Kotlin을 사용하고 있습니다이 옵션은 실행 가능합니다 그것은, 말하자면 완전히 실용적 인 것처럼 보이지 않습니다 안드로이드 프레임 워크

그리고 나는 우리가 무대에 있다는 것을 확신하지 못한다 안드로이드 X 라이브러리가이를 수행 할 수 있습니다 아마 미래의 안드로이드 X 라이브러리가 Kotlin에 쓰여질 수 있습니다 그럴 가능성이 높습니다 대부분의 것들로 우리가 선택한 것은 무엇입니까? 우리가 출판하는 것은 형제 유물이다

그래서 메인 도서관은 쓰여지고있다 Java 언어를 사용합니다 그리고 우리는 형제 유물로 Kotlin 언어 기능을 제공합니다 이것에 대해 대단한 점은 당신이하지 않는다는 것입니다 소비자에게 Kotlin 표준 라이브러리 강제 적용 그들이 명시 적으로 그것을 원하지 않는 한

확장 프로그램을 관리 할 수 ​​있습니다 API를 보강하는 데 필요한 것이 정확히 무엇인지, Kotlin 특정 기능을 사용할 수 있습니다 이것에 대해 정말 멋진 점은 확장하려는 라이브러리를 제어 할 필요가 없습니다 그래서 도서관을 이용하고 있다면 당신은 그것의 일부를 더 만들고 싶습니다 Kotlin-friendly, 당신은 그것을 할 수 있습니다

자신의 앱에서 또는 라이브러리에 대한 확장 집합을 게시 할 수 있습니다 다른 누군가가 발행하는 그러나 이들이 유일한 두 가지 옵션입니까? 나는 뭔가를보고 싶다 나는 제 3의 약간 잡종의 옵션으로 이끌 것이다라고 생각한다 그리고이 간단한 별칭 확장으로 돌아갑니다 우리는 자바 언어로 정의 된 정적 메서드를 사용했다 Kotlin 언어로 확장 메소드로 바꿨습니다

Java 측에서이 클래스의 구현을 살펴보면, 첫 줄을 포함 시켰습니다 왜냐하면 우리는 즉시 역 참조하는 것을 볼 수있다 우리가 전달하는 논쟁 문자열을 전달하자마자, 최대 문자 수는 얼마입니까? 내가 반복 할 수있는 순서대로 숫자가 있는지 여부를 확인하려면? 따라서 Java API로 Kotlin을 사용한다면, 이 매개 변수가 다음과 같은 것을 알 수 있습니다 플랫폼 유형이라고 불리는 것으로 노출 될 것입니다

null 허용 여부를 알 수 없습니다 그러나 구현을 통해 우리는이 사실을 즉시 알 수 있습니다 메서드는 null 값을 받아 들일 수 없습니다 우리가이 문제를 해결할 수있는 방법 null이 아닌 주석을 추가하는 것입니다 따라서이 주석은 Kotlin 컴파일러에게 알려주는 것입니다

거기에는 제한이있다 특수한 행동이 있다는 것을 계정을 고려해야합니다 아무도 통과하지 못하도록해야합니다 null 가능성이있는 값, 또는 null를이 메소드에 추가합니다 그래서 이것은 Kotlin의 언어 기능을 가능하게합니다

Java에는 단순히 존재하지 않습니다 이제이 시행을 허용 할 도구를 사용할 수 있습니다 Java에서 작동합니다 그러나 언어 자체가 본질적인 것은 아닙니다 그래서 우리가 무효를 위해서 그런 것을 할 수 있다면 – 이 주석을 nullness에 추가 할 수 있으면 Kotlin 컴파일러에게 필요한 것을 알리기 위해 이 메소드를 호출 할 때 동작을 변경하려면, 우리가 다른 것을 위해 이것을 할 수 있습니까? 말하자면,이 정적 메서드를 사용하려면 첫 번째 인수 정말 수신기입니다

그리고 이것이 실제로 확장 기능이 될 때 Kotlin에서 호출? 그리고 이것이 우리로 하여금 잠재적으로, 이것을 명시 적으로 정의 할 필요성을 제거합니다 확장 이 확장은 호출 규칙을 변경하기 위해서만 존재하며, 컴파일러에게 우리가 당신이 그것을 호출하도록 허용하고 싶다는 것을 알리기 위해 다른 방법으로 그리고 지금은, 우리는 이것 만 남았습니다 Kotlin 컴파일러는 주석, 마치 null이 아닌 주석을 본 것처럼, 그것으로부터 무언가를 유추하고 너는 그걸 더 많이 말하는거야

그 언어에 관용적 인 바이트 코드에서, 우리는 그렇지 않으면 쓰려고했던 것을 얻는다 우리는 여전히 static 메소드를 호출합니다 수신기가 첫 번째 인수가됩니다 이 예제는 어떻습니까? 당신이 알아챈 한 가지는 이 확장의 이름은 setPadding이 아니라 updatePadding입니다

이제이 확장을 setPadding이라고 부를 수 있습니다 그러나 문제는 그것이 단지 인수의 하위 집합에 대한 작업 그래서이 경우, 우리는 단지 어디에 왼쪽 및 오른쪽 값을 전달하면 setPadding을 호출 할 수 있습니다 그리고 그것은 잘 작동합니다 그러나 우리가 왼쪽에서 오른쪽으로, 그리고 나서 맨 아래에서 통과한다면, 우리는 네 가지 주장을 제시 할 것입니다

그리고 Kotlin 컴파일러는 실제 패딩 패딩은 네 개의 인수를 받아들입니다 그리고 그것은 진짜 것을 부르는 것을 선호 할 것입니다 그리고 실제 매개 변수에는 명명 된 매개 변수가 없습니다 컴파일 오류가 발생합니다 그것이 바로이 updatePadding의 이름입니다

우리가 진짜 setpadding을 보면 – 4 개의 정수를 취하는 간단한 방법 – 우리가 Kotlin 컴파일러에게 알릴 수 있다면 어떨까요? 이 매개 변수에는 그와 관련된 이름이 있습니까? 자, 매개 변수 이름에서 이것을 추측하는 것이 좋을 것입니다 중복을 지정하지 않아도됩니다 하지만 나는 그것을 주장한다 주석에있는 이들 이름에 대해 명시 적으로 잘 설명합니다 Java 8 바이트 코드에서 실제로 매개 변수 이름을 유지할 수있는 방법입니다

그래서 Kotlin 컴파일러는 이론적으로 그것들을 사용할 수 있습니다 그러나 한 가지 문제는 모든 것이 든 없든 이 행동을 선택해야합니다 갑자기 모든 매개 변수 이름 귀하의 도서관을 가로 질러 돌로 설정되어 있습니다 반면 특수 효과를 사용하면 점진적으로 마이그레이션 할 수있는 기능 따라서 이것은 명명 부분을 해결할 잠재력을 가지고 있습니다

지금, 우리는 Kotlin에서 진짜 방법을 부를 수 있습니다 우리가 원하는 순서대로 4 개의 인수를 지정하면, 우리가 제공하는 이름을 기반으로합니다 기본 값은 어떻습니까? 코 틀린 표정을 지정할 수 있다면 어떨까요? 컴파일러는 컴파일러가 하나는 당신이 공급하지 않았습니까? 이렇게하면 원래의 확장 호출 규칙이 변경됩니다 확장 기능을 호출하는 것에서 실제로 사용하는 것까지 진짜 방법 그런 다음 바이트 코드에서 우리는 우리가 시작한 것, 우리의 명백한 확장 인라인 할 것이다

하지만 지금은 확장이 존재하지 않아도됩니다 특수 효과 형식으로 추가 한 메타 데이터 Kotlin 컴파일러에게 우리에게 우리의 전화 능력을 향상시키고 자했다 이 기능은 코 틀린 특정 방식으로, Kotlin 기능을 활용합니다 그래서 우리는 그렇게 할 수 있습니다 그래서 Kotlin은 KEEP이라고하는이 과정을 가지고 있습니다

Kotlin 진화 및 향상 프로세스입니다 오늘 아침 우리는 이러한 주석을 제안했습니다 KEEP-110으로 이것이 우리가 제안하는 것입니다 Kotlin 컴파일러에 추가하여 이러한 주석을 이해하십시오 우리는 ExtensionFunction과 ExtensionProperty를 가지고 있습니다

정적 메소드 용; 기본값, 매개 변수에 대한 공급 및 기본값을 허용합니다 KtName을 사용하면 메소드, 필드 또는 매개 변수의 대체 이름을 제공합니다 이제는 매우 빠릅니다 이러한 이름은 변경 될 수 있습니다 의미가 변경 될 수 있습니다

이것은 실제로 받아 들여지지 않을 수도 있습니다 Kotlin 컴파일러에 넣습니다 우리는 JetBrains 팀과 협력 해 왔습니다 이것에 대해 꽤 오랫동안 그리고이 중 일부는 이미 프로토 타입 화되어 있습니다

Kotlin 컴파일러 내부 우리는 이것이 이것이 우리가 향상시킬 수있는 방법이라고 생각합니다 Kotlin 발신자 용 Android 프레임 워크, 실제로 Android를 다시 작성하지 않고도 프레임 워크, 또는 적어도 API, Kotlin에서 실행할 수 있는 그리고 이것이 중요한 선택 임에도 불구하고, 실제로 그것을 Kotlin 컴파일러로 만든다고 가정합니다 모든 문제를 완전히 해결하지는 못한다

기존 확장이 해결되고 있음을 KEEP-110에서 제안한 이러한 주석을 결정했습니다 수많은 오픈 소스 라이브러리를 살펴보고, 우리 자신의 도서관을보고, 우리가 가장 유용한 확장이라고 생각했던 것을 보았습니다 자바 메소드의 패턴이 원하는대로 확장으로 변환 될 수 있습니다 그리고 후자의 두 가지는 실제로 보완 적입니다 특수 효과의 큰 장점 당신이 진리의 유일한 원천을 유지한다는 것입니다

당신은 정말로 Kotlin을 알 필요가 없습니다 빌드 시스템에 Kotlin 컴파일러를 추가 할 필요가 없습니다 형제 유물을 게시 할 필요가 없습니다 순수한 자바 라이브러리 일지라도, 이러한 특수 효과를 추가하고 API를 향상시킬 수 있으므로 Kotlin 호출자는 더 관용적 인 구문을 사용합니다 괜찮아

요약하자면, Core-KTX는 이제 Android Jetpack의 일부입니다 Android Jetpack과 함께 출시 된 Android Jetpack으로 버전이 지정되었습니다 화면에 표시되는 것처럼 몇 가지 새로운 아티팩트가 있습니다 확실히 더 많은 것이 있습니다 우리가 생각하는 주목할만한 것들 조각 및보기 모델입니다

그래서 나는 유물을보고 놀랄 것입니다 앞으로 몇 개월 안에 Kotlin 버전을 확인하십시오 참조 문서의 이것은 매우 빠릅니다 이것은 [? 도카?] 우리가 어떻게 문서를 생산하는지 그래서 우리는 단지 거기에 나가서 당신을 미리보기로 보여주고 싶었습니다

이것은 분명히 적극적으로 노력하고 있습니다 Android 버그에 새로운 구성 요소가 있습니다 안드로이드 KTX에 대한 추적기 Core-KTX와 모든 KTX 라이브러리 진실의 원천 인 제트 팩의 일부가되었습니다 Android 지원 리포지토리로 이동했습니다

GitHub 문제를 GitHub로 마이그레이션 할 것입니다 앞으로 몇 주 안에이 버그 트래커에 프로젝트를 맡기십시오 하지만 우리는 여전히 GitHub 레포에 대한 요청을 받아 들일 것입니다 GitHub 저장소로 다시 동기화합니다 문제가 더 이상 나타나지 않을 것입니다

GitHub에서 진실의 근원 Android 버그 추적기에 표시됩니다 [? KEEP?]이 제안되었습니다 한 시간 전에 풀 요청을 만들었습니다 가서 확인해 봐

이 문서에는 예제에 대해 더 자세히 설명되어 있습니다 그리고 내가 말했듯이, 선택된 주석 우리가 가장 큰 영향을 줄 것이라고 생각하는 것들이었습니다 그러나 문서의 맨 아래에, 당신은 그것을 볼 것입니다, 만약 이와 같은 것이 받아 들여지면, 미래의 더 많은 향상을위한 잠재력이 있습니다 그 링크가 이것이어야합니다 어제 밤 제가 제출하기 전에이 링크를 만들었어요

잘하면, 정확합니다 그리고 그게 다야 고맙습니다 [박수 갈채] [음악 재생]

Android Jetpack: KTX – Sweeter Kotlin Android Development

[ROCKET ROARING] FLORINA MUNTENESCU : 올해 초, 우리는 안드로이드 KTX의 미리보기 – Android 프레임 워크에 대한 일련의 확장 Kotlin과 함께 개발하는 것을 목표로했습니다 명확하고, 쾌적하고, 관용적이다

그 이후로 우리는 여러 버전을 출시했습니다 지역 사회의 기부금도 포함됩니다 이름을 core-ktx로 변경했습니다 이제 10 알파 버전을 출시 할 예정입니다

제트 팩의 일부로 안드로이드 가속화를 목표로 한 우리 도서관 세트 개발 core-ktx 라이브러리에는 확장이 포함되어 있습니다 프레임 워크의 특징과 기능에 대해 설명합니다 하지만 우리는 다른 Android Jetpack을 잊지 않았습니다 도서관 – 오래되었거나 새로운 것

조각 관리자와 같은 Android X의 수업, 컬렉션, 실시간 데이터 반응 형 스트림 및 새로운 탐색 구성 요소가 KTX 아티팩트와 관련되어 있음 언어의 기능을 활용하여, 확장 기능 및 속성, lambdas, named 및 기본 매개 변수 이제 몇 가지 예를 살펴 보도록하겠습니다 KTX가 없으면 단편 트랜잭션 수행 트랜잭션을 시작하고 조치를 트리거해야합니다 단편 추가 또는 교체, 네 가지 커밋 방법 중 하나를 결정합니다 커밋을 예약할지 또는 호출할지 여부에 따라 동 기적으로 상태 손실을 허용하거나 허용하지 않습니다

fragment-ktx는 트랜잭션 확장 함수를 추가합니다 FragmentManager 클래스에 모든 트랜잭션 시작 및 상용구 커밋, 동기화 및 상태 손실에 대한 기본값 제공 쉽게 덮어 쓸 수 있습니다 건배를 표시 할 때 전화 쇼를 잊지 않으려면, 코드를 단순화하려면 컨텍스트 확장을 사용하십시오 core-ktx의 기능 Spans API로 작업 하시겠습니까? 주요 클래스에 확장 기능을 추가했습니다

span 문자열, spannable 문자열 및 spannable 문자열 작성기 – API를 사용하기 쉽고 관용적으로 만들 수 있습니다 그래서 예를 들어, 문자열에서 spannable 만들기, 텍스트를 굵게 표시하고 빨간색으로 만 표시 이렇게 쉽게 할 수 있습니다 메뉴 항목을 각각 만들 수 있습니다 – 동작 수행 메뉴의 각 항목에서 특정 항목이 또는 항목을 쉽게 제거 할 수 있습니다 Android X 지원 SQLite 데이터베이스를 사용할 때 데이터베이스 트랜잭션 구현, 당신은 많은 상용구가 필요합니다 sqlite-ktx를 사용하면 중요한 것에 집중할 수 있습니다

데이터베이스에서 수행하려는 조작 그런 다음 거래 방법을 보겠습니다 나머지는 처리하십시오 Android Jetpack의 새로운 탐색 구성 요소 이미 도메인 관련 언어를 제공하고 있습니다 예를 들어 코드를 설정하려면 탐색 동작이있는 탐색 그래프 뒤로 버튼을 10 번 누르지 않아도됩니다

과거의 모든 결과를 통해 애니메이션이 있습니다 들어가고 나가기 위해, 당신은 무언가를 쓸 것입니다 이렇게 시작 목적지를 기준으로 그래프를 작성하고, 대상 ID가있는 검색 작업을 추가하십시오 및 탐색 옵션

탐색 옵션에서 검색 조각을 설정합니다 진입 및 종료 애니메이션이있는 SingleTop으로 시작됩니다 그래서 핵심 단편 탐색과 다른 것들 – 이 모든 것들은보다 깨끗하고 단순하며, Kotlin과 함께 더욱 관용적 인 Android 개발 그리고 여기서 멈추지 않을 것입니다 더 많은 뉴스를 원하시면 GitHub, YouTube 및 Twitter에서 팔로우하십시오

[ROCKET ROARING]

Introducing Android Jetpack

Android Jetpack Android Jetpack을 소개합니다 차세대 컴포넌트와 도구로서 아키텍처 안내와 함께 여러분의 Android 개발이 빠르게 진행되도록 도와주게 설계되었습니다 이전 버전과 호환이 어렵다는 의견을 주셔서 지원 라이브러리를 만들었습니다 데이터가 변할 때마다 앱을 관리하기 어렵다는 의견을 주셔서 아키텍처 컴포넌트를 만들었습니다 더 많은 기능을 원한다는 의견을 주셔서 더 기능을 추가했습니다 Android 아키텍처 컴포넌트는 즉시 제작 가능한 Android 코드를 작성하는 템플릿을 제공하여 새로운 개발자들이 빠르게 합류할 수 있도록 도와줍니다 Jetpack은 4가지 카테고리로 컴포넌트가 구성되어있습니다 Foundation, 아키텍처 Behavior 그리고 UI입니다 각각의 컴포넌트는 개별적으로 적용 가능하고 이전 버전과 호환성을 유지할 수 있게 합니다 Android 아키텍처 컴포넌트는 매우 모듈식입니다 앱에 적용될 수 있는 기능 중 여러분이 원하는 기능 세트를 고르고 선택할 수 있습니다 수명주기 관리 전문가들과 관리되는 컴포넌트들은 시험할 수 있고, 튼튼하고 높은 퀄리티의 앱을 만들 수 있도록 집중할 곳을 분산시켜줍니다 걱정할 필요가 없는 중요한 점은 어느 코드가 어디로 가야 할지 고민하지 않아도 된다는 겁니다 따라서 몇 가지 모델을 시험할 수 있어 튼튼한 코드를 형성하는데 도움을 줍니다 수명주기 관리를 하지 않아도 되는데 이는 새로운 개발자들의 합류를 돕고 다른 모든 추가적 주제를 더할 필요 없이 적절히 모듈화된 즉시 제작 가능한 코드를 쓸 수 있게 도와줍니다 여러분을 더 생산성 있게 만들어주는 Kotlin 언어를 사용하는 장점도 있습니다 Jetpack은 유지, 내비게이션 백그라운드 태스크 및 수명주기 관리 같은 지루한 작업들을 관리해줍니다 여러분은 상용구 코드를 없애고 앱에서 강조하는 기능에 집중할 수 있습니다 데이터베이스 유지는 Android 커뮤니티에선 악몽과도 같았습니다 또한 Room에서 큰 발전이 있었죠 시험 가능성적인 면에서 Room은 고려될만합니다 따라서 예전에는 불가능했던 시험 대행 기능을 추가했습니다 유지 레이어에 어떠한 기반 시설을 설치하지 않고도 말이죠 Android Jetpack을 사용해서 모든 종류의 문제없이 여러분의 코드를 쉽게 유지시킬 수 있습니다 Zillow가 Android 아키텍처 컴포넌트를 사용한 이후로 사용자들은 앱에서 더 적은 양의 오류를 경험하고 있습니다 모든 Android 사용에 있어서 Jetpack에는 새로운 기능들이 계속 추가될 겁니다 시작하기 쉽습니다 여러분의 개발 속도 그대로 앱을 업데이트할 수 있습니다 모든 컴포넌트들은 플랫폼의 오래된 버전에서도 작동할 겁니다 developerandroid

com/jetpack을 더 알아보시고 시작해보세요