Android RecyclerView Tutorial || Json Parsing using Retrofit PART 2

이제 기본적으로 JSON 배열 응답을 얻기 위해 네트워크 호출을해야합니다 우리의 끝점에서

이를 위해 먼저 getCarsResponse () 메소드를 작성해야합니다 이제 개장 인스턴스를 만들어야합니다 여기에 기본 URL을 제공해야하므로 확인해야합니다 파싱하려는 JSON 배열 응답의 기본 URL json url을 복사하여 여기에 붙여 넣으십시오 이제 변환기 팩토리를 추가해야합니다 기본적으로이 변환기 팩토리는 JSON 배열을 변환하는 데 사용됩니다 Java 모델에 대한 응답이 더 쉬워졌습니다

빌드 미안을 클릭 빌드를 추가하십시오 개조 인스턴스가 작성되었습니다 이제 당신은 요청 인터페이스, 이것은 우리 모두를 선언 할 인터페이스가 될 것입니다 네트워크 통화에 필요한 엔드 포인트 요청 인터페이스를 만들어야합니다 이제 RequestInterfacejava에 정의 된 메소드를 호출해야합니다 여기서 우리는 자동차 모델을 응답 모델로 제공 할 것입니다 GET 요청을하기 때문에 GET으로 주석을 달 수 있습니다

우리는 변화해야한다 실제로 자동차 모델 목록으로서의 응답 모델은 자동차의 배열 목록으로 변경해야합니다 이걸 바꿔야 해 여기 또한 우리는 그것을 변경해야합니다 이 방법으로 전화를해야합니다 이제 자동으로 onResponse () 및 onFailure () 메소드를 생성합니다 기본 URL에서 엔드 포인트를 복사해야합니다 실제로 엔드 포인트를 기본 URL을 사용하여 RequestInterface의 메소드에 추가하십시오 이제 우리가 있는지 확인하기 위해 짝수 로그 문에 대한 토스트 문을 추가하십시오

이에 대한 응답을 얻습니다 이제 프로젝트를 실행 해보십시오

LG V30 Revisited Part 2: Android Pie

안녕, 알렉스 LG V30에 대한 비디오를 게시 한 후 며칠이 지나면 Android Pie를 받았습니다 내 한국 장치에 업데이트합니다

이 업데이트에 대한 나의 경험에 대한 간단한 비디오가 될 것입니다 가장 먼저 눈에 띄는 것은 UI에 대한 사소한 디자인 변경입니다 빠른 설정 패널이 약간 정리되었으며 아이콘이 업데이트되었으며 일부는 내장 된 앱 중 새로운 페인트 코트를 얻었습니다 그러나 대부분의 경우 여전히 매우 친숙한 LG 소프트웨어 경험입니다 그래도 기뻐할 것이 몇 가지 있습니다

앱 서랍에 액세스하기 위해 위로 스 와이프 할 수 있습니다 제스처 탐색을 사용하는 옵션이 있습니다 백그라운드에서 실행되는 앱을 제한하는이 새로운 설정 페이지는 새로운 것 같습니다 게다가 그것들은 물론 훌륭하지만 대부분의 사람들이 더 많은 방법에 관심이 있다고 생각합니다

수행합니다 대부분의 경우 오레오와 매우 유사하다고 생각하지만 일부 지역에서는 약간 느릴 수 있습니다 내가 상상하고 있는지 확실하지 않지만 앱 설정을 조정하려고하면 어떤 이유로 든 부진합니다 탐색 버튼으로 기존의 더블 탭 앱 전환을 사용하는 경우, 때로는 약간 느려질 수 있으므로 대신 제스처 탐색을 사용하게되었습니다 그 외에는 앱 출시와 관련하여 큰 차이를 느끼지 못했습니다

속도, 부드러움 또는 게임 성능 Android Pie에서는 속도가 느리다는 의견이 몇 가지 있지만, 거의 동일합니다 어쩌면 일반적으로 휴대 전화에 많은 앱을 설치하지 않기 때문일 수 있습니다 어쨌든, 처음에는 오레오에서 그렇게 환상적이지 않았습니다 그래도 한 가지 배터리 수명의 차이였습니다

배터리 제한 설정인지 Android Pie의 적응 형 배터리인지 확실하지 않습니다 기능이지만 실제로 배터리 수명이 약간 향상되고 있습니다 그것은 오레오의 시간에 약 4-5 시간의 스크린에서 파이에 대한 약 5-6 시간으로 갔다 그래도 Pie로 업데이트 한 후 공장 초기화를했음을 강조하고 싶습니다 도움이 될 수 있습니다

전반적으로, 그것은 나에게 큰 업그레이드는 아니지만 몇 가지 좋은 점이 있습니다 경험이 눈에 띄게 향상되었습니다 전화에 관한 이전 비디오와 관련하여 많은 변화가 없었습니다 좋은 거래에서 찾을 수 있다면 여전히 좋은 예산 옵션입니다 업데이트로 인해 전화가 조금 나아졌습니다

그러나 여전히 LG가 안드로이드 파이로 업데이트하는 데 오랜 시간이 걸렸다는 사실은 바뀌지 않습니다 따라서 좋은 소프트웨어 지원을 기대하는이 전화기를 구입하지 마십시오 이 비디오를 시청 해주셔서 감사합니다 앞으로 더 많은 콘텐츠를 얻으려면 채널을 구독하고 채널을 구독해야합니다 나는 항상 이것을 언급하는 것을 잊었지만, 당신이 어디에도 Instagram 계정이 있습니다

대부분의 시간을 찾을 수 있습니다 다시 한 번 감사드립니다 다음에 만나요

Android Dev Summit 2018 Livestream | Day 2, Theater 1

안녕, 안녕하세요 우리는 당신을 좌석

발표자의 호의로서, 우리는 모두에게 이 때 기기를 음소거합니다 좋은 아침 그리고 환영합니다 뒤로 모두들, 안녕하세요

다시 오신 것을 환영합니다 무대 DPAN 여기에와 주셔서 감사합니다 밝고 이른 아침에 우리는 일들이 30 분 일찍

실시간 스트림의 모든 사용자에게 오신 것을 환영합니다 우리의보기 파티에서보고 있던 모든 사람들 하나는 우리는 오늘 번개 같은 대화를하지 않습니다 제발, 너도 알다시피 가능한 경우 20 분짜리 세션에 모두 머물 수 있습니다 을 체크 해봐 한 번 더 계획을 세워 놓으십시오

인기 있는 말 너도 알다시피, 일정 변경 D8과 R8 토크는 일어나지 않습니다 워튼 씨는 특별한 프로젝트를 가지고 있으며 축하해드립니다 그걸로

대신 휴지통 토크가 있습니다 그러나 흥미 진진한 부분은 바로 지금 존경받는 부분입니다 그룹 folding에 대 한 이야기입니다 [박수] 좋은 아침, 모두들 나의 이름은 애드리안 루스입니다

저는 소프트웨어 엔지니어입니다 나는 Andrii이고 나는 멀티 디스플레이에서 일하고있다 저는 지선입니다, 저는 엔지니어링 디렉터입니다 지금까지, 우리는 당신이 삼성과 파트너가되었으며 우리는 무엇에 대해 더 깊이 들어가고 있습니다 즉, 접을 수있는 개발자를 지원하기 위해 우리가하고있는 일입니다

장치 Jisun은 삼성이 무엇인지에 대해 더 많이 이야기하고 있습니다 하기 그래서, 나는 그것을 지선에게 건네 주겠다 고맙습니다

그래서, 다시, 나는 삼성 모바일의 Jisun이고 나는 새로운 폼 팩터 디바이스에 대해 이야기 할 것입니다 삼성 개발자 컨퍼런스에서 발표했다 괜찮아 그래서, 나는 장치에 대한 더 많은 정보를 다룰 것이다 그 자체, 그리고 우리는 그 경험에 대해 이야기 할 것입니다, 새로운 foldable 장치는 사용자에게 가져올 것입니다

우리 모두는 스마트 폰이 새로운 지난 10 년간의 경험 그리고 실제로 변화합니다 사람들이 생각하고 행동하고 의사 소통하는 방식 또한, 그것은 또한 새로운 기회를 열었습니다 개발자

이제는 접이식 휴대 전화가 매우 독특한 경험을 제공 할 다음 게임 체인저 개발자에게 새로운 기회와 사용자에게 제공 혁신을 주도합니다 괜찮아 이제 이야기 해 보겠습니다 최초의 삼성 전자 접이식 휴대 전화 첫번째 삼성 전자 접이식 휴대 전화는 멀티 디스플레이로 설계되었습니다

두 개의 화면과 멀티 활동 창을 지원합니다 이제 실제 구성이 무엇인지 처음부터 살펴 보겠습니다 디스플레이는 실제로 보입니다 그래서, 이것은 메인 디스플레이입니다, 장치가 펼쳐졌을 때 메인 디스플레이가 충분히 크다

매우 독특한 경험을 제공합니다 경험 더욱 풍부 해지고 몰입하게됩니다 경험은 대형 스크린 스마트 폰에서도 거의 달성 할 수 없습니다 하나의 큰 화면에서의 경험 외에도 두 개의 멀티 태스킹은이 큰 것을 활용할 수있게 될 것입니다 최대 3 개의 멀티 활성 창이있는 화면 전화가 실제로 접혀지면 우리는 여전히 유용하고 휴대용 커버 디스플레이를 사용할 수 있습니다

이 모드에서, 이 경험은 일상적인 스마트 폰 사용과 매우 유사합니다 메인 디스플레이와 비교했을 때 경험은 집중되고 편리하고 빠른 상호 작용, 실제로 작은 화면을 활용하십시오 그러니까, 여기 있습니다 당신이 관심을 가질만한 몇 가지 숫자 이것은 사양 및 실제 화면의 크기

그래서, 45 인치 커버 디스플레이는 21 : 9HD 플러스 해상도와 320DP 73 인치 기본 디스플레이 42 plus 585DP와 동일한 420DP의 해상도가 가장 작습니다

폭 이것들은 당신이 알아야 할 숫자 일 것입니다 이제는 다음과 같은 예상 사용자 환경을 보여 드리겠습니다 몇 가지 예 그래서 기존의 스마트 폰 및 접이식 메인 디스플레이, 접이식 접을 수 있으며 응용 프로그램에 더 큰 위치를 지정할 수 있으며 실제로 화면의 내용이 더 풍부 해지고 화면에서 볼 수 있듯이 더 자세하게 표시됩니다

표지 화면에서 장치를 접었을 때 나는 그 경험을 말했다 빠르고 쉽게 액세스 할 수 있도록 최적화 할 수 있습니다 상호 작용 기기가 정상적으로 작동하는 동안 정상적인 스마트 폰 빠른 패널 또는 알림 또는 전화 또는 메시징을 강조 표시하는 것이 좋습니다

커버 디스플레이 우리는 당신이 당신의 전화로 걸려 오는 전화 커버 디스플레이와 메인 디스플레이가 각각의 매우 독특한 경험을 소유하고 있습니다 그것들은 분리되어 있지 않고 분리되어 있습니다 또한 연결이 끊어졌습니다

오히려 사용자 경험 디스플레이는 매우 연속적이고 원활하게 연결됩니다 예를 들어, 위치를 검색하려면 센터에서지도를 만들면 휴대 전화를 접어서 그 작업을 수행 할 수 있습니다 그러나 휴대 전화를 펼치면 응용 프로그램이 계속 실행됩니다 계속 실행됩니다 실제로 전화를 펼치면 무엇보다 시각적 인 단서가 많은 정보를 제공하십시오

인근에 있으며 다른 관심 지점에 대한 위치 정보는 무엇입니까? 갤러리 앱을 사용하는 것은 비슷합니다 앱 환경 접힌 모드와 펼쳐진 모드 사이에서 계속됩니다 멀티 태스킹을위한 멀티 액티브 창은 또한 주요 특징들 YouTube 동영상을 보면서 웹 사이트를 탐색하고 싶다면 비디오를 보면서 브라우저를 열고 웹 사이트를 탐색하십시오 연주

또한 친구가 메시지와 알림이 팝업되면 알림을 선택하고 세 번째 창으로 드래그하면 계속 동영상을 보면서 채팅 및 탐색을 계속할 수 있습니다 연주 그래서 우리는이 새로운 접이식 장치를 사용한 경험이 있습니다 Google, 개발자 가이드 및 일부 응용 프로그램을 더 나은 안드로이드 지원 foldables 그것을 공유해 주셔서 감사합니다

지선 [박수] 그래서 조금 더 얘기합시다 앱에서 접이식을 활용하는 방법에 대해 우리가 그렇게 할 수있는 지침의 종류 그래서, 첫번째로 화면 연속성입니다 그것은 우리가 개념이라고 부르는 것입니다

접거나 펼친 후에 현재하고있는 일을 계속합니다 장치 그리고 여기 예제가 있습니다 우리는지도를 가지고 있습니다 접힌 장치를보고 있습니다

그리고, 당신은하고 싶습니다 네가있는 곳의 주변 환경에 대해 좀 더 알아봐 보고 따라서 사용자로서 휴대 전화를 펼치면 지속적인 경험, 우리는 여전히 같은 장소를보고 있습니다 상태가 유지되고 전화가 더 많이 걸릴 수 있습니다

폼 팩터의 이점 그리고 이것은 실제로 실제로는 아닙니다 안드로이드의 새로운 것, 맞죠? 우리는 비슷한 것을 다루어야했습니다 화면 회전이나 변경과 같은 상황 – 화면 크기 변경 또는 – 죄송합니다 창 크기 변경 다중 창

그래서, 왜 신경 써야합니까? 앱을 만들 때 연속성을 유지할 수 있습니까? 사용자가 이유와 이유는 다이빙을 원하기 때문입니다 그들이 현재하고있는 일에 더 깊이 들어가게됩니다 그래서 그들이 정말로 방해받지 않을 때 가장 잘 작동합니다 그렇게 할 때의 경험은 중단 한 부분에서 계속할 수 있습니다 펼쳐지기 전에

따라서 만족스러운 사용자를 위해 경험이 있다면, 이것이 실제로 잘 작동하는 것이 중요합니다 그것은 대단한 것 같습니다 자, 어떻게 이걸 실제로 풀어 냅니까? 글쎄, 내가 말했듯이, 안드로이드는 이것에 익숙하고 우리는 이를 처리 할 시스템을 구축했습니다 접기 및 전개 장치는 구성 변경으로 간주됩니다 화면 크기 및 화면 레이아웃 범주

그리고, 당신을 지원하기 위해 그걸로 안드로이드 시스템은 기본적으로 구성 변경이 발생할 때의 활동 이것은 레이아웃 변경을 처리하는 장점이 있습니다 새로운 것을 활용할 때 만들 수 있습니다 구성 그러나 그것은 앱으로서 당신이 사용자가 그 이후에 있던 상태를 복원 할 책임이 있습니다 활동이 다시 만들어졌습니다

이를 지원하기 위해 state facility와 새로운 Jetpack 라이브러리 소개 ViewModel은이를 지원합니다 다른 방법으로는 구성을 적용하고 조정하여 구성 변경 귀하의 레이아웃 그렇게하기 위해, 당신이 처리 할 수 ​​있다고 선언 할 수 있습니다 매니페스트의 구성이 변경되었지만 수동으로 화면 크기를 조정해야합니다 멀티 윈도우를 올바르게 구현하고 활동 크기 조정 가능

이제 다음 단계로 다중 창에서 라이프 사이클을 변경합니다 당신은 왼쪽의 현재 행동 그것은 활동 만 마지막으로 터치 한 사용자는 재개 된 상태이며 모든 기타는 일시 중지 상태입니다 사용자에게 다소 혼란 스럽습니다 왜 일부가에 왜 있는지 즉시 볼 수 없기 때문에 상호 작용이 덜한 상태이며 유지해야 할 한 가지 더 있습니다

개발자로서 멀티 윈도우를 타깃으로 할 때 우리는 다중 재개 모드 도입 정말 간단합니다 모든 화면 상단에있는 멀티 윈도우의 활동 표시가 모두 다시 시작 상태입니다 이제 Android Pie는 원래이 동작을 제공하지 않았습니다 따라서 Android Pie에서이 기능을 선택하도록하고 있습니다

앱 개발자 작업과 함께 적용됩니다 장치 제조업체가 실제로이 기능을 구현합니다 우리 사양에 따르면 그러나 향후 버전에서는 안드로이드의 경우, 우리는이 필수 동작을 기대하고 있습니다 따라서 앱을 보유하고 있고 이 단순화 된 라이프 사이클은 어떻게 선택합니까? 다시 말하지만, 귀하의 안드로이드 매니 페스트에 하나의 깃발

하나의주의 사항이 있습니다 그러나 여러 활동이있을 수 있기 때문에 동시에 재개된다 코드 주위에서 정말 신중해야합니다 하나의 다시 시작된 활동을 저장합니다 그 중 하나보다

라이브러리와 프레임 워크를 신중히 다루십시오 그것은 동일한 가정을 할 수도 있습니다 그리고, 나는 Andrii에게 넘기겠다 멀티 윈도우 / 멀티 디스플레이에 대해 이야기하기 이제는 멀티 스크린 장치에 대해 더 자세히 이야기 해 보겠습니다

에이 디스플레이에서 활동을 시작할 수 있습니다 그것이 무엇인지 보자 실제로 귀하의 활동을 의미합니다 우선, 활동이 기본값이 아닌 화면에있는 경우, 활동 컨텍스트는 다음과 같습니다 비 시각적 응용 프로그램 컨텍스트와 다른 방송 수신기 및 콘텐츠 제공 업체에서 사용할 수 있습니다

시각적 개체의 컨텍스트가 디스플레이에 맞게 조정됩니다 표시되는 영역 동일한 API를 사용하여 현재 표시하고 다른 컨텍스트 유형을 사용하여 요청하십시오 그것을 위해, 당신은 다른 결과를 얻을 것이다 현재 디스플레이, 당신은 얻을 수 있습니다, 활동 및 응용 프로그램에서입니다 컨텍스트는 항상 기본 디스플레이를 제공합니다

다른 맥락은 또한 다른 자원을 의미하며 구성 자동으로 업데이트됩니다 올바른 상황에서 요청하기 만하면됩니다 UX를 ​​조정하려면 활동을 사용해야합니다 사용자는 자신의 활동을 다른 곳으로 옮길 수 있습니다

화면을 다른 지점으로 이동하십시오 대부분의 경우, 당신은 기대할 수 있습니다 이 장소는 다른 크기, 밀도 및 해상도 즉, 음소거 된 활동은 구성 변경 처리하도록 선언 된 경우 변경, 그것은 새로운 구성으로 통보됩니다

그렇지 않다면 시작됩니다 최고의 경험을 제공하기 위해, 우리는 언제든지 설정 변경을 처리 할 것을 권장합니다 가능하고 앱이 어떤 디스플레이를 알고 있어야하는지, ondisplay에서 찾을 수 있습니다 당신이 원한다면? 이러한 추가 화면의 장점은 무엇입니까? 어떻게 사용합니까? 첫 번째 단계는 디스플레이에 대한 정보를 얻을 수 있습니다 플래그, 메트릭 및 상태를 확인할 수 있습니다

예를 들어, 당신은 미디어 콘텐츠 또는 필터를 제공하는 라이브 화면을 찾을 수 있습니다 현재 꺼져있는 디스플레이를 끄십시오 어떤 디스플레이를 사용할지 결정한 후에는 활동 옵션 API를 사용하여 활동을 시작하십시오 Android I / O에서 사용할 수 있습니다 새로운 인스턴스를 원하면 액티비티를 사용하는 경우 해당 플래그를 사용하고 새로운 작업을 시작합니다 때로는 시스템이 일부 특정 디스플레이로 활동 시작을 제한합니다

예 : 비공개 디스플레이 당신은 이것을 기대할 수 있습니다 실제로 가지고있는 여러 플랫폼이 있다는 것을 기억하십시오 멀티 디스플레이 장치 휴대 전화는 우리가 다룬 한 가지 예입니다

오늘 다음으로 데스크톱 모드가 있습니다 향상된 화면을 위해 휴대 전화를 대형 화면에 연결할 때 생산성 또는 엔터테인먼트 Chrome에서 실행되는 Android 앱 OS 이 두 가지 경우 모두 앱은 일반적으로 자유 형식 모드이고 사용자는 자유 형식 모드를 기대하며 부드럽게 크기를 재조정 할 수 있습니다

마지막으로 중요한 것은 자동차 다 기계적 인조 인간 자동차에는 여러 개의 스크린이있을 수 있습니다 예를 들어, 뒷좌석의 아이들은 같거나 다른 게임을하고 있을지도 모른다 운전자가 내비게이션을 사용하는 동안

앱의 경우 일반적으로 너무 많으면 안됩니다 differents Android 기기에서 앱 동작을 확인하려면 O 이상을 실행하면 시뮬레이션 된 디스플레이를 만들 수 있고 그곳에서 당신의 활동을 시작하십시오 이 순간, 시뮬레이션 된 디스플레이가 터치를 처리하지 않습니다 우리는이 문제를 개선하기 위해 노력하고 있습니다

새로운 개발자 도구를 추가 할 예정입니다 이 새로운 플랫폼과 기존 플랫폼을 모두 사용하여 앱을 최적화하고 멀티 스크린 환경을 구축하십시오 당신 앱을 테스트하고 해당 실행 모드를 설정할 수 있습니다 이 경우 여러 활동이있을 수 있음을 잊지 마십시오 집중했다

또한 공유 데이터를 사용하고 다른 아키텍처 구성 요소의 이점 [박수] 이제 우리는 오늘 사용할 수 있습니다 앞으로있을 일을 자세히 살펴 보겠습니다 foldables 및 멀티 디스플레이 장치와 미래 에서 단기적으로 안드로이드 파이를 위해 우리는 개발자를 연구 중이다

가이드 라인을 제시하고 최선의 목표를 제시하는 방법을 알려 드리겠습니다 접이식 및 멀티 디스플레이 장치 우리는 또한 다시 게시 할 블로그 게시물 우리가 이야기 한 모든 것에 대한 정보 그리고 우리는 또한 삼성 전자와 협력하여 개발할 수있는 에뮬레이터 출시 구성 변경 동작에 대해 앱을 테스트하십시오 그리고 그들의 장치가 갈 멀티 이력서 행동 있다

조금 더 살펴보기 미래, Android의 향후 버전으로 접이식 및 멀티 디스플레이 장치 지원 그 중 일부는 에뮬레이터를 향상시킬 예정이므로 모든 접이식 모델을 시뮬레이션 할 수 있습니다 Andrii도 언급했듯이 멀티 디스플레이 동작 마지막으로, 더 많은 정보를 찾을 수있는 몇 가지 지침이 있습니다 다음 날에는이 블로그 게시물을 올릴 것입니다 저기있다

더 많은 정보를 얻을 수있는 삼성 개발자 사이트 삼성 전자 기기 및 가이드 라인 및 테스트에 대해 당신의 애플 리케이션, 삼성 에뮬레이터도 사용할 수 있습니다 그들의 Q4에서 언젠가 웹 사이트 괜찮아 이 시점에서 나는 또한 모든 놀라운 경험에 감사드립니다 개발자는 Android 용으로 제작 중이며 매우 흥분됩니다 당신이 다음에 무엇을 할 것인지, 다음에 무엇을 할 것인지를보기 위해 접이식 장치의 다음 폼 팩터

고맙습니다 [박수] Q & A 영역에 있어야합니다 나중에 휴식 시간에 우리에게 이야기하십시오 괜찮아 나는 단지 사소한 일을하고 싶었다

하나는 우리가이 Q & A 슬라이드를 갖게 될 것을 눈치 챘을 것입니다 이것들은이 QR 코드를 가지고 있습니다 여기 안드로이드 개발 회의에서 세션 저희에게 알려주십시오 이번에는 많은 실험을했습니다

두 번째로, 우리가 D8과 R8 토크를 갖고 있지 않다는 것을 압니다 그러나 우리는 샌드 박스 영역에서 기술 선도를 가지고 있습니다 만약 당신은 R8에 관심이 있습니다 샌드 박스 영역 하루 종일 모든 세션을 평가할 수 있습니다

오늘, 단일 QR 코드에서 고마워요 즐겨 나머지는 하루 이 방에있는 모든 사람들, 다음 세션이 시작됩니다 오전 10:20 감사합니다

여러분, 어서 오십시오 우리는 당신이 당신의 자리를 차지하도록 초대합니다 우리 프로그램은 3 분 안에 진행될 것입니다 마찬가지로 우리의 발표자에게 예의를주십시오, 귀하의 장치를 음소거하십시오 환영합니다, 모두들

제발 앉아서 [박수] 안녕하세요 나는 크리스 나는 앨런이야 우리는 여기에 대해 이야기하고 있습니다

픽셀 우리는 실제 기술에 대해 생각할 필요가 있습니다 그곳에 LCD의 두 가지 주요 기술입니다 대다수의 장치 중간 수준에서부터 높은 레벨 플랫폼에서도 그것도

LCD는 액정을 의미합니다 디스플레이 그들은 액정이라고 부르는 것을 사용합니다 각 픽셀은 컬러 채널로 구성됩니다 그들은 백라이트

그래서, 액정은 밝게 빛나지 않습니다 그들 자신 이제 LCD 디스플레이에 대한 대부분의 전력이 사용됩니다 그 백라이트에 그래서, 더 많은 밝기가 더 많은 전력입니다

Olet 디스플레이는 실제로는 스스로 빛을내는 다이오드입니다 백라이트가 필요 없습니다 좋은 점은, 여기, 그들은 진정한 흑인을 허용한다는 것입니다 따라서 LCD를 사용하면 당신은 검은 색을 이룰 수 있습니다 절대로 어두운 검은 색을 결코 얻지 못합니다

Olets는 다릅니다 그들은 픽셀을 켜지 않고 그 방법을 사용합니다 너 검은 색이야 그것이 권력입니다 그리고 전원은 빛을 방출하여 전원이 공급됩니다

이제는 여러 가지가 있습니다 준비, 당신은 R, G 및 B가 있습니다 똑바로 정신적으로 단순합니다 RGBR과 같이 더 복잡한 것들이 있습니다 각 픽셀에는 2 개의 채널 만 있습니다

그것은 그 안에 많은 LED를 맞추지 않고 픽셀 크기를 확장 할 수 있습니다 전력면에서 더 많은 LED가 더 많은 전력 사용량과 동일합니다 우리는 지난 1 년 또는 2 년 동안 통계가 완료되었으며 디스플레이가 장치의 가장 강력한 고급 사용자입니다 당신은 차트를 볼 수 있습니다 표시할수록 더 많은 전력이 사용됩니다

모두가 이것을 가정합니다 케이스 하지만 문제는 실제로 매우 선형입니다 다시, 단순한 종류 그런 다음 우리는 oled 기기 대 LCD 화면의 차이를 보여줍니다

우리 정상적인 날 모드와 야간에지도의 스크린 샷이있다 방법 우리가 스크린 샷을 사용하는 이유는 차이가 iOS 또는 그것을 보여주는 안드로이드 밤에 실제로 암페어 수 그리고 하루는 똑같습니다 그것 때문에 변경되지 않습니다

LCD 화면 그러나 픽셀 자체에서는, 그것이 oled이기 때문에 디스플레이, 전력은 63 % 감소합니다 가장 큰 파워 유저 어두운 테마를 사용하여 개별 픽셀 색상을 사용하는 경우 더 자세히 살펴 보겠습니다 그래서, 우리는 하나의 색상을 디스플레이 그리고 실제 색상 자체가 차이를 만듭니다

힘 파랑은 녹색 또는 빨강보다 24 % 더 강력합니다 과 그런 다음 다른 차트를 이전 차트,하지만 당신은 검은 색이 가장 적게 사용하고 있음을 볼 수 있습니다 양의 힘 우리가 하얀색을 가질 때까지 올라간다

때문에 흰색은 모든 채널을 사용합니다 빨간색, 녹색, 풀 블루, 가장 많은 양의 색상이 필요하며 우리가 너를 밀어 붙이는 색깔? 우리는 빈에서 바뀌었다 이 하얀 주제에 우리는 측면에서 발에서 우리 자신을 쐈다 힘의 Google 앱을 살펴 봅시다

작년과 절전을 통해 그들이 할 수 있었던 있다 이리 YouTube의 최고 밝기 배터리의 43 %를 절약 할 수 있습니다 용법 동영상을 재생할 때 중요하지 않습니다

어쨌든 일시 중지되면 저장됩니다 더군다나 60 %입니다 내 추측으로는 여기에 비디오는 실제로 비디오를 어둡게합니다 더 어두운 색상이므로 더 많은 전력을 절약 할 수 있습니다

이 테스트 자체는 동영상 콘텐츠에 크게 의존합니다 비디오가있는 경우 그것은 완전히 하얀색입니다 그렇게 많이 절약하지 않을 것입니다 Gboard가 좋은 예입니다 사용자가이를 제어하고 20 %를 절약 할 수 있습니다

귀하의 배터리 또는 디스플레이 배터리의 사용에 의해, 그냥 어두운 테마로 전환합니다 마지막으로지도에서 어두운 테마의 예와 그것이 정말 위대한 이유 배터리의 명백한 이점을 가지고 있습니다 지도가 필요하지 않습니다 당신이 밤에 운전할 때 정말 하얀 테마였습니다 그래서 어두운 테마는 야간에 앱을 더 유용하게 만듭니다

환경 그리고 이제 앨런이 얘기하려고합니다 괜찮아 그렇다면 우리는 어떻게 어두운면을 받아 들일 수 있습니까? 우리의 애플 리케이션에 어두운 모드를 구현? 어두운 테마로 들어가기 어느 여기에 배터리를 저장하지는 않겠지 만 장치

따라서 개발자는 야간 모드를 기억할 수 있습니다 작년 안드로이드 미리보기 또는 그 해 또는 그 이전 해 그 전에 또는 그 전에 년 그러나 우리는 app compats에서 주야간 지원 멋진 블로그가 있습니다 그것에 관한 기사

구현하기위한 권장 방법 앱의 어두운 모드는 기본적으로 무료로 제공됩니다 낮 / 밤 이것을 무료로 거의 얻을 수 있습니다 주식 위젯이 장치의 밤의 변화에 ​​응답합니다 모드를 선택하면 명암 모드를 전환 할 수 있습니다

이것은 AndroidX 결제 데모 당신이 그것을 가지고 있다면 AOSP, 너 좀 봐 전환하는 코드는 한 줄입니다 이전에 사용하던 테마와 앱 호환성 사이 앱 테마가 무엇이든간에 가져 가면됩니다

낮 / 밤 테마 중 하나에서 내재되어 있습니다 모두 그냥 작동 할 수도 있습니다 오버레이를 적용 할 수도 있습니다 테마를 동적으로 런타임에 그래서 당신이 순수한 검은 색 테마를 이미 사용하고있는 앱이 있습니다

또는 핑크 헬로 키티 테마를 사용하면 런타임에이를 수행 할 수 있습니다 만약 너라면 오버레이 테마에 대해 자세히 배우고 싶습니다 Chris와 제가 이야기했습니다 몇 년 전 I / O에 있던 사람들 이렇게하면 언제든지 테마가 설정하면 바로 검은 테마로 오버레이됩니다

또는 헬로 키티 테마와 부 풀린 뷰는 그 테마를 올바르게 사용하는 것 괜찮아 어느 쪽이든, 당신은 테마 속성에 앱을 구성하려고합니다 모든 플랫폼 드로어 블은 테마 속성에 크게 의존합니다 그들의 색깔을 얻기 위하여

색상 전경, 색상 제어 정상, 색상 악센트 엄지 손가락 – 죄송합니다, 스위치는 당신이 좌우로 드래그 할 수 있습니다 그 아래에있는 것은 사용 가능한 경우 밝은 회색으로 표시됩니다 어두운 회색 사용할 수 없습니다 그 구현은 색상 선택기, 색상을 나타내는 색상 상태 목록 속성은 밝은 테마 아래 흰색입니다

어둠에 검은 색 테마 및 알파 우리는 빛과 어둠에 따라 그 차이가 있습니다 테마 하드 코딩 된 색상이 없습니다 이리

우리는 이것에 대해 나중에 이야기 할 것입니다 Nick Butcher와 함께 테마와 스타일에 대해 이야기합니다 괜찮아 그래서, 나는 야간 모드가 나타났다는 것을 언급했다 그만큼 qualifier는 SDK 8부터있었습니다

안드로이드 N에서 일반적인 사용, 그래서 밤을 설정하는 기능 시스템 전체에서 한정자를 사용하는 경우 실수로 설정 한 일부 앱이 있습니다 그것 메신저가 최근에 그 일을 해왔다 결정된 연구 한정어예요

초상화 또는 풍경과 비슷합니다 방금 생성 한 드로어 블 / 야간 및 어려운 리소스가있는 경우 테마 색상 추출, 환영 스플래시 이미지 사용 그것은 복잡합니다 어두운 버전을 얻을 수 있습니다 벡터 드로어 블에 넣기에는 너무 복잡해, 당신은 그것을 버릴 수있다 drawable 밤에

해당 드로어 블을 자동으로 선택합니다 색상에 대해 동일한 작업을 수행 할 수 있습니다 전환하려는 색상이있는 경우, 당신의 악센트 색깔이 더 어둡다고 말하면, 당신은 그것을 추출 할 수 있습니다 색상 자원, 색상이 한 가지 버전, 값이 하나 인 버전 밤 여기 주제가 무엇입니까? 구현은 다음과 같이 보일 수 있습니다

당신이 부모 한정 테마를 기반으로하는 부모 테마는 한 번만 정의 할 수 있습니다 값과 한 번 값 밤에 그것을주고 다른 부모 야간 모드가 아닌 경우 라이트 테마를 선택합니다 야간 모드에서 참조 될 때, 야간 예선 자 가 켜져 있으면 밤 테마를 선택하게됩니다 두 가지 다른 방법으로 참조 된 동일한 색상을 사용합니다

밤이 아닌 모드에서 검은 색이 나타납니다 그것은 밤 모드에서 화이트 업 앱 업데이트가 가능할 때, 아마 약간의 구조 조정을 할 것입니다 가져 가라 귀하의 애플 리케이션의 스크린 샷, 그것을 반전, 어떻게 보이는지보십시오

도착 이미지가 있는지 여부에 대한 감각을 가질 필요가 있습니다 alturnive 버전의 우리에게는 아바타가 있습니다 어쩌면 우리는 변화시키고 싶습니다 배경색이 조금 섞여서 추출하는 것을 의미 할 수도 있습니다

테마 속성 또는 다른 PNG 집합을 드롭합니다 drawables 밤 다음으로 설문 조사를하고 싶습니다 레이아웃 XML 및 스타일에서 색상 사용법에 대해 설명합니다 테마의 부모를 어두운 색으로 설정합니다

themeappcompat 또는 themematerial 네가 원할거야 당신이 대조를 잃고 있는지보십시오

너 뭐야? 당신은 그것을보아야한다 모든 배경색과 전경 색상은 밝은 테마로 하드 코딩되었습니다 하드 코딩되지 않은 한 가지는 – 거의 여기를 보아라 – 지금은 이름이 적혀있다 보이지 않는 것은 그것이 올바르게 당기는 유일한 것입니다

어두운 테마 색 속성 그래서, 이것은 가고있다 많은 일을 요구한다 어려운 부분은 그것을하고있다 작업

따라서 색상을 리팩토링해야합니다 가능한 하드 코딩 된 레이아웃을 XML로 가져 와서 이동하십시오 그 (것)들을 명명 된 색상 자원에 에 기초를 둘 수 있습니다

값 / 값 밤 하나 이상의 주제를 다루고 싶다면, 당신은 그것들을 색 속성들로 추출하여 귀하의 응용 프로그램에서 의미의 일종 텍스트 색상이 있습니다 기본, 우리는 색 도끼를 보내, 우리는 기본 색 있습니다 당신 가능한 한 많이 사용하고 확실히 복용해야합니다

색상을 지정하기위한 테마 속성의 이점, 그것들을 당신의 목록과 레이아웃으로 전파합니다 PNG를 알파 마스크로 변환하고 색조를 변환 할 수 있습니다 비트 맵이있는 곳을 감쌀 수 있습니다 다시 얘기하자 테마와 스타일 이야기에서 이것에 대해 조금 더 오늘

다음, 당신은 야간 모드에서 자동 전환 자, 우리는 Twitter를 가지고있다 애플 리케이션 사이에 전환을위한 매우 분명한 어도비 밤낮으로 따라서 이것을 탭하면 어두운 모드가됩니다 플랫폼 지정 어두운 노드가 있으므로 삼중 체

너는 또한 시험하고 싶을거야 야간 모드가 변경되면 응용 프로그램이 작동합니다 당신이 사용할 수있는 ABD, 앱을 열고, 주간 / 야간 테마를 구현 한 후, 그것을 밤에 토글합니다 그것은 전체를 통과 할 것입니다 디스플레이를 사용하고 데이터를 사용하여 다시 만들고 보존합니다

P를 실행하는 픽셀 3 기기에서 야간 모드가 전환되고 배터리 절약 모드로 들어갑니다 개발자와 전환 할 수 있습니다 옵션 및 푸시 노드가 항상 켜져 있거나 항상 꺼져 있거나 하나가 될 수 있음 우리가 가지고있는 유산은 일 테마로 더 많은 것을 배울 수 있습니다 스타일은 Nick Butcher와 나중에 이야기 할 것입니다

오늘 하위 레벨에 대해 더 자세히 알고 싶다면 Chris와 나는 Google I / O에서 멋진 대화를 나눴습니다 그래서 알고 싶은 모든 것을 다루지 만, 두려워했습니다 주제와 스타일에 대해 물어보십시오 우리는 Android 라운지는 질문에 대한 답변을 제공합니다

고마워, 모두들 어두운면을 받아주세요 [박수 갈채] 안녕하세요, 제한 사항으로 배터리 수명 개선에 오신 것을 환영합니다 내 이름은 Jingyu Shi, 저는 파트너 개발자입니다 안녕하세요, 저는 Amith Yamasani입니다

오늘, 우리는 우리가받은이 알림, 주위에 결코 희망 이 시간 우리의 배터리가 소모됨을 알면 우리가 어디에 있는지에 따라 정말 좌절하고 때로는 무서운 그리고 우리가 지금하고있는 일 요즘 우리는 내비게이션 기기에서 친구와 가족, 사진 찍기, 심지어 번역하기 우리가 외국에서 여행 할 때 우리 그러나 당신이 만든이 멋진 기능과 놀라운 응용 프로그램 배터리가 완전히 소모 된 경우 사용자를 도울 수 없습니다 그래서 그 이유는 오늘 우리는 배터리를 어떻게 개선 할 것인지에 대해 이야기하고 있습니다

당신의 도움으로, 잘하면 그리고 이것은 우리가하려고하는 것입니다 덮개 먼저, 우리는 소비하는 힘과 방법에 대해 이야기 할 것입니다 우리는 소비 전력을 측정 한 다음 우리가 여러 해 동안 도입 한 절전 기능과 앱이 이러한 제한 사항의 영향을받는 방식

다음으로, 그것을 Amith에게 넘겨서 소비하는 것에 대해 이야기 할 것입니다 힘 안녕하세요 방법을 빠르게 살펴보십시오 우리는 실제로 앱이 어떻게 전력을 소비하는지, 얼마나 많은 전력을 소비하는지 그것은 장치에서 소모됩니다

이들은 전형적인 것이다 구성 요소, 전원을 소비하는 하드웨어 구성 요소 나는 최고 소비자를 강조했다 너는 소란 스러울거야 고주파수에서 작동하는 것도 꽤 비쌉니다

셀 네트워크를 통해 데이터를 전송하는 것은 매우 비쌉니다 잘 따라서 각 장치가 제조시 OEM은 전원 프로필을 가지고 있습니다 포함 내용 우리가 원하는 다양한 서브 시스템에 의해 그려지는 평균 전류입니다 실시간으로 측정하고, 예를 들어 화면을 돌리면 켜기, 최소 밝기에서 약 100 일 수 있습니다

전체 밝기까지 크랭크 한 다음 300을 더 추가한다고 가정 해 봅시다 그래서 우리는 그것을 실시간으로 추적합니다 CPU가 다르다 전력 소비 런타임에 우리가하는 일은, 배터리 통계라고하는 하위 시스템이 있습니다

그것은 무엇을 추적합니다 각 앱이하고 있습니다 그것은 얼마나 오래 소비하는지 측정합니다 이러한 자원, 얼마나 많은 CPU 시간, 어떤 주파수에서, 어떻게 많은 데이터 패킷을 전송하고 있습니다 각각의 전력 비용을 곱하면 특정 앱의 몇 시간에 대한 대략적인 예상 우리는 사용자에게 제공되는 앱의 순위를 매기므로 설정에서 그것을 볼 수 있고 무엇이 있는지 스스로 알 수 있습니다

실제로 배터리가 소모되었습니다 그럼, 어떻게 OS에 대해 이야기 해 봅시다 사용자가 배터리 수명을 연장하는 것을 돕기 위해 노력하고 있습니다 그러나, 첫째, 광범위하게 말하면 앱이 실행, 사용자 실행, 포 그라운드에서 실행 중, 사용자가 앱을 적극적으로 사용하고 있습니다 개발자로서, 그것은 뭔가입니다

당신은 그들이하지 않기를 바라지 만, 그것은 완전히 다른 것입니다 디지털 웰빙에 대한 주제 및 도움을 받으려합니다 사용자가 앱에 소비하는 시간을 제어합니다 그러나 여기에 남기고 싶은 한 가지 유의 사항은 앱을 일시 중지하고 읽는 것이 좋습니다 사용자가 앱을 일시 중지 한 경우 앱에 미치는 영향과 그 영향 하루의 나머지 부분을 보자

그러나 우리는 백그라운드 활동을 어떻게 제한하려고하는지에 초점을 맞출 것입니다 앱 앱은 작업 또는 작업을 사용하여 백그라운드 작업을 예약 할 수 있습니다 경보 또한 외부 용 콜백에 등록 할 수 있습니다

푸시 메시지 나 지오 펜스 지나서 걷는 것과 같은 트리거 수년 동안 OS에서 몇 가지 기능을 소개했습니다 배터리를 절약하십시오 첫째, 마쉬멜로 우에서 Doze를 소개했습니다 장치를 깊은 수면에 놓습니다

당신이 그걸두고 왔다고 가정 해 봅시다 책상이나 나이트 스탠드를 사용하면 기본적으로 당신이 정말로 당신을 확장 할 수 있도록 배경 활동 배터리 수명 그러나 이것은 실제로 우리가 어떻게 우리의 일상적인 휴대폰을 사용하십시오 우리는 그걸 가지고 걷고 있습니다 그래서 우리는 Doze on The Go를 만들었습니다

그것 그것은 가볍게 잠들게한다 그것은 당신 앞에 있지 않습니다 화면을 사용하여 배경 중 일부를 종료 할 수 있습니다 작업 너는 아마도 모두 친숙 할 것이다

오레오와 함께 배경 서비스에 대한 제한 이번 달 현재, 모두가 위의 Android Oreo를 타겟팅해야합니다 그러나 우리는 새로운 것에 초점을 맞출 것입니다 P, 어댑티브 배터리, 배터리 세이버 적응 형 배터리는 소개 된 App Standby의 혁명

앱을 넣습니다 두 가지 가능한 상태, 활성 또는 비활성 적응 형 배터리 이것을 4 개의 버킷으로 확장합니다 사용법에 따라, 우리는 그것을 다음으로 옮깁니다 다른 버킷

예를 들어, Google I / O I / O 앱을 설치하면 드문 앱으로 이동해야합니다 당신이 그것을 사용하지 않았기 때문에 그렇다면 OS가 각 버킷을 각 앱에 어떻게 할당합니까? 시작하다 앱을 다른 버킷에 설치할 때 꺼야, 그렇지 않습니다 여기에 나와있는 내용은 실제로 그렇게 관련이 없습니다 일단 당신이 앱 – 또는 앱 또는 강력한 도구를 실행할 때마다 알림을 클릭하는 것과 같은 상호 작용은 앱이 앱 양동이가 잠시 머물러 있습니다

몇 시간 후에 표시 될 수 있습니다 그것은 내려와 제한을 적용하기 시작합니다 그리고 조금 후에, 가장 자주 그리고 드물게 그리고 나서 우리는 앱을 제거하십시오 장난이야 우리는 그렇게하지 않습니다

[웃음] 만약 당신이 알림, 그것은 그것이 활동적이라는 명확한 징후가 아닙니다 응용 프로그램의 사용법, 그래서 우리는 약간 제한된 상태에 넣어, 그것은 작업 집합입니다 이 사실에 실제로 적응하는 것은 무엇입니까? 디바이스가 기계 학습 알고리즘을 가지고 있다면, 그것은 당신의 사용 패턴, 시간이 지남에 배우고 결정, 좋아,이 응용 프로그램 아마 다음 몇 시간 동안 사용하게 될 것입니다 활성 집합에 넣으면 어쩌면 그것을 다시 만들 수 있습니다 데이터

일단 앱이 될 수 없다고 생각하면 잠시 동안 사용되면, 아래로 내려갈 수도 있습니다 양동이 그래서 정말이 에서 사용하는 앱의 양에 대한 귀하의 능력을 승인합니다 배경 그건 네 잘못이 아니야 너는 그렇지 않아

사용자가 너를 발사 할 때 우리가 그렇게하려고하는 것을 안다 그걸 도와주세요 제한 사항은 또 다른 기능입니다 우리는 앱이 백그라운드에서 할 수있는 일을 제한합니다 주로 만났습니다

당신은 포레스트 그라운드에서하고 싶은 앱을 위해 두 가지가있다 응용 프로그램이이 상태로 갈 수있는 방법 사용자가 다음을 볼 수 있습니다 설정에서 앱이 배터리를 소모하고 앱을 수동으로 제한하십시오 시스템이 특정 모니터링하고 있습니다

기준을 준수하고 과도한 행동을한다고 판단되면 사용자에게이 앱을 제한 하시겠습니까? 배터리가 백그라운드에서 방전되기 때문입니다 이는 우리가 개선하고 OEM이 추가 할 수있는 것들입니다 이 일반적인 일, 경보, 완전한 지상 서비스 사용자의 관점에서 보면 당신이 뭔가를 볼 수 있다면 알림 및 백그라운드에서 작업하고 있습니다

FCM, 현재 1 월은 제한 될 것입니다 그래서 너는 어떤 것도 얻지 못할거야 앱이 휴식 상태에있을 때 알림 너는 얻지 못한다 위치 업데이트 및 앱 고유 한 기능 장치가 청구하는 동안에도 제한이 있습니다 백그라운드에서 뛰자

이유는, 이것은 단지 배터리 절약에 대해, 그것은 또한 aboutabout 성가심 및 어쩌면 개인 정보 보호 문제 방법과 매우 비슷합니다 제한이 작동합니다 일부는 전경은 배터리 세이버에서 실행하는 것이 좋습니다 푸시 알림에는 제한이 없습니다

그리고 파이의 새로운 점 중 하나는 위치를 끄는 것입니다 서비스는 적어도 픽셀 장치에서 완벽하게 지원되므로 OEM은 그것을 선택하십시오 사용자 통계를 요청할 수 있습니다 현재 귀하의 현재 대기 통 네가 원한다면 디버그 무언가를, 당신은 또한 역사적인 정보를 얻을 수 있습니다 대기 양동이가 변경됩니다

당신이 있는지 확인할 수 있습니다 현재 배경 제한이 있으며 어쩌면 사용자가 그것에 대해 뭔가 제발 신경 쓰지 마세요 만약 그들은 당신이 달리는 것을 원하지 않으며, 당신이 달리는 것을 원하지 않습니다 그리고 배터리 세이버가 켜져 있는지, 내부적으로, 절전 모드라고합니다

고마워, Amith 그렇다면 앱에 어떤 영향이 있습니까? 따라서 시스템에 언제든지 앱은이 두 상태 중 하나가됩니다 그것은 다음 중 하나 일 것이다 전경 또는 배경 그리고 언제든지 앱은 전경에있는 것으로 간주되며이 모든 제한이 해제되어 필요할 때마다 실행할 수 있습니다

앱이 백그라운드에서 기기가 충전 중이 아닌 경우 Amith가 방금 말한 Battery Saver의 모든 기능 대략 그들 중 누구라도 가능하게 될 수 있습니다 이것은 당신의 직업, 경보, 네트워크 액세스 및 FCM 메시지가 제한 될 수 있습니다 다음으로, 정말 멋진 다이어그램이 있습니다 그들이 어떻게 영향을 받는지 보여줍니다 먼저 예약 된 작업을 수행하십시오

직업에 대한 모든 제약 조건이 충족되면 그렇다면, 이것이 어떻게 실행되는지에 영향을 미칠 것입니다 그 경우 작업이 유지 관리 창으로 연기됩니다 사용자 배터리 세이버 또는 앱 제한을 설정하기로 결정합니다 해당 배터리 설정에서 앱을 제한하면 사용자가 앱을 열거 나 앱이 전경 당신의 직업은 최대까지 연기 될 수 있습니다

24 시간이면 앱이 희귀 한 버킷에 속해 있습니다 그것은 최악의 경우입니다 즉, 최악의 경우, 귀하의 직업은 여전히 ​​매일 실행됩니다 마찬가지로, 알람 관리자 알람의 경우, 경보가 발동합니다 Doze에있을 때, 귀하의 알람은 다음으로 연기됩니다

유지 관리 창 사용자가 배터리 세이버를 켜거나 앱을 제한하면 알람이 앱까지 지연됩니다 전경에있다 마지막으로 앱 대기 버킷에 앱이 속한 경우 최대 2 시간까지 알람이 지연 될 수 있습니다 그 희귀 한 양동이

유스 케이스에 필요한 경우 정확한 시간 실행, 예를 들어, 사용자는 약물이나 TV 프로그램을 복용해야합니다 구독하는 사람들이 시작될 예정이므로이 사용 사례의 경우, 이 아이돌 방법을 사용하면 알람이 제 시간에 발사됩니다 하지만 알람 관리자를 사용하여 기기를 자주 깨울 수 있습니다 그리고 모든 앱이 다른 시간에 그렇게하고 있다고 상상해보십시오 당신은 많은 배터리를 소모하고 있습니다

그래서 우리는 vitals 페이지에서 과도한 wake-up 당신이 바이탈에서 본다면 페이지, 그것은 알람 관리자에 의해 발생합니다, 나는 당신을 권하고 싶습니다 어쩌면 다른 API로 마이그레이션하는 것에 대해 생각해보십시오 푸시 알림을 보내고 있다면 아마도 이미 Firebase Cloud Messaging을 사용하고 있습니다 기기가 Doze에서 우선 순위 메시지는 유지 관리 창

이것은 높은 우선 순위 FC FCM 메시지를 받으면 알림이 사용자 배터리 절약 기능을 켜면 메시지가 계속 표시됩니다 있는 그대로 배달 될 수 있습니다 Amith가 이전에 언급했듯이, if 사용자가 [오디오 없음]을 제한했습니다 오디오]

그들은 모든 앱에 적용 할 것입니다 Android 기기에서 실행중인 항목 (대상에 상관없이) SDK를 타겟팅하고 있습니다 그래서, 우리에게 첫 번째 조언은 제발 앱을 테스트 해보세요 우리는 ABD 명령을 가지고 있습니다 모든 것을 넣을 수 있습니다

이 기능의 앱을 사용하여 푸시 알림을 확인할 수 있습니다 다가오고있다 우선 순위가 높은 FCM을 제외하고 제한, 그들 중 누구도 몰랐다 앱이 잘 작동한다면 Doze 아래에서, 당신은 바꿀 필요가 없다 이러한 기능을 사용하려면 많은 노력이 필요합니다

두 번째 조언은 다음과 같은 작업을 수행 할 때마다입니다 배경,이 게으른 첫 번째를 사용하는 것을 명심하십시오 디자인 원리 작업 축소 노력 KROUR – 당신은 백그라운드에서하고 있습니다 이 때까지 기다릴 수 있니? 내 앱이 배경에 있습니까? 실제로 실행해야하는 경우 배경, 그 일을 늦게 연기하려고 할 때, 말하자면 장치가 연결되어 있거나 정확한 알람에 대해 생각하십시오 그 정확한 시간에 일어날 필요가 있습니까? 기다릴 수 있니? 마지막으로 백그라운드에서 작업을 시도하십시오

Lollipop에서 우리는 도입 된 Job Scheduler는 귀하가 시스템은 모든 배경 작업을 지능적으로 배치하고 우리는 Jetpack에 WorkManager를 도입했습니다 배경이 더 잘 작동합니다 그것이 안정적 일 때, 그것은 배경 작업을 수행하는 데 권장되는 방법입니다 그래서, 염두에두고, 이 업그레이드 된 모습을 보면서 배경 만약 로컬에서 연기 할 수있는 작업을 실행해야합니다

WorkManager가 답입니다 이 작업이 온라인으로 실행되면, WorkManager에서 FCM 메시지를 사용합니다 FCM 메시지를 사용하여 앱에 알리고 싶다는 뜻 당신이해야 할 일이 있고 메시지 처리기에서, 당신은 그 작업 대기열 귀하의 사용자 사례가 이 사건들과 당신은 그 정확한 시간에 뭔가를 할 필요가 있습니다 그러면 알람 관리자를 사용하려고합니다

이것이 사용자가 시작한 것이라면 사용자는 그것을 알고 있습니다 일어나고 즉시 일어나야합니다 전경 서비스 하지만 제발, 당신이 이것을 사용할 때마다 포 그라운드 서비스, 알림이 추가되었으므로 수많은 알림을 보는 것에 대해 더 많은 것을 좌절시키지 않습니다 내가 할 수있는 일은 없어

그것을 추가하십시오 사용자가이 서비스를 중지 할 수있는 알림의 조치 및 알림이 닫힙니다 끝까지 도달하면 맨 위로 돌아가거나 앱이 출시 될 때까지 기다려야한다고 말하십시오 inforegrounds 오늘 우리는 나중에 이야기를합니다 오후 1:00에 WorkManager를 사용하는 법을 배우십시오

배경 작업을 수행합니다 우리는 또한 많은 우수 사례와 지침, 사용자가 배터리를 절약하는 데 도움을 줄 수있는 방법 부디 자세한 내용을 보려면 방문하십시오 그리고 우리는 사무실에있을거야 오늘 오후에 질문이 있으 십니다 고맙습니다

고맙습니다 [박수] 모든 사람, 다음 세션 이 방은 10 분 후에 시작됩니다 고맙습니다 Android Dev Summit에 오신 것을 환영합니다

오후 1시에 돌아올거야 시원한 와줘서 고마워 에 오신 것을 환영합니다 WorkManager

내 이름은 Sumir Kataria입니다 나는 라훌 라비 쿠마입니다 우리는 모두 Android에서 작동합니다 아키텍처 구성 요소, 특히 WorkManager 방해 나를 잡아 – [웃음] 괜찮아 우리는 너에게 노조의 상태를 알려줄거야

WorkManager 나는 당신에게 단축 가이드를주고 싶다 WorkManager 따라서 WorkManager를 사용하지 않은 사용자의 경우 이전에는 기본 API를 제공하고자합니다 우리가 얘기 할거야

WorkManager, 당신이 물어 본 것들 그리고 새로운 I / O 이후 변경된 사항 그럼, 국가에 대해서 이야기 해 봅시다 노조의 이후 WorkManager가 11 개 출시되었습니다 Google I / O와 이것들은 알파 버전입니다 오늘은 하나였습니다 – 11 번째였다 베타 버전이 곧 출시 될 예정입니다

어제 기조 연설을 보았을 수도 있습니다 베타의 오는 이번 달 이것은 우리에게도 뉴스였습니다 [웃음] 그래서, 우리는 당신에게 WorkManager에 대한 간략한 안내서이며 귀하를 위해 무엇입니까? 이 사람은 완전히 새로운 사람입니까? 그것은 도서관 그것은 알람 관리자와 당신의 사람들을 감싸줍니다 Job Scheduler를 사용하면 매우 익숙한 개념을 찾을 수 있습니다

그럼, 일에 대해 이야기 해 봅시다 너는 배경의 단위를 가지고있다 일하는 방법에 대해 이야기하겠습니다 너는 그것을 가지고있다 WorkManager는 어떻게이 작업을 실행합니까? 이 그래프는 너를 도울지도 모른다

프로세스가 시작되고 실행되는 동안 우리가 가진 집행자에게 먹이를주십시오 이것을 사용자 정의 할 수 있습니다 의회 그러나 프로세스가 중단 될 수 있으며 WorkManager가 일을 보장 그것은 그것을 연기 할 수 있지만, 그것을 할 때 제약 조건이 충족됩니다

API 23 이상인 경우 Job을 사용했습니다 스케줄러와 그 전에 우리는 경보 관리자를 사용했습니다 할때는 언제나 신호가 만났을 때, 2 시간의 시간 지연을 두었다고합시다 너는 네트워크가있을 때 모든 조건이 충족되면 여전히 같은 유언 집행자에게 갈 것입니다

괜찮아 빠른 API 연습을 해보 죠 그래서 WorkManager의 기본 작업 단위는 Worker입니다 이리, 계산 작업자를 정의합니다 그것은 노동자를 연장시킨다

유형 당신이해야 할 일은 일을 연장하는 것뿐입니다 이리, 나는 성공을 돌려주고있다 다시 시도하거나 실패 나는 배경에 비싼 계산을하고있다

thread를 사용하면 여기에 스레딩 걱정할 필요가 없습니다 WorkManager가 작업 여기, 나는 결과를 돌려 보낸다 성공을 동 기적으로 그 일을 어떻게 할 수 있니? 그래서, 그, 당신은 작업 요청을 inqueue해야합니다

하나는 일회성 및 하나는 정기적 인 작업 요청입니다 한 번만 사용하고 있습니다 계산으로 그것을 구축하십시오 나는 그것을 말하고있다 초기 지연

이렇게하면 WorkManager가 작업 만 실행하도록 지시합니다 2 시간 후에 inqueue의 지점을 통과했다 나는 충전 제약을 설정합니다 다음 경우에만 실행할 수 있습니다 기기가 연결되거나 충전기 인 경우 – 기기가 실제로 청구

태그에 대해 더 자세히 이야기하겠습니다 자세한 내용은 build를 호출합니다 이제 내가해야 할 일은 get- 인스턴스를 만들고 작업을하십시오 그리고 그것은 – 추적하고 싶다면 당신의 일이 어떤 상태인지, 당신은 직장 정보를 얻고 싶습니다

LiveData에 의해 그러면 작업 정보의 LiveData가 반환됩니다 그 귀하의 작업 상태이며 LiveData는 (는) 주목할 만한 한 번 LiveData 소유자에게 연결하면 당신은 작업을 inqueue, 일단 제약 조건이 충족되면, 그것은 갈거야 마지막으로 성공한 상태가 될 것입니다 일회성 작업을 할 때 추가 한 태그를 기억하십시오

요청하면 데이터로 가져올 수 있습니다 당신은 그것을 작업 요청이 있으며 하나 또는 여러 개가있을 수 있습니다 다음을 지정할 수 있습니다 여러 가지에 동일한 태그 태그 (LiveData)입니다

LiveData 다시 업무 정보 목록 그리고 다시, 나는 똑같이 할 수있다 이전 슬라이드에서 내가 한 일들 WorkManager의 가장 멋진 기능 중 하나는 체인 작업

따라서 작업 그래프를 정의하는 데 도움이됩니다 WorkManager에 A, B, C로 시작하도록 요청하고 있습니다 요청 D와 E는 A, B, C 한 번만 실행할 수 있습니다 완료되었습니다

WorkManager가 A, B, C를 실행하도록 요청하고 있습니다 병렬로 실행하십시오 그리고 마침내 나는 다시 이것을 요구합니다 FGNH 모든 진행이 끝나면 실행됩니다 하지마

전화하는 것을 잊지 마라 inqueue 반환은 작업 계속입니다 작업 계속은 그래프의 노드입니다 이것은 매우 유창한 API

호출 할 때마다 새 인스턴스가 호출됩니다 다른 연속의 마지막으로 전화를 잊지 마세요 inqueue 당신이 사슬 작업을 할 때, 부모 작업 결과물 요청은 내림차순 작업 요청에 대한 입력이되거나 어린이

이렇게하면 부모 작업에서 상태를 관리하고 보낼 수 있습니다 자손의 일에 이제 마침내 WorkManager는 취소 할 API도 제공합니다 네가 원한다면 그렇게하기 위해 ID로 작업을 취소 할 수 있으며 모든 작업 요청에는 고유 ID 여기에서 해당 ID로 작업을 취소하고 태그별로 작업을 취소 할 수도 있습니다 그래서 그것들은 두 개의 API입니다

그리고 그게 다야 그리고 나는 그것을 지적하고 싶다 모든 것 – 우리가 보여준 모든 API는 알파 용입니다 11 당신들은 당신들에게 약간의 변화를 볼 수 있습니다

전에이 API를 사용 해왔다 그러나 모든 것이 오늘 생생합니다 WorkManager를 최대한 활용하는 방법에 대해 이야기 해 봅시다 그것 내가 어떻게 특정 유형의 작업을 수행합니까? 그리고 가장 큰 것 하나의 질문에 대해 스레딩이 있습니다 어떻게 하죠? WorkManager에서 스레드 작업? 그래서, 우리는 작품에 대해 이야기했습니다

요청, Rahul 그냥 언급했다 너는 그것을 inqueue 우리는 가지고있다 내부 작업 실행자 이것은 단일 스레드 실행 프로그램입니다

그 inqueue는 그것에 간다 WorkManager를 사용하는 모든 앱 WorkManager 데이터베이스가 있습니다 이것은 진리의 근원입니다 이것은 우리가 입력, 출력, 의존성을 추적하는 곳입니다 쇠사슬

그것은 나중에 언젠가는, 당신의 제약 조건이 충족되었습니다 제약이 없으면 실행됩니다 곧 제약 조건이 있으면 OS는 당신 동일한 작업 실행자가 Worker 팩토리를 사용하여 노동자

그것은 노동자를위한 공장이며, 개인적인 당신은 그것을 커스터마이징하고 할 수 있습니다 Worker가 생성 된 후에는 Executor에서 실행합니다 이 실제로 사용자 정의 할 수있는 것입니다 더 얘기하자

그것에 대해서, 나중에, 또한 네가 원하지 않으면 어떡해? 그 집행자에게 무언가를 실행시키지? 당신이 사용한다면 어떨까요? RxJava 또는 Coroutine? 만약 당신이 당신 자신의 솔루션을 가지고 있다면 백그라운드에서 실행하는 데 사용하고 싶습니까? 이것은 요청이었다 우리가 WorkManager를 처음 출시했을 때 꽤 많이 나왔습니다 따라서 이렇게하려면 API를 제공하여 혼자서 일하며 끝나면 알려주세요 너는 싶어

완료되면 비동기를 수행하십시오 구아바 팀이 나눠 줬어 이 작업을 수행하므로 이에 대한 완전한 종속성이 필요하지 않습니다 지금은 말 그대로 하나 또는 두 개의 클래스입니다 그것은 기능이다

하나 이상의 청취자와 청취자를 가질 수있는 스펙 피드 실행 프로그램에서 envoked 될 수 있습니다 그래서 이것, 우리는 경청 가능한 노동자를 만들었다 시작 작업을 재정의해야합니다 당신은 우리에게 목록 기능을 제공합니다 너는 네가 원하는 모든 일을한다

완료되면 기능에 대한 결과를 설정하면 그것을 경청하고 그것에 반응 할 수 있어야한다 따라서 실제 스레딩 모델은 WorkManager에서 작업 실행 프로그램은 Worker 팩토리를 사용하여 청취자 우리는 그것에 시작 작업을 호출하고 우리는 청취자 그래서 우리는 당신이 끝날 때마다들을 수 있습니다 그만큼 작업자 클래스는 청취 가능한 간단한 작업자입니다 우리는 우리가 이야기했던 일 방법을해라

우리는 시작 작업을 당신 우리는 기능을 만듭니다 배경 집행자에게 작업을 실행하십시오 그리고 우리는 물론이 기능을 반환합니다 이제 Worker와 청취 가능한 Workers라는 두 가지 수업이 있습니다

근로자는보다 단순한 학급입니다 동 기적으로 실행되는 클래스 및 배경 스레드에서 들리는 실행은 달린다 불특정 배경 스레드에서 비동기 적으로 너는 당신이 여기서 끝내고있는 일을 할 것으로 예상됩니다 청취 가능한 기능을 반환 할 수 있습니다

에 대한 액세스 권한이있는 경우 구아바, 청취자에게 접근 할 수있어 그렇지 않다면 AndroidX 동시 제공의 경량 구현 풍모 많은 것들 중 하나 사람들은 노력하고 있습니다 그들은 위치를 잡으려고합니다 너 Kotlin을 들으면 멜빵 이야기, 그들은 그것에 대해 이야기했다

그 기억 작업자 클래스는 동기식입니다 콜백을 첨부하는 경우 성공을 되 돌리면, 당신의 일은 이미 완료된 것입니다 그렇지 않다 당신이 생각하는대로 일하게 될 것입니다 그래서 우리가 여기에서 제일 먼저하는 일은 리스너 Worker를 사용하는 것입니다

이것은 우리가 돌아올 기능이며 우리의 부기를 수행합니다 에서 시작 작업 방법, 우리는 우리가 있는지 확인합니다 사용 권한 그렇지 않으면 기능에 오류가 발생합니다 그렇지 않으면 우리가 할 일은 공급자의 마지막 위치 이것은 GMS 코어 또는 Google의 기능과 같습니다

유료 서비스 세계 그리고 우리는 feature로 돌아갑니다 그것이 바로 높은 수준의 시작 작업 get location 메소드에서, 우리는 그 작업을 사용하고 그것에 리스너를 추가 할 것입니다 작업이 성공하면, 우리는 성공 상태로 그것을 돌려 보낼 것입니다

그렇지 않으면 예외가 설정됩니다 우리는 우리가 성공하기를 원하는 세 가지 경우 또는 실패한 작업 또는 권한과 WorkManager가없는 경우 그 청취자를 붙일 것이고, 그것은 성공을 경청 할 것이고 업무가 실패하고 필요에 따라 회계 장부를 수행합니다 괜찮아 작업에 대해 이야기 해 봅시다 Sumir은 WorkManager가 데이터베이스를 진실의 원천으로 사용한다고 언급했습니다

당신이 inqueue 또는 일을 할 때, 우리는 부기 이것들은 데이터베이스이며 우리는 그들을 배경 스레드에서 할 수 있습니다 결과적으로 비동기 당신이 뭔가를하고 싶다면 어떻게해야합니까? inqueue가 발생했거나 취소가 발생 했습니까? 너는 확실히하고 싶어 당신은 더 많은 일을하기 전에 완료 했습니까? 우리는 새로운 API가 소개되었습니다

Inqueue 및 취소 작업이 있습니다 조작은 매우 간단한 인터페이스입니다 두 가지 방법이 있습니다 LiveData를 반환하는 get 상태 API입니다 당신이 관찰자, 당신은 진행중인 상태에서 전환 할 것입니다

성공 또는 실패로 다른 하나는 기능을 반환합니다 유형 이 API는 터미널 상태 만 반환한다는 것을 기억하십시오 작업의 청취자를 붙이면 성공 또는 실패를 얻었고 예외가 무엇인지 알려주고 있습니다

왜 실패가 일어 났습니까? 또 다른 질문은 사람들은, 언제 일이 멈췄는지, 당신이 WorkManager를 대신하여 작업을 중단 하시겠습니까? 그래서, 세 가지가 있습니다 작업이 중단 된 경우 첫 번째는 매우 간단합니다 제약 조건이 더 이상 충족되지 않습니다 너는 내가 할 수있는 네트워크를 깔끔하게했다

이 업로드 작업이지만 네트워크가 손실되었습니다 두 번째 경우 그게 OS 야? 당신의 일을 선점했습니다 세 번째 이유는 직장을 취소했기 때문입니다 앱의 다른 곳에서 우리는 어떻게 일을 멈 춥니 까? 거기에 메서드 리스너 Worker on-stopped 이것을 무시 너는 정지 신호를 받는다

우리는 그 기능을 취소합니다 나만의 청취자를 추가하고 찾을 수 있습니다 그래서, 이것은 당신입니다 -이 두 가지 중 하나가 당신을 위해 일어 났을 때, 이것은 훌륭한 시민이되고 깨끗한 당신의 신호입니다 이것이 호출 된 후 프로세스는 OS에 의해 종료 될 수 있습니다 따라서 OS가이 작업을 실행하기 위해 앱의 프로세스를 깨우면, 작업이 필요하다고 결정할 때 실제로 그것을 죽일 수 있습니다

멈추고이 신호 다음에 뭔가를 돌려 주면, 성공을 되 돌렸을 때, 우리는 그것을 무시했습니다 우리는 당신의 일이 중단되었다고 우려하고 있습니다 당신은 또한 노동자의 파업으로부터 당겨서 전화 할 수 있습니다 isstopped 메서드입니다 그게 당신이 멈추라는 신호

그럼 어떻게하면 될 수 있는지 살펴 보겠습니다 좋은 시민과 청소 우리가 파일을 파싱한다고 가정 해 봅시다 비동기 적으로 작업자에서 작업하고 있습니다 너는 이것을 가지고있다

입력 스트림을 사용하여 파일을 읽습니다 출발 작업에서, 당신은 말한다 구문 분석 파일 이것은 비동기 적으로 무언가를하고 있습니다 기능으로 돌아 가기

여기 파스 파일이 있습니다 유언 집행자가있어, Coroutine, 당신은 비동기 적으로 그렇게하고 있습니다 파일을 여는 중이며 각 바이트를 읽는 중입니다 파일, 그 바이트로 뭔가를하고 당신이 끝나면, 당신은 당신이 끝났고 필요한 것을 가지고 있기 때문에 성공을 설정하십시오 마침내 그 후 tricatch 그래서 당신은 자신을 청소할 수 있습니다

그렇다면 작업이 중단되는 시점을 어떻게 처리할까요? 실행 중입니까? 우리가하고있는 일을 끝내고 싶다고하자 해당 입력 파일 스트림을 쉽게 닫을 수 있습니다 괜찮아 그래서, 무엇 지금 일어난거야? 너 그렇게 해 코드로 돌아 가자

글쎄, 만약 당신이 그 루프의 중간에 있고 당신은 파일을 만들면 예외가 발생합니다 다음에 읽으려고 할 때 다행히도 이미 예외를 처리하고 있습니다 그곳에 여기 잊어 버린 또 하나의 사건이 있습니다 파일을 열기 전에 온 스톱이 발생하면 어떻게 될까요? 그 신호가 없기 때문에 당신은 그것을 찾고 있지 않습니다

그 파일이 당신 앞에 열렸 기 때문에 그 파일을 읽을 겁니다 그것을 닫으려고했다 너는이 모든 일을하고 어떻게 고칠 수 있을까? 그 is-stop 방법을 사용합니다 이것은 좋은 방법의 예입니다 당신은 당신이 멈추어야하는 OS의 신호를 존중할 것입니다

좋은 시민이 되십시오 그래서 당신이 메서드 또는 작업 요청을 inqueue 할 때마다 여러 장면 전환 일회성 작품의 삶을 살펴 봅시다 의뢰 다른 요청으로 차단 된 경우 차단할 수 있습니다

또는 inqueued 일단 충족되면 실행됩니다 한 번 – 반환하는 결과에 따라 다음 중 하나를 수행합니다 터미널 상태 노동자가 성공을 돌려 준다면 성공한 상태로 해지 할 것입니다

그 경우 실패를 표시하면 실패로 표시합니다 어느 곳에서나 작업자가 종결되지 않은 상태에있는 동안, 실제로 다시 시도하면 백 오프 정책이 적용됩니다 다시 시도하십시오 그래서 노동자는 앙숙한 상태로 돌아갈 것입니다 종료하지 않은 상태에서 취소로 전화하면 취소로 끝납니다

이제 정기적 인 작업을 살펴 ​​보겠습니다 거의 동일합니다 체인으로 연결할 수 있기 때문에 차단 상태 그것은 모두 inqueue 상태로 끝납니다 그래서, 당신이 성공하건 재 시도하든, 그것은 다시 inqueued 상태

이것은 혼란 스러울 수 있습니다 성공하면 수행 우리는 다음 간격을 기다릴 것이다 당신이 실패하고 재 시도를 요청한 후, 적절한 백 오프 정책을 적용 할 것입니다 우리는 당신이 달리기를 시도하는 두 번째 시간이라고 말할 것입니다

그 마지막 기간 동안 그리고, 자신의 작품을 실패하면 실패 상태로 전환합니다 그걸로 포인트, 귀하의 정기적 인 작업이 다시 실행되지 않습니다 그것이 안에있을 때 비 – 터미널 상태이고 취소하면 우리는 다음과 같이 표시 할 것입니다 취소 된

그걸 인생에 적용 해 봅시다 체인 다음은 모든 근로자의 부모입니다 그래서, 당신이 이 일의 연속을 inqueue, 모든 자손은 이제 차단됩니다 제약 조건이 충족되고 간다

실행 상태로 완료되면, 성공했다고 가정 해 봅시다 그래서 지금 B와 C의 잠금을 해제하고 그들은 달리고 인수의 목적으로 B가 성공하고 C가 성공했다고 가정합시다 실패합니다 B가 잠금 해제되어 D가 대기 상태가됩니다

주의 E, F, G에 어떤 일이 일어나면 모두 실패했습니다 단위 취소되면 모든 자손도 표시됩니다 취소 된 그래서 저는 이야기 할 것입니다 독특한 작업을 시작하고 여기서 약간의 질문부터 시작하겠습니다

무엇이 이 코드에 문제가 있습니까? 애플리케이션 객체가 있습니다 생성시 여기의 문제 – 그리고 나는 이것을 몇 가지 버그에서 보아왔다 -이 inqueues 정기적 인 작업 때마다 귀하의 앱 프로세스가 시작됩니다 그게 아마 너가 하는게 아니야

할 것 여기에 동기화를 설정하려고합니다 이걸 전화하면 앱이 시작될 때마다 코드를 추가합니다 코드를 동기화하는 것, 실제로는 그들 독창적 인 작업을 통해 데이터베이스에 동일한 키를 삽입 할 수 있습니다

다시, 당신이 뭘하려고하는지 무시하고 무시하고 싶니? 해야 할 것? 그것은 독창적 인 일이하는 일입니다 WorkManager의 충돌 정책입니다 다음은 구문입니다 고유 한 이름이 바로 그 열쇠입니다 독특한 것 그 사슬을 식별합니다

정책은 기존 작업입니다 정책 또는 분쟁 정책을 준수해야합니다 요청 그래서 기존의 노동 정책, 세 명이야 첫 번째는 유지입니다

당신이 가지고 있다면 차단 된 것, 실행중인 것 또는 inqueuedinqueued 된 것, 그들 작업이 완료되거나 전송되지 않으면 inqueue됩니다 당신이 보낸 것 다음은 교체입니다 항상 데이터베이스의 작업 요청을 대체합니다

만약 당신의 작업은 실행 중입니다 분 일찍 그것은 오래된 일을 취소하고 멈춘다 에이 보류는 특별한 것입니다 그것은 그 사슬에 추가됩니다

이것은 뭔가를하려고 할 때 유용합니다 예를 들어, 당신은 messagng 앱을 만들려고 노력하고 있습니다 순서대로 메시지를 보내면 고유 한 작업 과정이있을 수 있습니다 메시지를 보내고 새 메시지를 추가하려는 경우 그것의 끝 그래서 그것은 기본적으로 당신을위한 나무를 만들고 있습니다 스미어 (Sumir)는 이전 슬라이드 중 하나를 어떻게 할 수 있는지 언급했습니다

WorkManager를 커스터마이징해라 그러면 할 수있는 모든 것들을 살펴 보자 해야 할 것 실제로 사용할 수있는 작업자 팩토리를 지정할 수 있습니다 귀하의 근로자를 사용하십시오

이것은 다음과 같은 맥락에서 유용하다 – 대거를 사용 중이고 무언가를 주입하고 싶다면, 이것은 할 수있는 좋은 장소입니다 기본값을 지정할 수 있습니다 모든 WorkerWorkers가 사용하기를 원하는 Executor 너는 할 수있다

빌드를 구별하려면 로그인을 지정하십시오 빌드를 릴리스하고 더 많은 정보를 기록하여 문제를 확인하고 작업 수와 같은 Job Scheduler 매개 변수를 수행하십시오 Job Scheduler에 우리가 원하는 ID를 보내주기를 바란다 이전에 Job Scheduler를 이미 사용하고있는 경우에 알아 두어야합니다 WorkManager를 사용자 정의하려면 다음을 수행해야합니다

기본값을 사용하지 않고이 항목을 사용자에게 추가하십시오 ifest 이제 장애를 해제 했으므로 실제로 구성의 새 인스턴스를 만듭니다 여기에서는 구성 건물을 사용하고 있습니다 그것을 덮어 씁니다

나는 그것을 초기화 할 수있다 따라서 제작시 응용 프로그램에서이 작업을 수행해야합니다 시스템 – 운영 체제가 실제로 귀하를 대신해 취업 알선을 부탁드립니다 WorkManager가 있어야합니다 초기화 됨

마지막으로, 우리는 마지막으로 우리가 마무리하기 전에 모든 것에 대한 조언이 있습니다 도서관 개발자가있다 WorkManager를 사용중인 경우 라이브러리, 우리가 원하는 특별한 사용 사례가 있습니다 생각해 따라서 우리가 제공하는 일반적인 조언은 WorkManager는 하나이고 응용 프로그램은 다음과 같이 초기화합니다

Rahul이 방금 당신에게 보여 줬습니다 그곳에 기본 Worker 팩토리는 Workers를 만들고 청취 가능한 근로자 특정 종속성이 필요한 경우 주사 또는 그 종류의 다른 것, 당신은 앱과 계약 사일로 태그를 사용하여 작업하십시오 라훌 귀하의 작업에 태그를 지정하는 방법을 보여주었습니다

당신이 모든 일을 사일로에 넣으면, 접두사 또는 패키지 이름 또는 라이브러리 이름을 태그에 넣거나, 너는 너의 모든 일을 쉽게 확인할 수있다 너는하지 않는다 다른 사람들 – 다른 사람들의 일에 대해 걱정해야합니다 당신은 당신의 일을 얻고 그 일을 할 수 있습니다 마지막으로 앱이 모든 작업을 삭제할 수있는 기능을 제공합니다

이것은 일반적으로 사생활 보호를 위해 그것은 중요한 일종의 것입니다 어떤 이유로 사용자 데이터를 지워야하는 경우를 사용하십시오 따라서 도서관 개발자로서 귀하의 저작물이 너 밑에서 사라졌다 마지막으로 모든 시간을 취소 해보세요 – 죄송합니다 매우 혼란 스럽습니다

괜찮아 다음 단계 그래서, 아직하지 않은 경우 WorkManager 누가 당신을 위해 고맙습니다 우리는 알파 11에 이르기까지 세 가지 일반 카테고리의 아티팩트, 하나 및 KPX가 있습니다

테스트 지원도 포함됩니다 이들은 유용한 링크입니다 WorkManager로 작업 예약은 developerAndroidcom입니다

YouTube가 있습니다 YouTube에는 Google I / O가 있습니다 기본에 대해 이야기하는 2018 회담 일부 API는 조금 바뀌었지만, 여전히 광범위하게 좋은 점은 읽거나 듣는다 그리고, 또한 우리의 발행 이슈 트래커에서 피드백

베타가오고 있습니다 어제 아침에 들었다 우리는 다시 일해야합니다 [웃음] 고마워요 모두 방문해주십시오

웹상의 젯팩 라이브러리와 우리는 당신이 가지고있는 질문들 감사 감사 [박수 갈채] 이 방에있는 모든 사람들, 다음 세션은 1:55에 시작됩니다 고마워

[박수 갈채] 안녕, 모두들 모범 사례에 참여해 주셔서 감사합니다 테마 및 스타일 용 그리고 나는 Alan Viverette입니다 우리는 당신의 테마와 스타일을 디자인 할 것입니다

appplication 디자이너가 모의를 만드는 방식 여기에 Material Design 테마 팔레트의 최신 반복 Android 용으로 아직 사용하지 않는 경우, 플랫폼의 소재 Theming에서 기본 그것은 같은 기본 어두운 색상

그리고, 당신이 나에게서 가짜를 얻을 때 디자이너, 당신은 정신적 인 매핑을 할 수 있습니다, 이것은 내 것이 될 것입니다 어두운 색상, 이것은 내 기본 색상이 될 것입니다 그 디자이너가 이해할 수 있도록하는 것이 중요합니다 정식 atattributes

조금이라도 뒤로 밀면 도움이 될 수 있습니다 비트라고 말하고 이것을 기본 분산 또는 기본이라고합니다 색상과 우리 모두가 미리 디자인 된 테마 의미있는 이름과 의미있는 명암비를 가진 색상 전경과 배경 사이에 존재해야한다 때로는 새로운 색상을 얻지 못할 수도 있습니다 어디서든 존재하며이 이름을 찾는 것이 어려울 수 있습니다

여기 우리는 우리 주색보다 가벼운 자주색을 가지고 있습니다 분산과 대비되는 반면에 우리는 그 위에 흰색 텍스트를 표시하고 있어야합니다 우리가 올라오고 싶다면 이 이름으로, 우리는 뭔가를 찾을 수 있어야합니다 일반화하지만 자기 캡처입니다 우리가 결정하면 자주색 테마를 사용 했으므로 이제 파란색 테마가 필요합니다

색상의 이름을 지정하고 이러한 제약 조건을 다시 사용하십시오 그래서, 우리는 그것을 무엇이라고 부를 것인가? 팔레트에서, 우리는 색깔이 있습니다 온 – 프라이어는 이것이 기본 배경에 표시되는 전경색 접근성 비율을 만족시킬 것입니다 너는 읽을 수있을거야 배경에 대한 전경 텍스트 색 우리는 가지고있다

부차적인데, 만약 우리가 푸른 색에 뭔가가 있다면 그것은 화이트 밝은 색의 새 이름을 생성 할 수 있습니다 우리는 온 – 프라이어를 사용할 것입니다 그것은 전경을 결정합니다 색상 보호

배경색 보호를 위해 그것이 1 차와 대비되는지 확인하고 싶습니다 우리는 그것을 부를 수있다 기본 광선, 매우 간단하고 그것은 디자이너가 언제든지 우리에게 말할 수 있습니다 이 밝은 색의 우리 원색에 대해 이야기하면서, 그것을 기본 조명이라고 부르 자

제약 조건 디자이너가 우리가 원하는 것을 결정하면 그것은 자주색 대신 파란색으로, 우리는 같은 것을 계속 사용할 수 있습니다 제약 조건을 정의하고 의미 론적으로 디자인 된 색상을 사용하십시오 테마 마찬가지로 텍스트에 대한 공통 패턴을 제공합니다 외관

우리는 헤드 라인, 오버 라인, 시체를 가지고 있습니다 이것들은 어디에서 사용할지에 대한 이름 그것은 픽셀 크기, 무게 및 색상 오른쪽에서 우리는 그것이 무엇에 매핑되는지를 봅니다 이 경우 헤드 라인 로보트가 될거야

그러나 우리가 사용하기로 결정했다면, 말하자면, 만화는, 우리는 통과 할 필요가 없을 것입니다 우리가하기 때문에 우리의 응용 프로그램에서 어디에서나 새로운 스타일을 창조하십시오 그들이 사용되는 방법을 암시하는 이러한 이름을 사용하십시오 모의 명단에서 추출 할 때 의미있는 이름을 사용하십시오 머티리얼 디자인 속성을 익히십시오

그들은에있다 materialio 다음과 같은 경우 공통 언어로 사용하십시오 너는 mock을보고 있거나 뭔가 새로운 것을보고있다

그 안에 임의의 회색 색상이 있습니다 할 수있는 이름이 있는지 확인하십시오 용도 어두운 모드를 구현하는 경우 참석 한 경우 오늘 일찍 얘기하면,이 회색이 밝은 텍스트는 특정 텍스트와 대비가 필요하기 때문에 흰색입니다 색상 또는 배경색

의미있는 속성 이름을 사용하십시오 그들은 어느 정도자가 기록을해야합니다 어떤 것 기본 빛처럼 보이는 것보다 더 많은 제약이 있습니다 원색 이 어딘가에 문서화하십시오

스타트 디자이너와 공유하는 내부 사이트 당신은 항상 공통 언어를 사용합니다 구성 요소, 색상, 재사용 가능한 텍스트 그게 좋은거야 어떻게 이름을 지어야하는지, 그리고 그들에 관해서 이야기하는 방법에 대한 시작 장소 말하는 모의가 생기면, 이것은 16 진수 색상입니다 4836Ef, 그것을 되풀이하여 말하자면 이것은 16 진수 색상이 아닙니다

그것 의미가 있으며 우리는 원활하게 전환 할 수 있어야합니다 이 16 진수 색상은 유사한 제한 조건을 가진 16 진수 색상입니다 그래서, Nick은 이것에 대해 조금 더 이야기 할 것입니다 구현을 의미합니다 고맙습니다

권리 그래서 우리는 많이 얘기 했어 다른 의미 론적 값을 지원합니다 그것 주제 속성으로 구현할 수 있습니다 어떤 경우에 발생합니다

디자인이 바뀌고 갑자기 보라색 대신 갑자기 바뀝니다 테마, 당신은 푸른 테마가 있습니다 이러한 의미 론적 이름은 당신을 보호합니다 그리고 그것은 당신이 깨닫게 될 것보다 더 넓습니다 그래서, 이러한 종류의 테마를 지원할 수있는 영역을 원하고, 당신이 이것을 달성 할 수있는 여러 가지 방법이 있습니다

한 가지 방법은, 다른 스타일을 정의하십시오 나는 스타일과 전화를 설정하려고합니다 그 스타일 1 그리고 난 다른 모습으로 보이기를 원해 그것은 스타일 2이 접근 방식의 문제점은 많은 중복이 될 수 있고 당신을위한 2 개의 장소가 있습니다

유지 보수 또는 버그 수정 또는 리팩터링 의미 론적 포인터를 사용하여 모양이 어떨지 또는 테마 속성을 설명하십시오 이것으로부터 당신을 보호합니다 수립하는 것이 더 많은 일일 수 있습니다 이 언어를 사용하고 테마를 다시 참조하도록 스타일을 설정하십시오 속성, 그것이하는 일은 한 곳에서 끝나는 것입니다

테마 속성을 다시 참조 할 단일 스타일 지정된 테마에 대해 정의됩니다 그리고 이것의 이점은 그것은 스타일을 복제 할 것입니다 또한 모드 화를 현지화합니다 그래서 그 의미 속성을 변경해야하는 경우 해당 속성으로 이동합니다 어디서 추적 할 것인가보다 정의 된 곳

유출 된거야 또한 이점이 있습니다 생각해라 몇 번이나 열어 봤니? XML 파일에 색을 칠하고 비슷하게 보이는 50 가지 음영을 발견했습니다 당신은 모의를보고, 당신은 말합니다, 좋아요

다른 색상 자원 그것은 당신을 이것으로부터 보호합니다 당신 그것을이 작은 팔레트로 응축시키고 싶습니다 너는 멋지다 보고 느끼다

기본적으로이 접근법은 실제로, 정말 앱의 유지 보수성에 도움이됩니다 나는 가능하면 주제 속성을 선호하도록 촉구하십시오 만약 상단 줄과 같은 코드를 작성하면 텍스트 색상을 사용해야합니다 이 색상 자원은 코드 냄새라고 생각하면됩니다 이게 맞습니까? 레이아웃, 다른 곳에 나타날 가능성이 있습니까? 테마? 다른 지역에 포함될 수 있습니까? 신청? 그렇다면 하단의 양식을보아야합니까? 당신이 참조하는 물음표 구문을 보아라

이러한 테마 속성에? 그래서 우리는 의미 론적 부분의 중요성 테마를 설정할 수 있습니다 활동에 직접적으로 사용되며 구성 요소를 사용하고 있습니다 이것은 doc 테마이거나 어쩌면 야간 모드를 사용하고 있습니다 그래서, 이것은 어둠과 빛 사이에서 변화 할 주제입니다

하루 중 시간에 따라 다릅니다 네가 가진다면 어떻게 될까? 이 화면은 Google I / O 앱입니다 이들 중 대부분 목록 항목은 같지만 디자인 된 일부 항목은 어둠의 빛과 빛의 어둠 별도로 할 수 있습니다 레이아웃 또는 텍스트 색상 분리

둘 다 기본적으로 당신이 원하는 곳을 벗어난 정보를 유출하거나 더 많은 유지 보수의 폭발로 대신, 당신은 아마 할 일은보기에서 테마를 적용하는 것입니다 전체 활동 수준보다는 수준에 따라 다릅니다 속성 테마가 API 21에 추가되었습니다이 부분에서 테마를 설정할 수 있습니다

보기 또는보기 그룹을 만들고 다른 테마를 보기 hiarkry의 하위 섹션 따라서이 예에서는 당신은 가벼운 주제가 있고 어두운 버전을 적용한다고 말하십시오 그 반대의 경우도 마찬가지입니다 코드에서 동일한 작업을 수행하려면 싸개 당신은 기존의 테마를 취하고 그것에 스타일을 오버레이합니다

그것의 꼭대기 그것은 중첩된다 즉, 당신은 기존의 테마와 테마의 모든 가치를 가지고 있습니다 꼭대기에 설정하면 위에 적용될 것이므로 필요할 수 있습니다 이 사실을 조금은 의식했습니다

당신이 원하지 않는 너무 많은 값을 제공하는 테마를 오버레이합니다 내가 사용했다면 재료 성분 라이트와 doc을 함께 사용하면 너무 많이 덮어 쓸 수 있습니다 너는 싶어 덮어 쓰는 테마가 테마를 표현하는지 확인하십시오 너는 필요해

좀 더보고 싶을 수도 있습니다 테마는 테마에 맞게 오버레이하여 원하는 속성을 그것이 중첩 될 때, 당신은 결과 조합을 얻습니다 테마 컨텍스트 테마 래퍼 접근 방식은 동적 인 테마에 가깝게 보입니다 너는해야 해

컴파일 할 때 정의한 테마를 적용하십시오 당신 이것을 사용하여 색상 값을 가져오고 동적을 만들 수 없습니다 테마 이것은 미리 생각하고 있습니다 따라서 테마 속성을 설정하기 전에 그 (것)들이 어떻게 적용되는지 이해하는 것이 중요합니다

플랫폼 우리는 발생하는 회오리 바람 여행을 할 것입니다 화면 및 응용 프로그램 테마 귀하의 어떤 시점에서 응용 프로그램을 이해하는 것이 좋습니다 화면에서 무엇인가를 가리키고 레이어 방향 및 테마 속성 및 스타일 적용 대상 화면에서이 방법으로 렌더링하십시오

이 색상을 설정하려는 경우 하나의 단추, 우리는 어떻게 할 것인가? 글쎄, 이 방법은 런타임에 해결됩니다 XML 형식의 버튼이 있습니다 당신이 테마와 스타일에 대한 이야기를 해독하는 것을 보면, 이것이 어떻게 작동하는지 완벽하게 이해합니다 그렇지 않다면 그것을 지켜 보았다 여기에서 볼 수있는 버튼 스타일 테마에서 뽑아 낸 것입니다

버튼이 팽창했다 따라서 관련 버튼 스타일 속성 여기 화면 하단에 있습니다 다음으로, 버튼 스타일은 어디에 디자인되어 있습니까? 그것은 물질에있다 테마 widgetmaterial 버튼이 있습니다

우리는 어디에서 정의? 스타일 소재 이상 그래서 우리는 여기서 볼 수 있습니다, 배경은이 버튼의 기본 드로어입니다 바로 아래 그 경계에 잉크 버튼 스타일, 우리는 또 다른 스타일이 있습니다 우리 그것이 조금 더 가까워 질 것임을 깨달으십시오 버튼에 색상을 제공합니다

자, 이제 사용 된 배경은 우리가 무엇을 가져 왔는지를 테마 buttoncolorXML에서는 쉬운 체인이 있으므로 드로어 블 이름과 일치합니다 따를 수 있습니다 우리는 모양을 가지고 있으며 사각형입니다

우리의 단추가 달린 배경이되는 색조로 채색되어 있습니다 자료 이것은 모양의 흰색 색상에 적용됩니다 여기서 단색의 흰색이 나타납니다 색조를 파헤 치자

우리의 색상 악센트입니다 그것은 buttoncoloredmaterialXML이라고합니다 매우 명확한 선 우회 그렇다면이 색상 악센트는 어디에서 오는 것입니까? 그것은 우리의 응용 프로그램 테마에 존재하는 것이 무엇이든 올 것입니다 그것은 재료를 상속하고 기본 청록색이됩니다

여기에 우리가 살펴본 모든 간접적 인 수준이 있습니다 중요한 것은 우리가 스타일을 바꾸고 싶은 경우입니다 모든 버튼이 부풀어 오르면 버튼이됩니다 스타일 테마 기본적으로 가져 오는 버튼 스타일은 widget

materialbutton buttoncolored로 변경할 수 있습니다 if 우리는 어디에서나 색상 버튼을 원했습니다 우리는 또한 우리의 색상 악센트 테마로 설정하면 어디에서나 사용됩니다

우리는 어디에서나 그 색을 볼 것입니다 그러나 우리가하고 싶은 것은 하나의 버튼입니다 그래서, 어떻게 될까요? 우리가 설정하면 우리 활동에 내기 버튼? 우리는 모든 곳에서 그것을 볼 수있었습니다 뭐 XML에 대해? 어떻게 해결할 수 있을까요? 음, 뭐라구? 우리의 활동 테마에 컬러 액센트를 설정하면 이제 우리는 그 파란 단추를 얻는, 그러나 우리는 또한 파란 스위치를 얻고있다 그 밖의 모든 것 XML 파일을 검색하면 많은 곳에서 그것을 보아라

우리는 그것을 안으로 시험해 볼 수 있었다 layoutXML 테마이기 때문에 이것은 절대적으로 아무것도하지 않습니다 속성 및 당신은 레이아웃 KWM에서 그것을 설정하려고해서는 안됩니다 XML 테마 XML을 만들고 단추에 적용하면 우리가 원하는 것을 얻을 수 있습니다 그래서, 더 많은 구현을 위해 Nick에게

건배 그래서 네가 좋아해야한다고 했어 테마 속성 하지만 그러기 위해서, 당신은 필요합니다 밖에있는 것이 무엇인지, 존재하는 것을 알기 위해

솔직히, 나는 없어 그 파일을 들여다 보는 것 외에는 당신을위한 훌륭한 대답 – Android 플랫폼 또는 appcompat 또는 재료 구성 요소 그들은 그렇게 길지 않아서 볼 수 있습니다 사용할 수있는 것 당신은 주제를보고 어떤 것을 볼 수 있습니다 그들이 설정 한 테마 속성은 참조 할 수 있습니다

또는 덮어 씁니다 한 가지 주목할 점은 일부 테마 속성은 이중 정의됩니다 플랫폼 Android 색상 제어 하이라이트를 정의한 다음 appcompat 자체를 정의합니다 그래서, 어느 것을 사용합니까? 대답은 appcompat에 정의 된 것이므로, 당신을위한 플랫폼 하나와 거꾸로 사용할 수 있습니다 적합성 코드에서이를 참조 할 수 있습니다

이 같은 것을 사용하고 KTX를 사용하여 더 많이 만듭니다 편리한 그래서, 지금까지 우리는 플랫폼 테마 속성을 사용하여, 당신은 절대해야합니다 그러나 당신은 또한 자신을 만들 수 있습니다 예제를 살펴 보겠습니다

매우 유사한 레이아웃을 표시하는 두 개의 화면이 있습니다 에이 일정 및 발표자 세부 정보 목록 그들은 단지 다른 점이있다 공간의 공간과 키 라인까지의 거리 그것을에 맞추고 싶다 끈적 끈적한 방을 비워야 해

머리글 시간 이를 위해 우리는 자신의 테마 속성 이것을 세션없는 키 라인이라고합니다 에서 다른 활동 테마, 우리는 다른 제공 할 수 있습니다 해당 키 라인의 치수 값입니다 그리고 나서 RGS는 단일 레이아웃을 가져야합니다

그 참조 – 질문을 사용하는 테마 속성 그것을 유지할 필요없이 구문을 변경하기 위해 구문을 표시하십시오 세 테라 테마 지정이 오는 또 다른 장소 편리하게 drawables 있습니다 우리는 플랫폼 버튼을 보았습니다 API 21부터 모든 드로어 블 지원 색조와 색조 모드

테마를 지원하는 벡터에서도이 작업을 수행 할 수 있습니다 색조 및 채우기 및 획에 대한 속성 그래서 당신은 21에서뿐만 아니라 이전 버전과의 호환성에서도 이것을 사용할 수 있습니다 라이브러리뿐만 아니라 이전 버전과의 호환성이 필요하면 거꾸로 사용할 수 있습니다 오버라이드가 있습니다

적용 할 색조 목록을 설정합니다 우리는 매우 편리하다는 것을 배웠습니다 그것은 다른 것을 제공한다 색조 및 다른 색의 모든 색상이 포함됩니다 이것은 취해진 다

텍스트 기본에서 내가 좋아하는 색에 대해 좋아하는 것들 중 하나 이것은 마시맬로 23에 도착한 개선점들 중 일부입니다 당신이 색깔과 알파를 분리 할 수있게 해주는 구성 요소 이것은 20의 폭발로부터 당신을 보호합니다 검은 색의 다른 용량

사실 – 알파 정보로부터의 색 정보의 종류 원하는 것을보다 구체적으로 정의 할 수 있습니다 여기가 가벼운 화면이고 포 그라운드는 갈아 입으시오 텍스트가 검은 색이고 알파가 있다고 말할 수 있습니다 따라서 모든 조합을 정의 할 필요는 없습니다 의미 적으로 명명 된 것들

그런 다음 그들은 색상 상태 목록 나는 속임수로 여기고 바꿨다 appcompat 백 포트 때문에 안드로이드 알파에서 애플 알파로 색상 상태 목록이 추가되었지만 앱을 사용해야합니다 알파 색상의 알파 채널 알파가 결합됩니다

이러지 마 지정한 경우 -이 말은 50 %의 흰색 텍스트이고, 말하지 않으면 50 %의 흰색 텍스트입니다 알파 당신은 20 % 알파 화이트로 끝날 것입니다 추천하고 싶다

전체 alphas 색상으로 내가 말했듯이, appcompat는 이것을 가지고있다 리소스를 사용하여 이전 버전과 호환되는 동작을 얻습니다 따라서 전반적으로이 테마를 적용하면 상태를 얻을 수 있습니다 이런 식으로

그래서, 왼쪽에는 꽤 비슷하게 보입니다 에 왼쪽에는 Google I / O가 있습니다 그리고 그것을 다시 채우기 위해 이 컨퍼런스에서는 모양과 느낌이 I / O, 이것은 차이입니다 우리는 의미 론적 이름의 색상 그것은 바깥쪽으로 물결 치며, 아래쪽 네비게이션 변경되면 드로어 블의 색조가 변경됩니다

생각 해봐 제품 관리자가 귀하에게 와서 다음과 같이 말합니다 색깔 너보다는 오히려 이걸 가지고 있지 않니? 모든 XML을 통해 어디서 무엇입니까? 당신은 정말로 제한하기를 원합니다 이러한 의미 론적 이름의 변경

그래서, 이것에 대한 요약으로서, 정말로, 정말로, 같은, 주제 근본적으로 모든 것을 속성 짓는다 그들을 단지로 사용하십시오 보호와 같은 종류의 당신은 아마 그것을 밀어해야한다 시맨틱 시스템은 설계자에게 위로 향하게합니다 이를 통해 가치를 부여합니다

XML이 선호되는 구문이거나 그렇지 않을 때주의하십시오 이걸 쓰고 생각하면 냄새가 나니? 너와 함께 drawables, 색조를 사용하여 자신을 보호하는 방법에 대해 생각해보십시오 만약 이 모든 드로어 블은 대신 핑이었고 우리는 rebrand, 나는이 모든 것을 재생성해야만할까요? 무시 그건하지 마 대신 색조를 사용하십시오 기본적으로 PNG를 사용할 때마다 PNG

PNG를 사용해야하는 유일한 시간은 성냥 그래서 요약입니다 자신을 보호하고 재미있게 보내십시오 속성 및 스타일 건배

[박수 갈채] 안녕, 모두들 오늘 저는 최선을 다할 것입니다 AndroidX 라이브러리를 사용할 때 실습 할거다 환경 설정 및 공유 환경 설정을 고려해야합니다 그리고 나는 여러 설정 화면을 사용하는 방법에 대해 설명합니다

먼저 몇 가지 배경 무엇인가 환경 설정? 환경 설정 라이브러리는 대화식입니다 화면 당신이해야 할 일은 설정 목록을 찾는 것입니다 사용자에게 표시되며 상호 작용을 처리합니다

사용자가 변경 한 모든 값이 장치 저장소에 저장됩니다 장치에 업로드되었습니다 첫째, 프레임 워크 환경 설정 API 이것은 첫 번째 안드로이드 프레임 워크와 번들되었습니다 그것이 프레임 워크의 일부이기 때문에, 새로운 기능 및 우리가 추가 한 버그 수정은 최신 버전의 기계적 인조 인간

디자인이 변경되면 프레임 워크 API는 Android의 버전에 따라 테마가 다릅니다 우리는 더 이상 프레임 워크 API를 유지 관리하지 않으며 권장하지 않습니다 AndroidX 라이브러리를 사용합니다 그것은 V7과 V14였습니다 그것으로 업데이트되었습니다

라이브러리는 API와 하위 호환됩니다 14 업데이트 된 동일한 소재 테마를 사용합니다 그 결과 사용자와의 일관된 경험이됩니다 공유 환경 설정과의 관계는 무엇입니까? 데이터 내부적으로 값을 저장하고 검색하는 데 사용됩니다

그러나 도서관의 일부가 아닙니다 간단한 계층 구조를로드합니다 오른쪽으로 우리는 토글 링 및 텍스트 용입니다 그래서, 우리는 컨테이너 역할을하는 간단한 활동이있는 top appcompat 테마가 있습니다

이것은 다음과 같은 주요 진입 점입니다 환경 설정 라이브러리를 사용합니다 모든 흥미로운 환경 설정 구성이 여기에서 발생합니다 이 단편 자체는 단지 개인 선호도의 계층 구조를 래핑합니다 XML 자원에 정의되거나 프로그램 적으로 정의 될 수 있습니다

실행 시간 우리는 XML에 중점을 둘 것입니다 그래서 활동 자체는 단순한 컨테이너 일뿐입니다 파편 조각 상용구가 있으며 파편

조각은 다시 매우 간단합니다 필요한 모든 것 do는 이것을 덮어 쓰고 계층 구조를 설정합니다 재미있는 정의는 XML에서 발생합니다 그래서 이것은 우리의 XML 파일입니다 우리 루트 환경 설정 화면 객체로 시작하십시오

계층 구조의 주 컨테이너 참고로 또한 기본 설정 XML을 XML 지시문에 배치하십시오 이것은 기본 환경 설정과 관련된 위젯이 없습니다 여기에는 세 가지 중요한 속성이 있습니다 제목과 요약이 사용자에게 표시됩니다

열쇠가 예쁘다 중대한 이 기본 설정이 모든 주를 장치를 사용하는 경우 공유 환경 설정이 사용하는 키입니다 용도 이 키를 사용하면이 환경 설정과 상호 작용할 수 있습니다

나중에 라이프 사이클에서 이제 스위치를 추가 할 수 있습니다 선호 compat 이전과 비슷하지만 지금은 스위치 도구가 있습니다 사용자가 전환 할 때마다 여기에 정의 된 키 여기에 우리가가는 계층 구조가 있습니다

여기까지 오게 우리는 한 걸음 씩 나아갈 것입니다 나는 갈거야 복잡한 그룹과 선호도를 나눌 수있는 카테고리를 다루는 방법 보다 복잡한 구성을 허용하는 개방형 대화 상자 나는 동적 인 요약에 대해서 이야기 할 것이고 또한 커버 할 것이다

의존성 그래서, 이전에 중단 했었는데, 이것들은 우리가 이전에 가지고 있던 것과 같은 기본 설정입니다 이러한 컨트롤 중 하나가 동기화되어 일부가 정적으로 표시됩니다 응용 프로그램에 대한 정보 우리가 더 많이 덧붙일수록 이 계층 구조를 사용하면 사용자가 볼 수있는 것이 더 어려워집니다

무슨 일을하는지 논리적 인 하위 절에서이를 설정할 수 있습니다 우리 그것을 기본 설정 범주 태그로 감싸십시오 그것은 그룹 위에 강조된 제목 키를 설정하는 것이 중요합니다

이것들은 올바르게 지속 된 상태가 될 것입니다 같은 이전과 마찬가지로 동일한 속성이 약간 다르게 표시되었습니다 다음으로 편집 텍스트 환경 설정을 추가하겠습니다 이 preference는 대화 상자를 사용하여 문자열 값을 유지할 수있게합니다 사용자가이 환경 설정을 탭하면 대화 상자가 열립니다

편집 가능한 텍스트 필드가 포함되어 있습니다 하나, 이것은 우리에게 몇 가지 흥미로운 질문을줍니다 우리가 무엇을 위해 설정합니까? 요약은 여기에요? 지금은 요약이 없으므로 사용자가 현재 상태가 무엇인지 알기가 어렵습니다 사용자가 저장 한 내용을 사용자가 볼 수있게하려는 것입니다 대답은 간단한 요약 공급자를 사용하는 것입니다

이것은 추가되었습니다 최근 11 알파 버전에서 동적 요약이라고 부르는 것들의 카테고리 이 간단한 속성을 true로 설정하면 환경 설정 요약을 의미합니다 환경 설정이나 텍스트가 표시됩니다

우리에게는 사용자가 동기화 코드를 설정하고 자동으로 확인하십시오 그러나 그것 사용자가이 필드를 변경할 수 없다는 의미입니다 동기화가 활성화되지 않은 경우 여기에서 의존성을 사용하여 수정할 수 있습니다 그 본질적으로 종속성은 또 다른 환경 설정으로 상태를 제어 할 수 있습니다

이 선호의 그래서 우리는 switch prefance의 키를 설정했습니다 compat 스위치 우선 순위가 해제 될 때마다 회색으로 표시되어 더 이상 상호 작용할 수 없습니다 그것이있을 때 켜져 있으면 정상으로 돌아갑니다

또는 계층 구조가 거의 완료되었습니다 주기 동기화 사용 설정, 하지만 그게 무슨 뜻이야? 최근에 동기화 했습니까? 우리는 사용할 수 있습니다 동기화를 잃었을 때 표시 할 맞춤 동적 요약 보다 유용한 문맥을 제공합니다 동적 요약은 다음과 같은 경우에 유용합니다 사용자에게 더 많은 문맥을 제공하고 싶습니다

그래서,이 마지막으로 기기를 동기화 한 시간을 알려주고 싶습니다 또는 동적으로 표시하려는 경우 정보 버전 정보 또는 ID 주소 우리는 이것을 사용하여 외부 국가의 요약 우리가 이것을 전환합니다

때 환경 설정을 선택하면 동기화가 사용 설정되면 마지막으로 동기화 한 시간을 표시합니다 그렇지 않으면, 우리는 장애인이라고 말할 것입니다 우리가 지금해야할 모든 것 이 설정에 우선 순위가 설정됩니다 그래서 그렇게하기 위해 우리는 find-preference 그런 다음 요약을 설정합니다

이 ~에서해야합니다 만들다 요약은 제약 조건을 기반으로 업데이트됩니다 우리는 설계했습니다 나 별도로 사용하러 갈거야

별도의 화면에 계층이 있습니다 네가 좋아할 시간이 많아 별도의 화면에서 복잡한 계층을 분리합니다 너라면 이미 프레임 워크 API를 사용하고 있습니다 별도의 화면을 구성했습니다

너라면 신선한 시작, 당신은 가장 좋은 방법은 궁금해 할 수 있습니다 이것을 처리하는 것입니다 우리는 활동을 정상에 올렸습니다 계층 구조를 포함하는 조각을 내부적으로 래핑합니다 우리는 그것을 설정 화면으로 간주 할 수 있습니다 우리는 누가 설정 화면을로드하는지 알려줍니다

우리가 하나의 화면이 있습니다 우리 계층 구조가 이렇게 생겼다면? 우리 다른 화면에 대한 링크가 있습니다 그리고 메시지는 보다 구체적인 메시지 환경 설정 어떻게 보이나요? 우리 건축물과 닮았나요? 우리가 한 일은 매우 간단합니다 이전에 한 화면으로 완료되었습니다

초기 설정 화면은 계층 구조와 호환됩니다 과 동기화 스캔 화면은 계층 구조 등등 당신이 가지고있는 다른 스크린들도 마찬가지입니다 우리 모두 해야 할 일은 선호도 간의 최종 연결입니다 그래서 언제든지 사용자가 화면을로드 할 수 있습니다 그리고 그들은 환경 설정을 탭합니다

아래에서 화면을 바꿀거야 환경 설정을 사용하기 때문에 초기 설정 우리가 이전에했던 것처럼 계층 구조가 될 것입니다 우리는 두 가지가있다 환경 설정, 동기화 용 및 메시지 용 여기에 아이콘을 추가하여 사용자

이 작업은 드로어 블을 아이콘 속성 그래서 이것은 drawable과 같은 것이 될 것입니다 연설자 이렇게하기 위해서 우리는 조각 속성을 사용합니다 조각의 클래스 이름을 설정하십시오

조각이 클래스에 중첩되어 있으면 조각을 사용해야합니다 달러 기호는 계층 구조에 대한 것입니다 활동은 이전과 비슷합니다 우리는 구현해야한다 이 취향

이 메소드는 사용자가 환경 설정을 선택하고 아무 것도 사용자 정의 할 수 있습니다 이있다 기본 구현 그리고 파편들은 이전과 정확히 같아야합니다 다시 말하지만, 우리는 oncreate를 덮어 씁니다 환경 설정 및 그게 정말 지금이야

그들이 메시지가 표시되면 조각이 자동으로 사용자 그래서, 몇 가지를 포장하기 위해, 우리는 11 알파 1을 공개했습니다 아직 얻지 못했다면, 받으십시오 issuetracker

Googlecom에 버그를 신고하십시오 우리는 Android 설정 가이드를 업데이트했습니다 그것을 확인해주세요 내가 이야기 한 것들 중 일부에 대한 추가 정보 이 대화와 우리는 템플릿과 공개 샘플 작업을하고 있습니다

곧이 라이브러리를 시연 해 보겠습니다 Android Jetpack에 대한 자세한 내용은 다음을 참조하십시오 개발자 / 개발자 청취 해 주셔서 감사합니다 [박수] 모두들, 다음 세션 10 분 만에 시작됩니다

고맙습니다 제 이름은 카메론 케체입니다 나는 그 재료에 대해 연구한다 디자인 팀과 저는 뉴욕시에서 일합니다 저는 Gautham Sajith이고 샌프란시스코에 있습니다

우리는 Material Design 구성 요소에 대해 이야기 할 것입니다 그래서, 빨리, 우리가 토론 할 내용, 간단한 역사 머티리얼 디자인, 머티리얼 테마 닝, 머티리얼 사용 디자인 구성 요소, 색상 유형 및 모양 하위 시스템 및 이 하위 시스템을 적용하는 방법 및 릴리스 프로세스 그리고 공헌에 조금 빨리, 그냥 간략한 역사, 2014 년에 Material Design이 발표되었고 거기에서 머티리얼 디자인 라이브러리가 아니 었습니다 1 년 후 I / O에서, Google은 지원 라이브러리를 발표했습니다 다음을 포함한 특정 구성 요소 코드에 대한 많은 코드 네비게이션 서랍,하지만 아직 그 정도는 아니었다

올해는 Material Theming을 발표했습니다 그 뒤에 엔지니어링 팀이 있으므로 우리는 Material Design spec을 기반으로 한 많은 구성 요소 Material Theming, 원래 문제는 무엇인가? 소재 디자인? 글쎄, 그것은 훌륭한 초기 버전의 디자인 시스템 그것은 브랜드의 표현으로 부족했다 그래서, 여기 전자 메일 앱의 예가 있는데 머티리얼 디자인을 사용하는 다른 모든 앱과 마찬가지로 내 의견으로는 이메일 앱이라고해도 과언이 아닙니다

여기에 예제가있다 당신이 할 수있는 일들의 종류 앱이 눈에 띄고 자세한 내용을 살펴 보겠습니다 약간의 이렇게, 빨리, 어떻게 theming 작업? 기본적으로 테마는 우리가 설계 한 시스템입니다 앱의 독특한 디자인을 만드는 데 도움을줍니다

너는 ~해야 해 글꼴, 색상, 모양 등을 결정할 때 이것은 재료입니다 사용할 수있는 디자인 스케치 플러그인을 만들면 도움이됩니다 디자인 아이디어 자세한 정보는 material

io를보십시오 그 도구에 이들은 물질적 인 주제이며 그들은 모두 다른 모습으로 보입니다 그리고 이보다 더 많은 것들이 있습니다 materialio에

멋지다 이제 이야기하자 자재 구성 요소 라이브러리를 사용하여 시작하는 방법 그래서이 시나리오를 상상해보십시오 팀원이 재 설계를 요청했습니다

그래서, 당신은 지원 라이브러리 디자인 패키지, V 28에 익숙한 버전을 사용할 수 있습니다 그러나 이것은 더 이상 존재하지 않습니다 업데이트되어 AndroidX를 사용해야합니다 주목할 사실 중 하나는, 당신은 comAndroid를 사용할 수 없습니다

이상으로 전환하려는 경우 AndroidX, 사이트에 멋진 리팩터링 도구가 있습니다 그러면 앱을 리팩터링하는 데 도움이됩니다 다음으로해야 할 일은 우리의 자료를 사용하는 것입니다 주제에 해당하는 Appcompat 테마 사용할 수있는 기본 스타일로 도움이됩니다

모든 구성 요소에 걸쳐 사용하는 경우 appcompatlite, 우리의 모든 속성과 구성 요소가 있어야합니다 스타일 이러한 구성 요소없이 정의하면 런타임에 오류가 발생합니다 그들이 존재하지 않는다면, 런타임에 충돌이 발생합니다

우리 테마를 사용하면 속성 넘어서 전환 할 준비가되지 않았다면 우리의 전체 주제, 당신은 속성을 원한다면, 당신은 다리 테마 및이 다리 테마가하는 것이 당신에게 제공하는 것입니다 모든 속성은 당신에게 어떤 것도주지 않습니다 기본 스타일을 사용하여 구성 요소를 하나씩 사용하도록 선택할 수 있습니다 하나 당신이 브릿지 테마를 선택하고 옵트 인하려는 경우, 테마를 선택하면 모든 하위 앱 표시 줄에 컴포넌트 스타일

이제 우리는 단지 몇 가지 새로운 구성 요소에 대해 조금 이야기하십시오 소재 포함 Theming, 우리는 바닥 애플 리케이션과 같은 몇 가지 새로운 것들을 도입했습니다 바 하단의 앱 표시 줄에는 탐색 및 키가 표시됩니다 모바일 화면 하단의 작업으로 한 손으로, 엄지 손가락으로 장치

모션을 조정하기 위해 코디네이터 레이아웃을 사용합니다 하단 앱 표시 줄과 플로팅 액션 버튼 사이 그래서 여기, 우리는 아래쪽 맵 바를위한 간단한 XML을 가지고 있습니다 에이 몇 가지 할 수있는 일은 수직 오프셋을 설정하고 팹 사이의 거리 인 팹 크래들 마진 하단 앱 표시 줄과 둥근 모서리 반경은 다음과 같습니다 바닥이 팹과 만나는 코너 당신은 하단 응용 프로그램 바 스크롤을 숨기고이 정렬 모드를 설정합니다

그것 당신을 위해 fab을 움직일 것입니다 그리고가는 경우에 유용합니다 서로 다른 화면 사이 이미 사용중인 경우 툴바를 사용하면 맨 아래의 앱 표시 줄을 사용하여 쉽게 시작할 수 있습니다 지원 작업 표시 줄을 설정하는 경우 하단의 앱 표시 줄 대신 다른 모든 기능은 동일하게 작동합니다

방법 메뉴에서 직접 클릭하는 리스너를 하단 앱 바 우리는 또한 무엇이 개편 되었는가? 버전을 사용하여 스타일을 훨씬 간단하게 만들 수 있습니다 그래서 만약 XML에이 머티리얼 버튼 컴포넌트를 넣으면됩니다 스타일이 지정된 버튼을 얻을 수 있습니다

전체 테마를 사용하는 경우 버튼 태그를 사용할 수 있습니다 귀하의 XML에서 우리는 사용자 정의보기 인플레이션을 어디에 이렇게됩니다 재료 버튼 태그에 부풀려서 비활성화 된 것을 볼 수 있습니다 상태로 전환하면 모든 상태가 이전됩니다 당신 아이콘 속성을로 설정하여이 버튼에 아이콘을 설정할 수 있습니다 물론이 아이콘 스타일과이 스타일의 선택 사항이지만 무엇을 할 것인가? 패딩을 약간 조정할 것인가? 버튼에 더 많은 균형을 이루십시오

윤곽선 단추를 설정하여가는 선 단추를 가져올 수 있습니다 당신 버튼을 놓으면 배경의 색조를 설정할 수 있습니다 배경 색조 속성 및 색상 상태 목록을 제공하십시오 너는 다른 것을 설정할 수있다 획 너비, 획 색상, 모서리와 같은 속성 반경이이 단추에있다

아이콘 만 만들 수도 있습니다 단추 아이콘을 설정하고 패딩을 0으로 설정합니다 그래서 아이콘은 버튼 중앙에 위치하며 우리는 내용을 설정합니다 이 버튼에 대한 설명 텍스트가 없으므로 ~을 설정해야합니다 기술

리플 색을 on으로 설정할 수 있습니다 버튼 여기에 보라색 잔물결을 설정하고에 적용하면 버튼을 클릭하면 색상 상태 목록 또는 16 진수 색상을 여기에서 수행 할 수 있습니다 보라색 잔물결이 녹색 버튼 위에 있습니다 그리고 이것들은 몇 가지 예입니다

우리는 몇 가지 있습니다 다양한 스타일의 칩, 텍스트 필드, 암호 표시 및 숨기기 기능 및 레이아웃도 제공합니다 괜찮아 자, 테마에 대해 조금 MDC는 Android 테마이므로 테마 주제를 빠르게 살펴 봅니다

스타일이 작동합니다 에서 직접보기에 적용된 모든 항목 XML은 단일보기 만 변경합니다 또한 스타일 따라서 스타일에 속성을 설정하면 이 부분은이 스타일을 사용하는 소수에 영향을 미칩니다 스타일을 정의하지 않거나 스타일 세트가 없다면, 그것은 갈 것입니다

다시 기본 스타일로 돌아갑니다 그래서, 여기, 당신이 방법은 전체 구성 요소 그룹의 모양, 당신은 기본값을 설정할 수 있습니다 스타일 마지막으로, 해당 속성이 정의되지 않은 경우 다른 곳에서는 테마를 살펴볼 것입니다 재료 Theming 방법 작품에는 꼭 필요한 최상위 속성 집합이 있습니다 팁 토 그래피, 색상, 모양 및 기본값을 덮어 씁니다

스타일 더 미세한 조절이 필요하다면, 후크 할 수 있습니다 in, 어떤 레이어에서든 단일보기 또는 모든 특정 구성 요소의 색상 다음은 칩 라이브러리입니다 그것은 온다

우리 도서관의 다른 스타일이 참조 할 수 있다는 사실로부터 이 같은 속성 다음은 버튼의 예입니다 그들 작은 모양 인 동일한 모양의 외관을 가진다 모양 모양 우리가 우리의 모양과 느낌을 업데이트하고 싶다면 이 작은 구성 요소에 대한 앱은 업데이트해야합니다

우리 테마의 한 곳에서 약간의 예제 이들의 영향은 무엇입니까 속성? 우리는 테마 속성을 이치에 맞을 것입니다하지만 멋지게 보일 수있는 여러 색상의 값 선택 함께 materialio를 확인해보십시오

반응하다 당신이 할 수있는 또 다른 간단한 해결책은 괴상한 가치를 설정하고 사물이 어떻게 보이는지 보는 디버그 테마 materialio 사이트의 하단지도 막대가 있습니다 컨테이너 자체가 마치 표면과 같은 것입니다

아이콘은 표면에 있습니다 그리고 우리는 당신이 수정할 수있는 속성들과 바라보아야 할 것들 다음 섹션 그래서, 서브 시스템을 테마로합니다 우리 현재 유형, 색상 및 모양이 있습니다 이것들은 당신입니다

앱을 테마로 조정해야합니다 바라기를 당신 대부분 텍스트 외관에 익숙하다 하지만 우리는 테마 Theming을 사용하여 테마 속성을 사용하여 이 원본 외관을 참조하십시오 그래서, 여기에 헤드 라인 6 속성을 사용하는 툴바 예제 스타일보다는 직접적으로 그리고 여기에 본문의 속성 이들은 다음과 같은 유형 속성입니다

우리는 당신이 이것들 중 어떤 것을 당신이 덮어 쓴다면 테마를 사용하면 앱의 스타일과 모양을 설정할 수 있습니다 색상이 또 다른데, 아마 기본 색상에 익숙 할거야 색상 및 기본 악센트 우리는 더 넓은 범위의 색상을 가지고 있습니다 당신은 더 많은 통제력을 가지고 있습니다

이들은 의미 론적 이름이다 추려낸 주제로 작동하는 색상 팔레트 우리는 가지고있다 기본, 주요한 것 그것들은 당신이해야 할 것들입니다

일반적으로 테마는 앱의 오래된 것입니다 또한 배경 표면 및 오류 색상 스타일을 지정할 수 있습니다 그러나 반드시 그렇게 할 필요는 없습니다 그리고 나서 온 – 프라이어, 온 – 중등 학교 학생들은 그릴 때 접근 가능해야합니다

다른 색상 위에 기본 (Primary)에서 그려 질 것입니다 원색 위에 텍스트 상단에 기본 배경, 기본 색상이어야합니다 이것들은 우리가 정의한 색상 속성입니다

너는 볼 수있어 새로운 것들이 많이 있다는 것을 우리는 그 중 일부를 재사용하려고했습니다 appcompat에서 우리는 Android 색상 배경을 가지고 있습니다 사용하는 것, 그것은 단지 그것의 보통의 안드로이드 판이다 속성

Shape은 당신은 테마 수 있습니다 그리고 모든 것은 물질적 인 모양으로 일어난다 drawable 그래서 우리는 재료 모양 드로어 블을 단추, 카드, 팹, 하단지도 막대 그것은 가장자리와 모서리와 함께 작동합니다

치료 우리는 가장자리와 모서리가있다 둥근 모서리와 컷 모서리에 대해 정의 된 치료법 구성 요소를 찾으십시오 당신은 언제나 당신 자신을 창조 할 수 있고, 게다가

그래서 여기 코 틀린의 예가 있습니다 코드는 둥근 모서리를 정의하고 치료를 설정하고 둥근 모서리를 적용 할 수있는 재료 모양 드로어 블 모두 다음은 XML 버전입니다 그래서, XML로 해보고 싶다면, 우리는 모양 모양을 가지고 있습니다 텍스트 모양과 유사합니다

속성은 여기에 있습니다 가족 및 모서리의 크기와 둥근 수를 설정합니다 코너 24Dd 반경 개인을 덮어 쓸 수 있습니다 모서리

왼쪽 상단을 덮어 써서자를 수 있습니다 XML에서 동일한 작업을 수행하십시오 주목할 사실 중 하나는 여기에 모양 모양 오버레이를 사용합니다 기본적으로 단, 우리는 우리가 재정의하고 싶다 재료 버튼 모양 모양이 있습니다

일부는 여기 오른쪽 상단 모서리를 자르고 있습니다 다른 모든 것은 그 스타일에서 물려 받게 될 것입니다 소재 버튼 하나의 열쇠 소재 Theming의 아이디어는 매핑을 추가하는 것입니다 이것은 도움을 줄 수 있습니다

서페이스를 연결하여 앱의 일관된 모양과 느낌 모양을 통해 소형, 중형 및 대형 구성 요소가 있으며 이것들은 당신이 당신의 테마에 설정할 수있는 속성입니다 네가 원한다면 모든 작은 구성 요소를 재검토하여 잘랐다 모퉁이, 너 그렇게 할 수있어 다음은 예제입니다

내가 말했듯이, 작은 구성 요소 스타일을 무시합니다 그래서 우리는 작은 외양, 작은 구성 요소 모양을 재정의한다 모양, 테마, 우리의 스타일 그리고 여기, 우리는 오른쪽 상단 모서리가 자르며 우리는 또한 여기에 부모가있어 다른 모든 것을 상속받습니다 다른 부분에 대한 모서리

그림자는 우리가 원하는 것입니다 언급도 기본 고도가 지원됩니다 롤리팝의 모양 API 21 이상용

하지만 우리는 다시 포팅 중입니다 오목한 모양과 볼록한 모양 모두를위한 API 15의 그림자 둥근 모서리 나 컷 모서리 같은 일반적인 경우는 물론 하단지도 표시 줄이 내부에 잘려져 있기 때문입니다 그것 네이티브 그림자를 얻지 못하기 때문에 그라디언트로 그림자를 가짜로 만듭니다 우리가 테마 지정 서브 시스템에 대해 들었으므로 어떻게 앱에 적용하세요? 이 appcompat 앱을 가지고 있습니다 이 모양과 비슷한 것을 만들어야합니다

언제 자신의 앱을 제작하면 훨씬 더 아름답게 보이고 이보다 응집력이있다 그래서, 당신이해야 할 첫 번째 일은, if 당신은 행동 바 테마를 사용하고 있습니다, 당신은 물질로 전환 할 수 있습니다 구성 요소 테마 우리가 원하는 브리지 테마를 사용하고 있습니다 하나씩 사용하도록 선택하십시오 일반적으로 우리는 당신을 추천합니다

전체 테마, 시도하기 전에 정기적 인 테마로 전환하십시오 다리 테마 자, 이것들을 설정한다고 가정 해 봅시다 테마 색 속성 당신이 알고있는 기존의 것들 중 일부는 1 차 및 2 차

초등학생이 있습니다 너 보조 색상이 앱의 어느 위치에도 나타나지 않는 색상보기 그러나 그것은 가능할 것이다 우리가하고 싶은 다음 일은 소재 버튼 재료 버튼 스타일을에서 귀하의 테마, 귀하의 모든 단추가 재료로 바뀌어야합니다 XML 태그를 변경할 때 버튼을 클릭하십시오

우리가 가득 차 있다면 테마는 자동으로 발생합니다 여기에 다른 기본 스타일이 많이 배치되어 있습니다 모두 구성 요소 이름과 스타일 예를 들어, 귀하의 주제에 소재 카드 스타일 그리고 나서 우리는 이 카드에 몇 가지 속성을 적용해야합니다

카드를 보낼 수 있습니다 높이, 스트로크 색상 및 획 폭 그런 다음 모든 기본 스타일의 기본 스타일을 변경하고 싶다고 말합니다 버튼을 사용하여 자신 만의 버튼 스타일을 정의하고 부모님이 그 버튼의 윤곽을 그리고 나서 모든 단추를 그려야합니다 개요 단추로 변경하십시오

이제 우리는 어떤 모양을 적용 할 수 있습니다 모든 버튼에 테마 지정 그래서 우리는 모양을 정의 할 것입니다 모양과 오른쪽 모서리를 자르고 왼쪽으로 설정 모서리를 둥글게하고 모서리의 크기를 설정하면됩니다 이 화살 모양의 단추

도형을 사용하여이 작업을 수행 할 수도 있습니다 외모 오버레이, 버튼의 둥근 모서리가 태만 왼쪽에 설정할 필요는 없습니다 너는 운이 좋다 당신이 바뀌고 정상적으로 적용됩니다

그리고 나서 아이콘 버튼을 갖고 싶다고 말하면 이 아이콘 버튼 스타일을 정의하십시오 패딩과 미니 폭 설정 원하는대로이 단추를 직접 단추에 적용하십시오 XML뿐만 아니라 콘텐츠 설명 및 그 공유 대신 공유 아이콘 단추가 있습니다 텍스트 단추 이상으로 전환 할 수도 있습니다

하단지도 표시 줄 그래서 이것을 위해서 당신은 테마를 선택한 다음 XML 레이아웃에서 최상위 앱 표시 줄을 제거하고 이 하단의 앱 표시 줄을 여기에 추가하십시오 플로팅 액션을 추가 할 수 있습니다 레이아웃에 플로팅 액션 버튼을 추가하여 레이아웃 앵커 속성을 앱을 가리 키도록 설정 바 이 팹은 청록색을 띠고 있습니다

왜냐하면 우리는 기본 부동 동작 버튼 스타일을 아직 설정하지 않았습니다 그래서, 일단 설정되면 색상이 사용되는 것을 볼 수 있습니다 반성 그런 다음 몇 가지 텍스트 스타일을 사용할 수 있습니다 우리 카드의 내용입니다

모든 텍스트를 표면에 색상이 있으니, 우리는 물질적 인 주제를 사용할 것입니다 오버레이는 잠시 후에 얘기하겠습니다 그것은 해당 구성 요소의 모든 내용에 대한 테마 우리는 그것 제 3 중요한 주제 오버레이이므로, 들어 보셨을 것입니다

Android 테마를 사용하면 하위 섹션의 스타일을 지정할 수 있습니다 스타일을 지정할 수 있습니다 어두운 색의 툴바 단점은 기본 스타일에서는 작동하지 않습니다 Android 테마는 설정할 수 없습니다

Material Theming 속성은 Google의 구성 요소 및 기본 스타일로 작동하므로 사용자가 직접 설정할 수 있습니다 구성 요소와 그 테마 – 구성 요소의 하위 뷰 마지막으로, 우리는 약간의 텍스트 모양 테마를 할 것입니다 그래서, 이전에 제목은 하드 코드 된 텍스트 모양이었습니다 스타일

그리고 유사하게, 텍스트 노트 몸체에 대해서도 마찬가지입니다 그리고 나서 우리는 이것에 스타일을 적용 할 수 있습니다 그래서, 예를 들어, 헤드 라인 6을 만화책으로 변경하면 지금은 이렇게 보입니다 그래서, 왜 문제를 해결해야합니까? 이러는거야? 마찬가지로, 사용의 어려움을 겪는 이유는 무엇입니까? 스타일의 최상위 속성? 일반적으로, 우리는 이것을한다 우리는 앱을 사용하여 전체 앱의 스타일을 지정할 수 있기를 원하기 때문에 이러한 최상위 속성 팀원이 말했습니다

브랜드 색상이 바뀌고 대신이 적갈색을 원합니다 우리가 가지고있는 블루스 중 상단 색상 속성을 전환합니다 귀하의 전체 앱이 다시 게재됩니다 어두운 테마 또는 가짜를 원한다면 어두운 테마를 사용하면 색상 속성을 변경하면 그것에 적절하게 응답하십시오

이제 우리는 맞춤 구성 요소 및 일부 스타일을 사용하는 방법에 대해 설명합니다 구성 요소가 사용하는 방식에 관해선 전혀 이상한 것이 없습니다 테마 모든 Android 테마를 기본으로 제공하므로 사용할 수 있습니다 귀하의 구성 요소에서도 마찬가지입니다

당신은 기본 스타일을 생성자로 전달합니다 자, 가자 그것을 통해 여기에는 테마에 대한 정의가 있고 속성 여기서는 기본 스타일을 만듭니다

속성을 설정하고 테마에 설정하여 사용자 정의보기를 갖습니다 스타일이며이 widgetmycustomview 스타일로 설정합니다 따라서 이것은 이것을 사용하는 모든 구성 요소가 mycustomview는 기본적으로이 스타일을 사용합니다 당신은 또한 스타일을 생성 할 수 있습니다

속성 그리고 당신은 이것들을 생성자 다음은보기의 예입니다 여기, 우리는 통과한다 이전에 작성한 기본 스타일

그리고 우리 이 기본 스타일을 선택할 수 있도록 여기에 전달하십시오 그 밖의 것은 설정되지 않습니다 그런 다음 특성을 높이고 전달합니다 우리가 방금 만든 스타일뿐만 아니라 생성자에 전달되고 마지막으로 폴백 (fall-back) 스타일 속성을 찾고 그것을 읽으려는 시도 기본적으로 우리 구성 요소가 어떻게 작동하는지

그래서, 당신은 그것을 확실히 할 수 있습니다 너 자신도 또한 시스템을 사용 사례 당신이 더 많은 것을 필요로한다면 어떤 경우에는 속성을 추가 할 수 있습니다 네가해야 할 일이 있기 때문에 너의 일에 조금 더 많은 도움이 될지도 모른다

이후 사용중인 모든 구성 요소의 스타일을 업데이트하려면 우리의 구성 요소가 그들을 참조하지 않을 것입니다 하지만 네가 만약 당신이 확실히 그것을 할 수 있다면 필요합니다 여기에 예제가 있습니다 마치 속성과 같습니다 그것을 창조하고 정의하십시오 그것은 당신의 주제에서 그것을 스타일이나 다른 곳에서 참조하십시오

자, 우리 과정에 대해 조금 우리는 몇 가지 출시 10이 나갔다 – 7 월 20 일에 끊어졌다 조금만있다

하지만 이제 안드로이드 제트 팩 다시 리팩토링이 끝나면 더 자주 출시 할 수 있으므로 우리의 출시를 강화하기 위해 우리는 11 알파 1 10 월 잘라 내기 우리는 더 자주이 일을하려고합니다 있었다 테마 테마, 색상 테마 및 어두운 테마, 많은 버그 추가 수정 및 성능 향상 곧 출시 될 버전에서는 모양 테마가있을 것입니다 1

1 알파, 모양 테마 서브 시스템이 존재하지만, 구성 요소는 실제로 테마에 응답합니다 속성이 아직 없습니다 그러나 다음 릴리스에서는 반드시 있어야합니다 우리는 대화, 하단 시트, 메뉴, 그런 종류의 것들이 모두오고 있습니다 GitHub은 기여하고 제기하는 문제와 관련이 있습니다

GitHub을 실행하면 모든 코드를 살펴볼 수 있습니다 열려있어 출처 또한 체크 – 당신은 GitHub을 확인할 수 있습니다 버그 리포트를 제출하는 방법에 대한 지침

우리는 벌레를 잡을거야 신고 일에 신고 해 Google 그러나, 우리는 그것을 더 모호하게 만드는 다른 방법을 찾고 있습니다 우리가 작업 중이며 더 많은 것을 커뮤니티

여기 몇 가지 리소스가 있습니다 Materialio 사이트는 특히 Android 섹션에서 훌륭합니다 Discord에 관심이 있으시면 분명히 확인해주십시오 우리와 채팅하거나 우리가 아이디어

와서 우리와 채팅하십시오 에 대한 태그가 있습니다 스택 오버플로, 구현에 대한 질문이있는 경우, 너는 거기에 무엇인가 물어볼 수있다 우리는 그것을 지켜보고있다 응창 성가

그리고 몇 개의 코드 랩이 있습니다 링크를 찾을 수 있습니다 이 GitHub 페이지의 해당 코드 테이블로 이동하십시오 그리고, 그것은 꽤 많이 있습니다 와줘서 고마워

가고 있었다 휴식 시간에 질문과 답변을 얻을 수 있도록 지금 일어나고있어 고맙습니다 [박수 갈채] [박수] 안녕하세요 내 이름은 이안이야 호수

저는 Android 팀의 개발자입니다 그리고 나는 일한다 꽤 많은 프로젝트들, 그러나 가장 주목할만한 것은 네비게이션 아키텍처 구성 요소, 조각 및 AndroidX 유물 및 로더 그리고 오늘, 너와 이야기하고 싶다 왜, 언제 그리고 어떻게하나요? 정말로 시도해보십시오

Android treme 및 실제로 무슨 일이 벌어지고 있는지에 대한 아키텍처 구성 요소 팀 이 세상 뒤로 많은 질문이있었습니다 2014, 16 그리고 심지어 여기 2018 년에, 우리는 오늘 여기에 있습니다 무엇을하는 멋진 것들을 모두 이야기하십시오 활동

활동은 정말로 구성 요소 개미, 콘텐츠 제공 업체의 동일한 수준에서 방송 수신하고 그들은 귀하의 애플 리케이션의 UI에 직면 조각입니다 따라서 Android 프레임 워크가 애플리케이션을 시작할 때 실행 아이콘이나 앱 바로 가기 또는 Google에서 볼 수있는 항목 당신은 멀티 윈도우를하고 있고, 그것들은 모든 활동입니다, 맞습니까? 그래서 그것들은 앱에 진입하는 지점입니다 사용자가 이동할 때 앱을 시작하면 활동을 시작합니다 그리고 다이앤 해크 보른 (Diane Hackborn)으로부터 매우 흥미있는 견적을 받았습니다 2016 년에이 진입 점에 도달하면 내부 흐름을 어떻게 구성하는지 신경 쓰지 마라

이것은 2016 년과 나는 그것이 2016 년에 논란의 여지가 있었다고 생각한다 그것은 77 Google+에 대한 댓글 [웃음] 많은 사람들이이 게시물에 열광했습니다 음, 그게 무슨 뜻 이죠? 글쎄, 그것이 의미하는 바는 프레임 워크는 신경 쓰지 않아야합니다 프레임 워크는주의해서는 안됩니다

귀하의 응용 프로그램의 아키텍처에 대해 그것은 필요하다 안드로이드 프레임 워크가 시작하기위한 후크를 제공하십시오 신청 그러나 당신은 아마 앱의 아키텍처 및 그 이유는 오늘 모두 여기 있습니다

너를 여기서 사랑해 그래서, 가장 큰 문제는 당신은 실제로 어떤 활동이 실제로 할 것인지를 모릅니다 그렇다면 활동의 기본 애니메이션은 무엇입니까? 그것은에 따라 달라집니다 Android 버전, 제조사 및 제조사 사용자가 선택한 테마 권리 그래서 마찬가지로, 우리는 API 11에 추가 된 속성 애니메이션은 애니메이션보기

그리고이 새로운 Android의 새 버전에서 가능해질 수 있습니다 항상 모든 것에 적용되고 활동과 같은 것들에 적용됩니다 오늘날에도 속성 애니메이션을 지원하지 않습니다 그리고 우리가 그들을 추가 할지라도, 다음 버전의 안드로이드에서, P 이후의 편지 일 수도 있습니다 우리는 백 포트를 할 수 없습니다

그것들은 프레임 워크의 일부이기 때문입니다 이 모든 것들을 생각하면, 좋아, 좋아 활동을 사용해야 하는가? 우리는 왜 활동을합니까? 이 엔트리 포인트로서 유용합니다 앱이해야 할 일의 영역과 그렇지 않은 영역 반드시 필요한 활동 인 활동에 의존해야합니다 당신은 함께 일해야합니다

자, 예를 들어 봅시다 우리는 시작 활동을 호출하고 우리는 activitycompat를 사용해야합니다 왜냐하면 우리는 공유 된 요소 전환을 원하기 때문입니다 우리는, 오, 우리는이 하나의 요소를 공유하기를 원합니다 API가 작동하는 것은 무엇입니까? 에? 그것은 당신이 의미하는 바에 따라 다릅니다

그것은 그게 사실이야 그것은 단지 몫을 할 것입니다 최신 버전으로 전환, 21 세 이상 그것은 기술적으로 작동합니다 일부 API 검사를 저장하고 있습니다

하지만 실제로, 이것은 보는 가장 예쁜 코드 숨겨진 잡화가 있습니까? 만약 이전 버전의 Android에서 테스트했는지, 실제로는 같은 경험을하게 될까요? 이 예제에서, 나는 실제로 이것에 부딪 쳤고, 나는 오, 물건이 퇴색하고있는 것처럼이었다 그리고 밖으로 상태 표시 줄과 같은 항목을 제외해야합니다 내비게이션 바, 그렇지 않으면 그들은 깜박 거릴 것입니다 그리고 나는 같았습니다, 음, 좋아요

재미 있어요 나는 그걸 몰랐을거야 한번 시도한 것이 아니라면, 나는 그것을 한꺼번에 시도했다 있다 장치의 너는 통제 할 수없는 많은 잡았다

우리가 다른 활동을하는 또 다른 예가 자체 구성 요소 두 명이 있고 데이터를 공유하려는 경우 그들 사이에는 그 범위가 없습니다 그것은에 의해 제공됩니다 서비스 몇 가지 범위 내에서 공유 범위를 원한다 구성 요소

그래서 이것은 Android는 제공하지만 실제로 원하는 것은 아닙니다 용도 실제로 원하는 것은 레이어링을 구축하는 것입니다 니가 필요해 우리는 활동 내에서 여러 개의 목적지를 가질 수 있습니다

다음 목적지별로 정보를 공유 할 수 있습니다 실제 유용한 요소로 활동 범위를 사용합니다 그래서, 예를 들어 공유 뷰 요소 인 ViewModel 두 목적지 모두가 말하는 곳 하나의 목적지가 데이터를 입력 할 수 있음 그 데이터에 대한 변화를 관찰 할 수 있습니다 너는 필요 없어

이를 위해 응용 프로그램 범위 수준에서 작업하십시오 그래서, 나는이 단어, 목적지를 언급했다 그래서, 무엇입니까? 목적지? 글쎄, 정말로, 그것은 당신의 UI의 하위 섹션 일뿐입니다 그래서, 대부분의 목적지를 위해, 그들은 인수 할 것입니다 화면의 대부분

권리 마찬가지로, 앱에서 화면에서 다음 화면으로 이동할 때, 그것은 당신의 화면의 대다수를 바꿀 것입니다 아마도 하단 탐색과 같은 글로벌 탐색 기능이 있습니다 나머지는 목적지에 모두있다 따라서 UI의 하위 섹션 인 이것을 단편이라 부른다

하지만 조각 하나 별도의 목적지를 갖는이 아이디어의 구현 앱의 각 화면 그리고 정말로,이 단편은 보기 컨트롤러 역할을합니다 아니에요 자신을 보지만 그 견해를 소유하고 변경하는 것, 정말 디스플레이에 관한 것입니다 괜찮아 그래서, 정말로, 모든 것을 소유하는 대신에 활동 이 비즈니스 로직과 그런 것들은 정말로 물리적으로 가능한 작은 크기로 공유 UI를 만들고 있습니다

모든 목적지에서 공유됩니다 우리가 생각할 때 이것은 우리가이 활동 세계에서 목적지 세계, 우리는 그 세계를 가능하다면, 왜 우리가 움직일 것입니까? 우리는 두 가지에 집중했습니다 소지품 하나는 글로벌 UI 유형이었습니다 우리가 어떻게 그 부분을 쉽게 만드시겠습니까? 모든 앱에 같은 종류의 패턴과 우리는 그것을 원하지 않는다

그것은 많은 노력을 필요로합니다 또한, 목적지들 사이에, 맞아 활동, activitycompat 것, 우리가 더 쉽게 할 수 있을까요? 우리는 네비게이션을 시작했다 아키텍처 구성 요소 및 모든 당신에게 그것을 reintroduced 입출력 아직 알파 상태이고 아직 채울 채비를 찾고 있습니다

곧바로 10으로 가져 가기 전에 모든 기능 갭을 제거하십시오 그러나 이것이 정말로 우리가 할 수있는 것은 아주 간단합니다 이와 같은 활동, 콘텐츠보기 설정, 작업 표시 줄 설정 그게 일 이니까, 그렇지? 그리고, 우리는 이것을 똑똑하게 만들고 싶습니다 그러나 우리는 여전히이 코드 슬라이드에 맞기를 원합니다

그래서, 어떤 이게 우리가 탐색 할 필요가 있다는거야 제어 장치 탐색을 통해 앱이 작동하는 방식을 알고 있습니다 그래프 우리는 하나를 얻을 수 있습니다

우리는 여기서 코 틀린을 사용하고 있습니다 findnavcontroller 우리는 nav 호스트의 ID를 부여합니다 파편 UI에서 변경 될 부분입니다

언제 까지나 목적지를 바꿀 수 있습니다 앱을 추가합니다 바 구성 이것은 위로 동작을 제어하고 목적지에서 위로 올라갈 때 일어날 필요가 있습니다 그리고 어떻게해야합니까? 우리가 그걸 끌어 들이고 있니? 우리는 멋진 라이너를 가지고 있습니다

액션 바, nav 컨트롤러 및 앱 바 제공 구성 이제 서랍을 사용하기 때문에 레이아웃은 여기에 앱 바 구성에서 단추를 쳤을 때 서랍을 열고 닫으십시오 우리는 전화 할게 Google 지원에서 위로 탐색하면 위로 탐색 할 수 있습니다 우리는 전체 액션 바 및 이제는 우리의 타이틀을 바꿉니다

목적지 변경 우린 괜찮아 우리가 네비게이션보기 그래서 사이드 네비게이션을 클릭 할 수 있습니다 선 탐색 컨트롤러가 알고 있기 때문에이 모든 작업을 수행 할 수 있습니다

우리의 응용 프로그램에서 우리의 목적지에 대해 그럼, 우리가 실제로하지 않으면 우리는 실제로 어떻게 행동을 취할 것인가? 멋진 일회용 물건을하고 있니? 우리는 nav 컨트롤러를 얻을 수 있습니다 어딘가에 조각에서 더 쉽게 할 수 있습니다 findnavcontroller와 Kotlin 확장 기능을 구축했습니다

이 어떤 조각에 의해 생성 된 모든보기 탐색 그래프는 find를 호출 할 수 있습니다 그래서, 당신은이 참조를 가지고 있습니다 그것은 기본적으로 어디서나 가능합니다 그리고 우리는 실제로 생각하기를 시도했습니다

좋아요 좋아, 글쎄, 뭔가에 대한 논쟁이 있다면, 어떻게 이걸 멋지게 만들까요? 그래서 우리는 Gradle 플러그인을 만들었습니다 우리는 방향 객체를 생성합니다이 객체는 멋지고 단순합니다

show profile 메소드는 방향 객체를 제공합니다 네비게이션 그래프에서 정의한 타입 안전 인자 너는 항해하기 위하여 다만 부른다 그래서 이것은 훨씬 쉬워졌습니다 그러나 우리는 항해와 함께 훨씬 더 멀리 갈 수 있습니다 어떤 사람도있다

전에 의도 필터를 만들었습니까? 앱의 딥 링크? 있음 누구나 그 경험을 즐겼습니까? [웃음] 큰! 한 사람이 그 경험을 즐겼습니다 이것은 Android 프레임 워크는 알고 있습니다 그것은 알고있다, 나는 의도를 분석 할 수있다 활동을 필터링하고 시작하십시오 하지만 너무나 자주 충분하지 않습니다

좀 더 멀리 가야합니다 그래서 내비게이션에서 우리가 한 일은 당신의 조각, 그래프의 대상, 깊이를 추가 할 수 있습니다 링크 그것은 단순한 하나의 라이너이고 당신은 논쟁을 바로 추가 할 수 있습니다 여기서는 쿼리 매개 변수를 파싱하여 목적지에 대한 논쟁으로 당신에게 그들 아무도 없기 때문에 인 텐트 필터를 작성하는 것을 좋아한다면 인 텐트를 생성 할 것입니다

당신을위한 필터 합병을 선언하여 당신을 위해서 그래서이 모든 겹겹이 우리를 돕습니다 더 나은 API를 빌드하십시오 하지만 테스트를 더 쉽게 할 수 있습니다

신청 권리 활동 레벨에서 테스트 중이라면, 갑자기, 그 말은, 좋아, 그럼, 어떻게 테스트하고, 시작해야합니까? 활동은 실제로 올바른 의도를 가지고 우리는 건설해야합니다 테스트 프레임 워크를 기반으로 한 추가 테스트 프레임 워크 이런 일 단일 활동 모델로 이동하는 경우 모든 것을 시험하고 싶다

테스트를 쉽게하기를 원합니다 따라서 대상 레벨에서 작업을 테스트하기위한 규칙 1 번 입니다, 대상 레벨에서 테스트하지 마십시오 정말 테스트를 통해 가장 중요한 것은, 바로 좋고 분리 된 비즈니스 로직을 추출해 내야한다 당신이 테스트 할 수있는 곳으로 격리 권리

예를 들어, ViewModel은 훌륭한 장소입니다 당신이 그것을 고립으로 테스트 할 수 있기 때문입니다 우리는 ViewModel을 가지고있다 providerprovider 팩토리에 주입하고 테스트 할 수 있습니다 귀하의 UI와 분리하십시오

하지만 그건 네가하고 싶지 않다는 뜻은 아니야 UI를 테스트 해보세요 권리 우리는 이유 때문에 에스프레소 검사를받습니다 우리는 확실히하고 싶다

우리의 애플 리케이션의 모든 부분은 잘 작동하고 testable 있습니다 그럼, 어떻게해야할까요? 마지막으로, 이번 월요일에 우리는 단편 11, 첫 번째 알파 그리고 이것으로 새로운 것이되었습니다 프래그먼트 테스트 (fragment testing)라고 불리는 이슈는 약 6 수십 년이 지났어

[웃음] 실제로 AndroidX를 테스트 할 수 있다는 것입니다 격리 된 조각 권리 활동과 분리하십시오 다른 모든 것을 frem으로 분리하고 테스트 할 수 있습니다

그 조각이 올바른 일을하는지 확인하십시오 감독자 Epress 테스트에 유용합니다 귀하의 비즈니스 롯지, 별도 너의 UI는 여전히 우리가 검증하고자하는 것이 맞다 자, 이것에 대한 멋진 부분 인, 조각 시나리오라고합니다

활동 시나리오에 포함되어 있기 때문에 AndroidX 테스트 팀과 테스트 팀이 거기 밖으로 파편을 얻는 것 그러나 이것에 관한 가장 좋은 부분은 전체 시나리오는 계측 테스트, 실제 장치 및 로보 전기에 대한 테스트 너는 하나를 얻는다 이 두 가지 모두에서 작동하는 테스트 프레임 워크 정말 흥분된다

기회와 무언가를 이제 파편으로 테스트 할 수 있습니다 그럼이게 어떻게 생겼어? 우리가 테스트하고 싶은 프로필 조각 우리는 여기 가짜 사용자 ID를 사용했고 우리는 컨테이너에 조각 그게 전부 야 이 한 줄에는 빈 활동을 생성하고 그것에 단편을 추가하여 기다렸다

그것은 재개되고 이제는 준비가되었습니다 이제 이것을 사용할 수 있습니다 파편 onfragment를 호출하고 일부 코드를 실행하려면 올바른 상태의 파편은 훌륭합니다 그렇게 할 수 있습니다

여기서 우리는 그들이 그것이 우리가 생각하는 것인가를 볼 것입니다 우리 사용자 ID가 전달되면 ARG 클래스를 사용하여 사용자가 ID를 전달한 사용자 ID와 동일한 ID입니까? 보시다시피, 당신은 할 수 있습니다 논리를 실행하십시오 여기에서 파편에 대한 모든 메서드를 실행할 수 있습니다 우리는 에스프레소 OE 테스트를 실행합니다

구독 버튼을 클릭하면 그것을 구독 텍스트로 변경합니까? 그 일을합니까? 의회? 우리는 한 줄의 시작 조각으로이 작업을 수행 할 수 있습니다 컨테이너 Java 사용자의 경우 조각 시나리오 그들은 당신들에게 그것들을 더 좋게 만듭니다 그러나 조각을 고립 상태로 테스트하지는 않습니다

왜냐하면, 파편들은 다른 파편들과 이야기합니다 나는 일한다 네비게이션, 그래서 우리가 할 수있는 테스트의 다른 비트 서로 다른 목적지 간의 링크를 테스트해라 조각? 여기 좋은 부분은, 우리가 가지고 있기 때문에, 우리는 이러한 상위 구성 요소를 사용하고 무언가가 아닌 우리가 살만한 계층을 가지고 있는가? 권리 하나의 우리가 발견 한 것들, 건물 항법이 가장 많은 것들 일단 회사가 특정 시점에 도착하면 그들은 비슷한 상태가됩니다

테스트를 추가해야합니다 그들은 조롱하기 위해 네비게이터를 추가했습니다 시작 활동 호출 그 레이어는 당신을 위해 처리됩니다 뭐 우리가 할 수있는 일은 우리의 활동에서 조롱하는 것입니다

컨트롤러를 확인하고 네가 권리를 부르고 있는지 확인하십시오 호출을 탐색합니다 여기에 우리의 프로필이 있습니다 다시 조각화하면 사용자 ID와 원하는 것을 얻게됩니다 테스트는 가입자보기 버튼입니다

이것을 클릭하면 단편에서 뭔가 복잡한 일을한다 어떻게 가야하지? 이걸 시험해 보는거야? 그것은 navigate를 호출하고 있습니다 우리는 어떻게 확신 할 수 있는가? 이것은 실제로 우리가 원하는 것을하고 있습니다 글쎄요 꽤 쉽습니다

우리는 시나리오를 똑같이 할 수 있습니다 조각을 시작하십시오 이제 우리는 nav 컨트롤러를 조롱 할 수 있습니다 이제는 onfragment를 호출하고 우리가 여기서하는 일은 실제로 그냥 우리 자신의 nav 컨트롤러를 만드는 것입니다 마찬가지로, 여기서 호스트를 탐색하십시오

하지만 우리는 단지 하나만 주입 할 수 있습니다 이것은 nav 호스트 단편이 커버 아래에서 수행 중입니다 그것은 set nav를 호출하고있다 컨트롤러보기 우리가 한 일은 이것에서 온 것입니다

조각 포인트, 그것은 탐색 컨트롤러가 있습니다 모든 일반적으로 주사해야하는 nav 컨트롤러 호출 뭔가, 지금은 그냥 작동합니다 그들은 거기에있다 그리고 이제 우리는 Espresso 테스트를 실행하고 구독자보기를 클릭하면됩니다 단추

우리는 또한 우리의 테스트에서 그것들을 사용할 수 있습니다 그리고 그들은 equals를 구현하면 간단한 검증 만하면됩니다 우리가 생각하는 곳으로 실제로 이동 했습니까? 네비게이션? 거기에 많은 매개 변수가 있더라도 이제 확인 만하면됩니다 그러면 테스트가 훨씬 쉬워집니다 각 목적지 간의 상호 연결 그래서, nav 컨트롤러의 특별한 것

다른 많은 것들 패턴의 서비스 로케이터 종류가 아닙니다 우리가 주사해야 해 그 의존성은 이것들 중 하나입니다 몇 년 늦었 어 그러나 우리는 마침내 그것

그래서 Android P에 수업이 있습니다 앱 구성 요소라는 요소를 사용하면 의존성 주입을 통한 활동 너는 기회를 얻는다 그것을 호출하는 시스템 대신 생성자를 호출자 같은 여기 파편이있는 것

이제 당신은 conSTRUTH를 할 수 있습니다 구조체를 파편으로 만든다 프래그먼트 팩토리를 사용할 수 있습니다 그래서, 이것은 정말로 유용합니다 또한, 여러분의 조각이 당신의 활동을 무언가에 던져주는 것과 같았습니다

나는 우리가 알고있다 아마 아직도 이것을하는 템플릿을 가지고있을 것입니다 우리가 바로 잡을거야 그리고, 실제로 모든 곳에 주사하고 싶은 많은 방법이 있습니다 외부 의존성 때문에 우리는 독립적으로 테스트 할 수 있습니다

fragment는 우리의 fragment 시나리오와 잘 작동합니다 우리는 ViewModel을 테스트하는 방법을 알고 있습니다 그것은 단지 대상 일뿐입니다 subscribe라는 실제 메소드가 있습니다 정말로, 우리는 우리 조각을 시험해보십시오

그리고 우리 단편에는 수신 거부가 있습니다 파편이고 그것의 일을한다 이 ViewModel을 어떻게 얻습니까? 글쎄, 우리는 공장 자체를 주입 할 수 있고 ViewModel 공장 여기서 우리는 by ViewModels 속성을 사용합니다 모든 ViewModel 제공자에게 당신

그러나 이제 우리는 우리는 무언가를 주입했으나 여전히 시험 할 필요가 있습니다 좋아, 좋아, 실제로 전화 했어? 구독 하시겠습니까? 그래서 우리는 네비게이션을 만들 수 있습니다 활동 이것이 실제 생활에서 보이는 모습입니다 권리

ViewModel 팩토리를 주입하고 코드가 어렵고 슬라이드, 헬퍼 클래스 호출 이니셜 라이저를 작성하고 호출합니다 각 프래그먼트에 대한 이니셜 라이저를 추가하고 그 메소드를 호출한다 건설하기 그래서, 약간의 마술 여기에 링크가 있습니다

너 체크 아웃하고 싶다면 우리는 이것을 라이브러리에 더 깊이 통합하십시오 일단이 조각 팩토리를 호출하면 프로파일을 생성합니다 파편 이 생성자를 사용하여 ViewModel 팩토리

큰 그래서, 우리의 활동은 괜찮아 보입니다 그러나, 우리 테스트, 어떻게 보이나요? 우리는 우리의 프로필을 조롱한다 ViewModel 그리고 나서 우리는 그것을위한 팩토리를 셋업 할 수있다 일종의 조각 공장을 여기에서, 다시, 똑같이한다

우리가 모의 모형에서 지나가고있는 것의 유형 ViewModel 사실과 우리의 시나리오는 똑같아 보입니다 우리는 그것을 단지 유인물이 아니라 파편 공장이기도합니다 이제 우리는 똑같은 것을 볼 수 있고, 클릭을 수행 한 다음 예, 우리 조롱 한 ViewModel이 구독을했는지 확인합니다 요구 우리는 테스트 가능한 조각, 테스트 가능한 ViewModel을 가지고있다

우리는 시험할만한 것이있다 이제, 우리는 이 API의 개선 사항은 다음과 같습니다 더 쉽게 만들 수 있습니다 이 경우, 귀하의 프로필 조각을 만들 때, 우리는 이것을 이런 모양의 무언가 시작 및 종료를 말할 수있는 곳 그런 다음 방법을 말해주세요, 아, 당신이 이것을 시작했습니다

조각을 생성하고 특별히 구조화 된 인스턴스를 제공합니다 조각의 일부분이므로 실제로 그 사실을 알 필요가 없습니다 on 조각 팩토리 사용 후드 몇 가지 사례가 있습니다 오, 이런, 아마도 여러 활동이 필요할 것 같아

과, 그냥 여러 가지 활동을 사용해야하는 이유가 있습니다 기세 권리 앱이 많다는 것을 이해합니다 여러 활동 지금 당장은 쉽지 않습니다

팔다 권리 그래서, 심지어 오늘날에도 우리는 여러 활동을 사용하는 것이 좋습니다 그래도별로 그래서, 제가 말하고자하는 것은 실제로 여러개를 필요로하지 않는다는 것입니다

활동 필요한 것은 여러 작업입니다 그래서, 뭐야? 작업? 작업은 실제로 사용자가 실제로하는 것입니다 상호 작용하는 따라서 작업은 일련의 활동으로 구성되며 각각 작업에 백 스택이 있습니다

여기 개요 메뉴에서 각 이러한 항목 중 하나는 단순한 활동이 아닙니다 실제로는 전체 작업 스택, 오른쪽 그래서 당신은 단지 정상을보고 있습니다 그 스택의 대부분의 활동 여기 각 요소는 스택입니다

권리 분할 화면 멀티 윈도우를 할 때, 그 두 가지 작업이 나란히 있습니다 권리 Chrome OS 기기에서 떠 다니는 멀티 윈도우를 지원하는 것들, 이들 각각 작업은 창입니다 창과 업무 사이에 일대일

아니 활동 동점 및 창, 업무 및 창 따라서 이러한 Chrome OS 기기 중 하나에서 새 작업을 시작하면 너 새로운 창구 야 권리 따라서 앱이 필요하지 않을 수도 있습니다 여러 활동이 있지만 어쩌면 여러 창이 필요합니다

권리 그래서, 이것은 네가 사용해야 할 경우이다 후드 아래에서 작업을 할 때마다 이러한 작업 중 하나는 별도의 활동이되어야합니다 하지만, 귀하는 하나의 작업에서 여러 가지 활동과 같은 다른 것들 그래서, 이게 실제로 어떻게 생겼지? 이것의 많은 것은 저것이다 새로운 일을 말하는 많은 다른 방법이 있습니다

권리 누구든지 멋진 발사 모드 플래그와 그 모든 재미? 네 얼마나 많은 사람들이 아직도 제정신입니까? 괜찮아 글쎄, 나는 많은 좋은 깃발이 있음을 말할 것이다 거기, 안드로이드 1에

[웃음] 그들은 안드로이드 1에서 다시 돌아 왔습니다 오늘, 2018 년에 그들은 어쩌면 최선의 사용법이 아닐지도 모릅니다 당신이 실제로 사용하고자하는 것은 문서 실행 모드 실제로 문서 실행 모드가 추가되었습니다 우선 API 21에 대해 생각하고 있다면, 뭐하는거야? 그리고, 둘째, 아마도 시도하고 조종사를 조종하십시오

해키 솔루션 어쩌면 그럴 가치가없는 것일 수도 있습니다 사용자 하지만 시작 모드 플래그 및 작업과 같은 것들을 피하고 시도하십시오 친화력과 그 종류의 것들 때문에 프레임 워크는 그 명예를 존중하지만, 아마도 그것들을 존경하지 않을 것입니다

너는 그들을 존경하기를 원한다 확실히 다르다 물건의 종류 문서 실행 모드에서는 멀티 태스킹, 여러 작업을 할 수있는 경우 여러 작업 창문 개요 화면에 여러 항목이 있습니다

멀티 태스킹을 수행하는 첫 번째 방법은 기존에 있습니다 이 활동을 시작할 때마다 기존의 수단으로 활동에는 자체 작업이 있습니다 이걸 시작할 때마다 활동에는 자체 작업이 있습니다 그러나 이미 시작한 경우 해당 작업을 두 번째 및 세 번째 복사본을 만들지 마십시오 이것은 좋은 일이다

누군가가 원할지도 모르는 문서, 대화 및 side-by-side 비교 그들은 하나에서 빠져 나오지 않을거야 다른 한 장을 열고 거기에 복사하십시오 그것은 Android 인 멀티 태스킹 모델로 앱에서 실제로 이것을 사용합니다 지금 당연히, 기존의 당신이 독창성에 대한 약간의 개념을 가지고 있다고 가정합니다

그것은 가정합니다 데이터를 사용하는 경우 의도 조정자가 시점과 같습니다 귀하의 활동에 대한 UI, 거기에는 일종의 고유 한 ID가 있습니다 대화 ID, 문서 ID, 그 일을 유일하게 정의하는 것 좋은 예가 Google입니다

문서 도구 다른 작업에서 실행됩니다 당신은 그들을로드 할 수 있습니다, 전화로 나란히 Chrome OS의 두 개의 다른 창 장치 그리고 그것은 효과가 있습니다

하나의 앱이지만 여러 개의 창이 있고 실제로 다른 수준을 허용합니다 다른 일들 사이의 멀티 태스킹 그래서 또 다른 큰 것이 새로운 콘텐츠를 만드는 것입니다 따라서 새로운 콘텐츠는 진짜로 유일한 ID가 없기 때문에 조금 다르지만 당신은 멀티 태스킹 동작을 원하면 기존의 당신이 새로운 것을 창조하는 동안 항상 플래그 기존과 비슷하지만 항상 새로운 것을 창조합니다 그것은 자기 설명 적 이름과 같습니다

우린 할 수있어 그것은 당신이 하나에서 여러 가지를 할 수 있습니다 한 가지 예가 Gmail은 새 이메일을 만들 때 이러한 종류의 모드를 사용합니다 이렇게하면 새 이메일을 작성하고 기존 이메일을 동시에 마술 같지? 이것이 동등한 것, 모바일에서, 당신이 웹에서 그것을 할 때, 다른 첩자와는 별개로 작은 두더지를 올리십시오

당신이 아직도 참고 자료로 다른 자료가 필요합니다 휴대 전화 나 태블릿에서는 약간 다르게 보입니다 그만큼 다른 경우는 picture-in-picture이고, 완전히 다른 모드 하나는 별도의 작업을 사용합니다 권리

따라서 이것은 별도의 활동이 될 것입니다 재생 그래서, 이것은 정말로 Android TV에서 일반적입니다 TV는이 방법을 사용하므로 실제로 사물을 픽쳐 인 픽쳐 모드에 넣고 다른 영화를 탐색하십시오 따라서이 모드에서는 대단히 유용합니다

특정 사진 속 그림 버튼이 있습니다 귀하의 UI 다른 모드는 하나의 작업 만 사용합니다 활동 당신은 아무것도 필요하지 않습니다

듀오입니다 전체 작업이 어디서 이루어지는 지 Google지도 picture-in-picture 활동 권리 그래서, 언제 니가 원하는거야? 둘 중 하나를 선택 하시겠습니까? 정말이 경우에 한 번 나는 picture-in-picture 모드에있다 실행기 아이콘을 클릭하면 어떻게됩니까? 런처 아이콘은 항상 앱의 기본 작업을 실행합니다

듀오의 하나의 작업 만 가지고있는 Duo를 실행하면 실행기 아이콘에서 팝업창이 열립니다 picture-in-picture 가지고 있기 때문에 이치에 맞지 않습니다 같은 시간에 여러 대화가 진행됩니다 너는 절대로 하나를 다른 것으로 대체하려고합니다

너 절대 갈 수 없어 뭔가가 이미 있음에도 불구하고 계속 참조하십시오 진행 그것은 여기서 차별화 요소입니다 너 너 해? 동일한 그림이있는 그림을 찾아보고 싶다

시각 원하는 경우 Android를 사용하고 있습니다 프레임 워크이며, 이들을 별도로 배치해야합니다 별도의 작업 활동 활동을 분리하십시오

그러나, 그것은 그것의 종류입니다 내가 언급하지 않은 한 가지는 인스턴트 앱과 같은 것들 일종의 인스턴트 앱 활동 수준 권리 시작 활동을 호출합니다

그러나 사실 몇 가지 흥미로운 것들이 있습니다 Play 팀에서 작업했습니다 나는 여기에 대화가 있었다고 생각한다 Android Dev Summit 그것의 많은 것은 경우의 주위에이다 App Bundle을위한 경험, 즉석 앱 만들기 동적 기능 모듈도 제공합니다

이것들은 정말로 사물에 물건을 추가하는 흥미로운 방법 구현하려면 특정 앱 아키텍처가 필요하지 않습니다 우리 실제로 이것으로 더 많은 일을 할 수 있습니다 즉각적인 경험을 위해 추가되었습니다 equals는 참을 의미합니다

그들은 당신의 전체 앱을 시도 할 수 있습니다 기본 모듈은 완전히 순조로운 효과를냅니다 앱 링크와 같은 것들 내가 말했던 깊은 링크들 어떤 목적지 에나 추가 할 수 있습니다 auto verify가 true 인 것을 app 링크에 추가합니다

누군가 웹에서 딥 링크를 시작하면 즉각적인 앱 환경을 열고이를 다운로드하십시오 전체 기본 모듈 및 전체 탐색 그래프는 다음과 같습니다 이미 거기, 갈 준비 그러나, 당신이 앱이 너무 커서 동적으로 매우 자주 또는 오히려 큰 물건을 사용하지 않습니다 그게 뭐야? 동적 인 특징 단위는 전부 대략이다

주문형 다운로드가 가능합니다 재미있는 동적 인 특징 단위에 관하여 것은 당신은 추가하고있다 수업 활동을 추가 할 필요가 없습니다 추가 할 수 있습니다 목적지, 파편의 수

이 경우, 당신은 주문에 따라 새로운 목적지를 추가 할 수 있습니다 너 때문에 이 동적 피처 모듈 각각에 XML 파일을 내장합니다 자신의 탐색 그래프를 추가 할 수 있습니다 따라서 이것은 우리는 별도의 활동에 묶여 있지 않습니다 우리는 실제로 여전히 하나의 활동을 사용합니다

이제 더 많은 것이 있습니다 Play 사이드와 네비게이션 사이드 모두에서 여기에서 완료됩니다 그러나 우리는 이것을 개발자들이 쉽게 사용할 수 있도록 만들고 싶습니다 그래서, 무엇 우리가 가고 싶은 것은 당신이 뭔가를 당신에게 추가 할 수있는 곳입니다 탐색 태그에 특성 태그를 추가하면 조각 태그를 찾아이 목적지로 이동할 때, 실제로 다운로드와 제작을 모두 할 것입니다

귀하의 분할 이름에서 무엇이든지 사용할 수있는 귀하의 기능 모듈 입니다 그래서, 우리가 할 수있는 곳입니다 단일 활동을 사용하십시오 어디에서 유용하게 쓸 수있는 곳 네비게이션의 딥 링크와 같은 것들 귀하의 앱 아키텍처 그래서, 저는 이것을 끝내고 싶습니다

하나의 메모와 함께 많은 사람들이 가지고있는 기존 앱을 보유하고 있습니다 매우 다른 종류의 경험들과 저는 말하고 싶습니다 앱에 맞는 작업을 수행하십시오 나는 단일 활동이 위대한 것이라고 생각한다

나는 새로운 활동을 쓰고 있었고, 그것은 하나의 활동 일 수도있다 하지만 나는 하고 말하며, 어이, 전체 앱을 찢어 버리자 떨어져, 때때로 열심히 판매합니다 그들 중 일부는 당신을 좋아하지 않습니다 현재 앱

그래서 아마 너는 실제로 어떤 것을 얻을거야, 네, 그것을 위해 좋다 정말로 자신의 경험에 달려 있습니다 자기 자신의 경험을 뒤 틀어서 발견하지 못한다 너에게 이해가된다 그러지 마라

권리 무언가가 효과가 있다면 좋을 것입니다 계속 작동 시키십시오 권리 그러나 문제를 겪고 있음을 발견하는 경우, 일관성없는 행동을하거나 귀하가 공유하고 싶어합니다

ViewModel, 아마도 그것이 시간을 향해 움직이는 것에 대해 생각할 시간입니다 단일 활동 고맙습니다 외부 Q & A 정말 모두 오셔서 고맙습니다

[박수 갈채] 이 방에있는 모든 사람들, 다음 세션은 10시에 시작됩니다 의사록 고맙습니다 [박수 갈채] 여보세요 그리고 Android Dev의 마지막 세션에 오신 것을 환영합니다

정상 회담, 궁극적으로 생각합니다 Get이라고 부릅니다 생기 있는 나는 닉 부처입니다 나는 Doris Liu입니다

나는 Android API를 담당합니다 나는 Nicolas Roard John Hoford, 작업 중 MotionLayout 및 디자인 도구를 제공합니다 큰 이제 시작하겠습니다

그래서 Android는 항상 애니메이션 API를 보유하고 있습니다 개수 시스템이 성장하고 더 많은 종류가 될 때 API가 증가했습니다 모든 기능을 갖춘 다양한 API가 있습니다 다른 상황에 추가 된 다른 상황 API 릴리스 및 새로운 지원 라이브러리 AndroidX 그러나 때때로, 우리는 다양성, 애니메이션 시스템의 범위는 압도적 인 수 있습니다

어느 것에 도달할지 또는 어느 것이 가장 좋은지를 알지 못한다고 특정 유스 케이스 그래서 우리의 목표는 당신에게 개요를주고, 그들이 무엇인지를 말해주는 것입니다 좋은 일, 좋은 일이 아니고 거기에 줄 수있는 일 무엇을 얻을 수 있는지에 대한 자신감 우리는 더 많은 것을 쓸 것입니다 MotionLayout에서의 시간

첫 번째는 Android에서 가장 오래된 원래 애니메이션 API, 안드로이드 뷰 애니메이션입니다 나는 당신에게 그것을 비추천이라고 생각하도록 촉구한다 실제로는 아니에요 deprecated deprecated 하지만 어쩌면 그렇게 생각할 수도 있습니다

그래서, 제가 말했듯이, 오래된 애니메이션 API는 일종의 – 시스템의 특정 단계에서 실행됩니다 대부분의 조회수에는 측정 레이아웃 및 끌기 애니메이션 만 실행되기 때문에 드로우 패스에서 우리는 다음과 같은 특정 일을 할 수 없다는 것을 의미합니다 우리가 필요하지 않을 때 렌더링을 연기합니다 또한 어떤 것들은 애니메이션 만 있기 때문에 어디로 가는지 무승부 패스를 적용했는지, 버튼을 움직여 보았는지, 견해는 도전하지 않습니다

그들은보기 끌기와 함께 존재합니다 시스템은 기본적으로 더 이상 사용되지 않는 것으로 간주됩니다 그것 박물관에 소속되어있다 [웃음] 나는 단 하나의 유스 케이스가 있다는 것을 제외하면 deprecated라고 말하고 싶다 창 애니메이션을 할 때입니다

새로운 활동이있을 때 이 API는이 유형의 창 애니메이션 만 허용합니다 왜냐하면 그것은 API 1에서 존재했기 때문입니다 애니메이션은 모든 정보를 명시해야만 생기 드로우 패스에서 실행되는 사실이 유용합니다 그것은 그것이 여기에 우리가 보는 것처럼 어떤 것을 정의 할 수있게 해줍니다

넓은 애니메이션, y 위치의 10 % 왜냐하면 측정이 보장되므로 유용 할 수 있습니다 유일한 다른 장소는 조각을 할 때입니다 업무 이 Android보기 애니메이션을 제공 할 수 있습니다 하지만이 앱은 최신 안드로이드 애니메이터를 허용하므로 나는 당신에게 충고합니다

가능한 경우 최신 버전을 사용하십시오 그래서 그것은 뷰 애니메이션이었습니다 기본적으로 단지 바람 소리가 나거나 필요한 경우에만 사용합니다 그 부분에 의존하는 것 그렇지 않으면 더 이상 사용되지 않습니다

다음 애니메이터 괜찮아 변하지 않았어 죄송합니다

괜찮아 그래서, 닉은 뷰 애니메이션에 대해 이야기 했으므로 이제 새로운 애니메이션을 살펴 보겠습니다 API 11에서 소개 된 애니메이터입니다 따라서 새로운 애니메이터 API는 애니메이션을 만들 수 있으므로 훨씬 더 다양합니다 뷰 속성 이상

어떤 값을 애니메이트 할 수 있습니다 값을 사용하여 모든 속성과 반드시 ​​연관됩니다 애니메이터 API 그리고 소개 이후 애니메이터, 우리는 더 높은 수준의 애니메이터를 만들었습니다 애니메이터 드로어 블, 트랜지션 및 RecyclerView의 기본 항목 애니메이터

사람들은 항상 애니메이션과 애니메이터 사이에서 저에게 묻습니다 애니메이션 API를 사용해야합니까? 그리고 대답은 분명히 애니메이터 API 왜냐하면 그것은 훨씬 더 능력이 있기 때문입니다 그리고 이걸로 섹션에서 몇 가지 애니메이터를 살펴 보겠습니다 우리는 가치 애니메이터와 오브젝트 애니메이터를 살펴보십시오

값을 애니메이션화하지만 그 값을 평가할 수 있습니다 가고 있었다 애니메이터 세트보기 그리고 나서, 우리는 또한 뷰 속성 애니메이터를 살펴보십시오 그것은 아니다 애니메이터이지만 가치 애니메이터가 뒷받침합니다 우리는 조금 이야기 할거야

1 분 안에 그 점에 대해 좀 더 자세히 설명합니다 그리고 나서, 우리는 함께 사용할 수있는 부동산 가치 보유자 살펴보기 가치 애니메이터 다음은 재미있는 애니메이션입니다 저글링 남자 그것은 애니메이터와 함께 할 수 있습니다

드로어 블 (Drawable) 다음 섹션에서 Nick이 이야기 할 것이다 그러나 이제 그걸 지나쳐 보자 그리고이 작은 남자 맨 위에 텍스트가 애니메이션으로 재생됩니다 그래서, 달성하기 위해 즉, 애니메이터에게 객체 애니메이터를 간단하게 만들 수 있습니다

이 뷰의 알파 속성은 매우 직설적입니다 나는 알파 문자열을 제공하는 것은 나쁜 생각입니다 속성 문자열이 객체 애니메이터에게 전달되고, 우리는 그 문자열에 접두사를 붙이고 사용해야합니다 목표물에 세터와 게터를 찾는 반사 객체의 클래스와 그게 더 비싸다 우리가 추천하는 것은, 대신이 속성 개체를 사용하고 있습니다

API에 소개되었습니다 14 다른 속성들과 함께 어떤 일이 일어나는가? 애니메이션 값이 업데이트 될 때마다 설정 값은 호출되고 거기에서 알파가 호출됩니다 전망

리플렉션보다 효율적이어야합니다 이 애니메이션을 면밀히 살펴보면 텍스트가 폭발하므로 애니메이션이 적용되는 세 가지 속성이 있습니다 알파 스케일 X 및 스케일 Y 우리가 그렇게 할 수있는 방법이 있습니다 우리 각 속성에 대해 하나씩 3 개의 속성 값 소유자를 만들 수 있습니다

시작 값과 종료 값을 지정할 수 있습니다 일단 이러한 모든 자산 가치 보유자가 정의되면 객체 애니메이터에서 설정하십시오 그런 다음 객체 애니메이터는 속성 값의 변경을 유도하십시오 한 가지주의 사항은 여러 속성 값 소유자를 사용할 때입니다 하나의 객체 애니메이터에서, 당신은 본질적으로 터프 츄 레이터에서 같은 속성을 사용하는 속성 동일한 오브젝트에 대한 지속 시간

많은 시간, 우리는 애니메이트하고 싶다 스케일 X와 스케일 Y를 동시에 사용하면 필요한 것 속성을 사용하여 XML에서 정의하려는 경우 가치 보유자, 그것은 매우 직설적입니다 이 애니메이션의 맨 아래를 살펴보면 버튼 페이드 인 이들 서로 다른 애니메이션을 조정하려면 함께 애니메이터 세트를 만든 다음 – Play 메서드를 사용하면 건물을 반환하고 페이드 아웃 후에 페이드 인을하고 싶다

그래서 – 그리고 나서, 텍스트가 들어가는 동안 우리는 또한 그것을 날려 버리기를 원합니다 스케일 애니메이션으로 페이드 인을하고 나서 우리는 버튼 전에 모든 텍스트 애니메이션을 재생하고 싶습니다 페이드 인 그래서, 꽤 예쁘다 간단한 API와 강력한 기능도 제공합니다

이제 우리는 어떻게 다른 속성을 애니메이트 할 수 있는지 보았습니다 객체 애니메이터와의 비협조 성 그들이 일어난다면 view 속성을 호출하면이 속성을 호출하여 뷰 속성을 만들 수 있습니다 애니메이터 (animator)를 선택하고 다양한 방법을 사용할 수 있습니다 속성을 설정 한 다음 최종 값을 설정하고 옵션으로 터프 터에 넣고 멈추십시오 그것은 더 아름답게되지 않는다

그리고 이것보다 간결하다 보기 속성은 가치 애니메이터 그것은 애니메이터가 아니므로 실제로는 할 수 없습니다 다른 유형의 애니메이터와 조정하십시오 되돌릴 수 없다

그것을 반복하거나 반복하십시오 어떤 사람들 – 어떤 사람들은 내게 묻습니다 객체 애니메이터만큼 효율적인 속성 애니메이터? 제가 할수 있어요 확신 할 수 있습니다 실제로는 객체 애니메이터 그 이유는 뷰 속성 애니메이터입니다

뷰 속성에 애니메이션 효과를주기 위해 최적화되었으며 모든 뷰포트에 대해 유효성 검사를 한 번 통과해야합니다 방아쇠를 당긴다 객체 애니메이터를 사용하여 애니메이션을 적용하는 경우 다양한 속성, 각 속성 변경 예정 유효성 검사 통과 자체를 트리거합니다 보기 속성 애니메이터는 화재에 더 효과적이며 사용상 잊어 버립니다 애니메이션을 시작하고 잊어 버리는 경우

이제, 이전에이 애니메이션을 보았을 것입니다 이전 슬라이드 작은 점이 세 개 있다는 것을 알았 니? 텍스트 끝에 애니메이션 효과가 있나요? 그리고이 작은 점들은 실제로 텍스트보기의 속성은 아닙니다 그래서, 여기, 우리는 점 수를 움직이게하는 값 애니메이터를 만들려고합니다 정수형을 입력 할 것입니다

반복이 있습니다 카운트 가치 애니메이터를 사용하면 거의 항상 값 애니메이터가 애니메이션으로 적용되기 때문에 리스너 업데이트 그 자체 여기서, 업데이트 리스너를 사용하면, 우리는 가치 애니메이터의 가치를 읽을 것입니다 그것을 우리가 보여주고 자하는 점의 수로 사용하십시오

그리고 나서 텍스트에서 스팬 블 (span) 가능한 문자열을 갖게 될 것입니다 전망 우리는 다음과 같은 기간을 설정할 것입니다 투명 색 스팬 – 점보다는 오히려 보여서는 안됩니다 그리고 – 각 애니메이션마다 업데이트 할 점의 수를 업데이트합니다

보여 주다가 이에 따라 우리가 보여주고 싶지 않은 점들을 숨길 수있는 범위 다시 말해서, 언제 어떤 종류의 애니메이터를 사용해야합니까? 목적 애니메이터는 다목적 애니메이터로, 오래 살기를 원하면 속성을 사용할 수 있습니다 그 값 애니메이터는보다 사용자 정의 된 종류의 애니메이션을 만들기위한 것입니다 이 값을 애니메이션화 한 다음 사용하려는 애니메이션의 그 값을 UI의 다른 것에 적용합니다

전망 속성 애니메이터는 다중보기가있는 경우에 가장 적합합니다 동시에 애니메이션을 적용해야하는 속성 동일한 뷰와이 뷰를 실제로 조정할 수 없기 때문에 속성 애니메이터는 무엇이든간에, 그것은 화재 및 유스 케이스 잊어 버려 그런 다음 속성 값 소유자, 재산 가치 보유자와 함께, 당신은 여러 속성을 만들고 객체 애니메이터를 사용하여 만듭니다 좋은 재산가 보유자에 관한 것만이 아니라 여러 속성을 동시에 애니메이션으로 만들 수 있습니다 실제로 객체 애니메이터에 설정되어 있기 때문에 그것을 조정하거나 찾거나 뒤집어서, 더 강력 해집니다

Animator 세트, 원하는 애니메이션이 여러 개 있습니다 좌표, 애니메이터 세트가 좋은 선택이 될 것입니다 고맙습니다 다음으로 애니메이션 벡터 drawable 그래픽 애니메이션과 같은 것들은 위대한 것들입니다

Google 피트니스 앱에서 볼 수있는 멋진 아이콘 그것 기본적으로 벡터 드로어 블을 하나 또는 여러 객체 애니메이터와 애니메이션을 실행합니다 그것은있다 작은 종류의 집중된 API의 아주 종류, 그것은 기본적으로 애니메이터 이런 드로어 블을 얻을 수 있고 전화 할 수 있습니다 스타트

성능이 중요하고 벡터처럼 유용합니다 그래픽 정보, 특히 드로어 블이 재 구현 된 곳 코드에서 UI 스레드를 수행하는 경우에도 계속 유지됩니다 연주 코드를 작성하는 데 더 많은 시간이 필요합니다

애니메이션 코드를 실행합니다 아이콘에 애니메이션을 적용해야하는 경우 그래픽을 애니메이션으로 만들거나 잊다 당신은 그것을 통해 추구 할 수 없습니다 당신은 그것을위한 진전 나는 당신이 Kirye drawable을 보길 강력히 권합니다

그것은 성능에 중요한 모든 것에 적합합니다 자, 물리 애니메이션 누가 물리학을 좋아하지 않습니까? 그것은 대화식 사용 사례에 적합합니다 제스처가 계속되고 그 운동의 계속을 원한다 그 연속성의 감각을 만들기 위해 UI로 제스처

왜냐하면 그들이 비행 중에 제스처를 허용 할 때, 당신은 잠재적으로 기존 진행중인 애니메이션을 중단시킵니다 나는 애니메이션을 원하는 곳에서 애니메이션을 보았는지 확인하십시오 보기를 한 위치에서 다른 위치로 이동하려면 그러면 사용자 및 종료 위치의 일부가 있습니다 바뀌었을거야 그리고이 경우 물리 공간을 사용한다면 애니메이션, 그것은 단순히 물리학적인 힘을 변화시키고 결과적으로 과정 수정은 실제로 부드러운

그래서, 여기에 내 고양이 그림이 그려진이 작은 거품 그리고 그것은 응용 프로그램 오버레이 창이 다른 맨 위에 위치하도록 응용 프로그램 그리고이 경우에, 그것은 아름다운 Timely입니다 앱 내 목표는이 작은 거품을 끌어들이는 것입니다

내가 놓으십시오 화면 양쪽에 놓아야합니다 이것을 달성하기 위해, 우리는 분명히 리스너로 시작하여 속도 수신기를 사용하여 이동을 추적하고 위치 추적 후속 이벤트에서 우리는 얼마나 많은 것을 계산할 필요가 있습니다 당신의 손가락이 그 다운 이벤트 이후로 움직 였고 거품의 위치와 이에 따른 행동이있을 때 그게 재미있는 일이야 우리는 속도를 계산하고 여기에서 단순화를 위해 데모, 우리는 단지 속도가 0보다 큰 경우, 우리는 화면

그렇지 않으면, 왼쪽 이제 우리는 우리가 거품을 쉬고 싶은 위치, 문자열 애니메이션 그것은 사용자 정의 속성입니다 다음 슬라이드에서 설명하십시오 애니메이션을 시작하기 전에, 우리는 또한 시작 속도를 설정하기를 원합니다

제스처에서 애니메이션으로의 전환이 원활한 내 맞춤 속성입니다 이 맞춤 속성의 요점은 실제로 애니메이션 값을 그 위치와 연관 시키려면 거품 애니메이션 값이 바뀔 때마다, 우리는 이것을 얻습니다 – 우리는 이 설정 값 호출을 얻는다 그러면 애니메이션을 설정하려고합니다

레이아웃에 대한 가치 paramsX는 응용 프로그램 개요에서 애니메이션을 적용하기 때문에 창 관리자는 창 관리자가보기 레이아웃을 반영하도록 반영합니다 변화와 유사하게 가치를 얻으려면 귀환하다 layout paramsX 고맙습니다

다음은 전환 API 이제 과도기가 보입니다 두 개의 서로 다른 레이아웃 상태와 무엇이 변경되었는지 그들 사이에 실제로, 당신은 전이를 다음과 같이 생각할 수 있습니다 공장

얼마 전에, 나는 그것이 일을 위해 얼마나 좋은지 이야기했다 이 같은 것들, 두 개의 다른 제약 세트 및 사용 전환 매니저 나는 이것이라고 생각한다 더 잘 해결 된 MotionLayout 나는 그것이 좋은 것이라고 생각하지 않을 것이다

그 너는 이것을 부르고 변화를가한다 뷰 계층과 마법에 이르기까지 그것은 두 가지를 본다 UI의 다른 상태, 변경된 사항, 애니메이터를 만듭니다

제어 할 수있는 오버레이가 있습니다 그 전환 전환에 대해 내가 좋아하는 것은 무엇입니까? 코드베이스에 않습니다 나가 그것을에서 이동 한 변화는 여기에서있다 뷰 레이어를 전환으로 때로는 눈에 띄지 않게 보일 수도 있습니다 이런 식으로

청취자를 미리 그린 다음보기를 두드려라 계층 전환으로 이동하여이 전환으로 이동합니다 선언적 아키텍처 그것은 몇 가지로 구성되어 있습니다 보다 쉽게 ​​전환 할 수 있습니다

그러나, 당신은해야 할 수도 있습니다 약간의 전환을 직접 써라 그러나 그 코드는 훨씬 더 – 잘 모르겠습니다 – 함께 일하는 것이 좋고 훨씬 더 초점을 맞추었고 실제로 코드베이스 전환해야합니다 그것을 써? 나에게 공유되는 강력한 유스 케이스가 하나있다 이 작업을 수행하는 데 사용할 수있는 유일한 방법입니다

너가 최고 관례를 가면 않는 한 실제로 두 가지 전환이 있습니다 여기에 2 AK 사이의 공유 요소가 있습니다 그런 다음 창 콘텐츠 전환이 있습니다

언제 창을 시작하거나 종료하고이 애니메이션을 함유량 시청자가 도착하면 나머지 콘텐츠 위쪽으로 움직입니다 언제 사용해야합니까? 전환 API? 공유 요소 나를위한 요소들 또한 모듈화 및 애니메이션 코드를 작성하면 전환이 도움이 될 수 있습니다 같이 begin delay 메소드를 사용하여 간단한 전이와 마찬가지로 MotionLayouts

괜찮아 지금까지 우리는 코딩에 대해 이야기하기 그것은 강력합니다 API는 정말로, 정말로 완전하다 다른 한편으로는 24 시간이 많이 걸린다

우리가 그 일을 돕기 위해 무엇을 할 수 있습니까? 우리는 당신은 더 생산적이며, 당신은 더 빨리 반복 할 수 있습니다 우리는 모션 디자인은 훨씬 더 쉽게 접근 할 수 있습니다 그래서 한 가지는 우리는 헬퍼 객체를 도입했습니다 실제로, 도우미 물건은 당신이 사용해온 것입니다 우리는 지침

실제로보기의 일부가 아닌 그것이 화면에 나타나지 않는다는 것을 감지하지만 도움을 줄 수 있습니다 당신은 그 레이아웃을 만듭니다 추가 개념을 가져 오려면 쉽게해라 20에서, 우리는 당신을 그렇게 노출 시켰습니다

너는 클래스를 서사하는 것만으로 도우미를 만들어라 그것은 방법이다 코드를 작성하고 도우미에 참여 시키면 사용자를 지원하므로 추가하기가 쉽습니다 또한 그것에 대해 생각할 수 있습니다 특정 행동으로 태깅하기

의 경우 애니메이션, 그건 정말 좋네요 알다시피, 당신은 암호 너는 도우미를 지었고 우리는 모든 부를 가지고있다 안드로이드 애니메이션 API 중 하나를 사용하면 그런 것들을 할 수 있습니다 권리

예를 들어, 꽤 잘 알려진 애니메이션을 알 수 있습니다 내가 여기서해야 할 유일한 것은이 조각을 정의하는 것이다 그리고 실제로 내가 말하는 것에 대해 – 알았어 뭐 — 여기서 내가해야 할 일은 당신이 볼 수있는 코드입니다 화면, 나는 단순히 전화하고있다

나는 바퀴를 여기에서 재발 명하지 않고있다 나는 새로운 길을 찾지 않을거야 하지만 그게 유일한거야 내 도우미와 레이아웃 파일에서해야 할 일이 있습니다 그 도우미를 선언하고 해당 도우미의 ID를 지정하기 만하면됩니다

당신이 적용하고자하는 위젯 그래서, 기본적으로 – 그것은 사용 가능한 코드 블록을 쉽게 패키징 할 수 있으며, 당신의 어플리케이션에서 사용하십시오 다시 코드로 돌아갑니다 그래서, 다른 방법으로 우리는 너의 삶을 더 쉽게 만들고, 너를 지으라고 생각했다 합리적인 벽돌은 선언적 방법으로 이동하는 것입니다

생기 그래서, 당신은 그것에 대한 사양으로 생각할 수 있습니다 운동 그리고 우리는이 명세를 모션으로 해석한다 엔진과 그 위에 우리는 그래픽 동작을 구축하고 있습니다

편집자 Google I / O에서 소개 한 기능입니다 우리 아직도 그것에 종사하고있다 우리는 도서관에 집중하기로 결정했습니다 측면

종류가 당신에게 옳은지 확인하기를 원하기 때문에 귀하의 필요에 따라 그러나 현재에 대한 간략한 개요 빌드, 따라오고 희망적으로 곧 올 것이다 버전 스튜디오 그래서, 그것은 우리가 당신을 돕기 위해 가지고있는 전반적인 접근법 그래서 도우미는 한 손 및 다른 모션 사양 좋은 점은, 내가 이것을 보면, 당신이 이 동작을 지정할 수 있고 우리는 그것을 처리 할 것입니다 당신 실제로 코드를 작성하지 않아도됩니다

그래서, 우리는 MotionLayout을 통해 구현했습니다 그래서, 무엇 MotionLayout입니까? 그것은 뷰 그룹입니다 그래서 한가지주의 할 점이 있습니다 해당 뷰 그룹의 자식 만 애니메이션으로 만들 수 있음을 의미합니다 그리고 그것은 하위 클래스입니다

ConstraintLayout을 안다면, 큰 MotionLayout을 직접 사용할 수 있습니다 반대로, ConstraintLayout을 사용해야한다 하지만 제비 그래서, 우리는 전환과 속성을합니다

터치 구동 모션을 효과적으로 지원합니다 그래서 일종의 애니메이션의 가치를 생각해 단일체로 포장하기 장소 그래서 대략적으로 말해서 이해해야 할 것은 우리가 상태 우리는 시작 상태와 끝 상태를 가지고 있으며 우리는 그 두 가지 사이의 해석 그래서, 기본적으로 레이아웃 변경을 지원합니다

두 가지 버젼의 레이아웃, 우리는 커스텀을 지원합니다 색상 및 키 프레임에 애니메이션 효과를 적용하려면 당신은 키 프레임을 수정 자로 생각할 수 있습니다 시작과 끝 사이에서 변형되었습니다 그래서, MotionLayouts와 함께 요약하면, 애니메이션, 전환, 모션을 선언 방금해야 할 일을 지정하면됩니다

그것을 돌보아 라 특별히 원할 때 좋습니다 미세 조정 된 애니메이션 그래서, 그것은 당신이 원하는 것에 대해 매우 구체적입니다 그것은 매우 구체적인 방법으로 함께 조정하는 것입니다

마지막으로, 터치 구동 방식의 경우에는 정말 좋았습니다 운동 운동 나는 마이크가 필요하다고 생각하지 않는다 그래서, 나는 단지 종류의, 좋아, 너에게 많은 것을 보여주고 조금 더 여기에서 시각적으로 볼 수 있습니다

그래서, 이것은 당신이 원하는 방식입니다 신중하게 창조하다 craft custom 맞춤, 미친, 멋진 애니메이션 넌 할 수있어 그런 것들 [웃음] [박수] 그렇다면 어떻게 그 일을했을까요? 그 단지 2 개 – 2 개의 체인 하나의 사슬과 각 사슬로의 변화 편지는보기이고 우리는 비틀 거리고 색을 바꾼다

사용자 정의 일치보기 쉽게 볼 수 있습니다 그것은 나를 데려 갔다 보기 분, 멋지다 그리고 그게이게 뭐야? 물건이 전부입니다

그래서, 우선, 당신은 할 수 있습니다 터치로 물건을 치우십시오 그것은 swipes을 처리합니다 만약 너라면 가볍게 치면 빨리 건너 뛸거야 그것은 속도와 그것을 관리합니다

이해해야 할 다음 사항은 우리가 시작하는 것입니다 두 개의 제약 조건 집합에서 얻지 만 키 프레임이 있으며 여기, 두 개의 제약 조건 세트로 시작하겠습니다 어떤 키 프레임을 가지고 있고 거기에서 어떻게 교차하는지 보시나요? 바로 거기에 겹쳐 있습니다 그래서 당신이하는 일은 당신이 열쇠를 더하는 것입니다 위치, 키 프레임, 그리고 당신은 X – you에서 가속 중반부의 X 부분을 끝내면된다

당신은 일종의 부드럽고, 당신도 알다시피 – 당신은 이것을 보았습니다 이건 너의 설정 메뉴 [웃음] 그래서, 우리가 할 수있는 열쇠 프레임의 극단적 인 끝은 키 사이클과 여기, 당신은 다른 종류의 무리를 볼 수 있습니다 우리가 할 수있는 효과 본질적으로, 진동, 흔들리는 소리, 주위에 튀는 소리, 원하지 않는 소리 실제로 키 프레임으로 복잡한 경로를 만들 수 있습니다 이것은 그것을 해결합니다

알파 2에서는 시간주기를 도입합니다 이것은 당신이 할 수있는 미친 애니메이션입니다 물론,이 너무 지나치게 길어서 이것을 사용하지 마십시오 생성물 [웃음] 하지만 – 그럼, 어떻게 사용하는지 알아 보겠습니다

권리 그래서, 우선, 우리가 가지고있는 정보가 있습니다 나는 빨리 갈거야 그것들을 보아라 조항

예제가있는 GitHub도 있습니다 당신이 스스로에게 물어볼 수있는 한가지는, 좋습니다, 대단합니다 어떻게해야합니까? 내 응용 프로그램에서 이것을 사용합니까? 여기에 접을 수있는 툴바가 있고 일반 접을 수있는 툴바를 사용하면 MotionLayout 대신에 너는 다른 일을 정말로 바꾸지 않는다 코드가 있지만 접을 수있는 것은 MotionLayout이되어 모든 그것의 이점

마찬가지로, 당신은 사용하지 않아도됩니다 새로운 클래스 인 경우 MotionLayout을 사용할 수 있습니다 같은 것 보기 페이지 용 MotionLayout을 쉽게 플러그인 할 수 있습니다 마지막 예는 흥미 롭습니다

그것은 – 그것은 정말로 보입니다 – 사실, 이것은 순수한 MotionLayout입니다 그리고 무엇이 좋은가? 그것에 관해서는 실제로 너무 중첩 된 MotionLayouts이고 우리는 술집에 접을 수있는 물건이 있어요, 똑같은 것입니다 전에 사용했습니다 그리고 단순히 MotionLayout에 중첩되어 있습니다 정말 좋은 점은 전체를 지정하기 위해서입니다

화면, 나는 그 두 가지 상태를 만들 필요가 있습니다 종료 결국에는 MotionLayout을 만들었습니다 그것은 도구 모음의 크기가 작고 기본적으로 우리가 처리합니다 그것의 모든

그래서, 현재의 상태, 우리는 그래픽 편집기에서 일하고 있습니다 그러나 라이브러리, 우리는 Google I / O를했고 우리는 알파 2를했습니다 그리고, 당신은 알다시피, 알파에서도 11에 구축되었으므로 실제로는 꽤 예쁘다 안정된

사실 꽤 안정적이기 때문에 꽤 많이 사용됩니다 사람들은 그것으로 물건을 만들기 시작했고 우리는 당신이 할 수있는 것을 조금 맛보는 몇 가지 예 MotionLayout으로 그래서 나는 트위터를 보았다 제비 트위터에서 MotionLayout을 항상 확인했고 나는 단지 몇 가지 재미있는 애니메이션을 공유 할 것이라고 생각했다

사람들이 출판했습니다 이 중 대부분은 실제로 찾을 수 있습니다 GitHubs 이 사람들은 그들을 비디오로 발표하고 보여줍니다 이 녀석은 그걸로 꽤 많은 일을 해왔 어

그가 여기에서 한 일을 보는 것은 흥미로운 일입니다 그리고 이것은 특히 흥미 롭습니다 기본적으로, 당신은 이전에 통보 했더니 움직임이있었습니다 대단히 좋은 이 특별한 예에서, 좋은 점은 보기 호출기와 비슷합니다

그는 그것을에서 운전하는 방법을 추가했습니다 코드 그리고 그것은 매우 흥미 롭습니다, 당신도 알다시피, 미래입니다 우리를위한 길 약간입니다 코드를 어떻게 재사용 할 수 있습니까? 일부 이전에 정의 된 동작? 그래서, 다른 하나, 흥미로운 것은 여기에 있습니다

일반적인 RecyclerView와 어떤 종류의 자세히보기를 표시합니다 그러나 흥미로운 MotionLayout입니다 이 작업을 수행하는 자신의 방법을 생각해내는 것은 매우 쉽습니다 전환의 종류 너는 더 이상 제한적이지 않다

이 녀석은 소재 디자인 애니메이션 스펙을 구현했지만 MotionLayout과 그가 만든 사용자 정의보기를 사용하여 그것은 아주 멋진 작품 내가 좋아했던 것들 중 하나 이건 너무 원래입니다 보기 페이지가 표시됩니다 괜찮아

이 실제로 그것에 완전히 새로운 트위스트를 돌리거나 실제로 회전합니다 [웃음] 그러나 당신은 볼 수 있습니다, 그것은 원래입니다 자신의 독창성이나 팀의 아이디어를 탐색 할 수 있습니다 그들이 무엇을 좋아하고 무엇을하는지에 대한 창조성 이것은 전형적이기 때문에 일종의 흥미 롭습니다

코디네이터 레이아웃 투명하고보기 드뭅니다 사라지는 것들로 진행되는 특수 효과 그것은 독특한, 당신도 알다시피, 모든 것을 사용자 정의보기 그리고 이것이 우리의 Chris Banes입니다

[웃음] 그리고 그는 매우 흥미로운 작업을 수행했으며 전체 응용 프로그램입니다 모든 관련된 코드가 있습니다 그것은 매우 관례입니다 그럼,하자 그것을 자세히 살펴보십시오

그래서, 그것으로 굉장히 좋습니다 이것은 순수하게 코드에 의한 모션 유형입니다 거기에 많은 요소들에 걸쳐 미묘한 조정이 많이 있습니다 그만큼 텍스트가 희미 해지고 포스터가 실제로 회전하며, 그러나 실제로 일치 그것이 우리가 이야기 할 때 의미하는 바입니다

모션 또는 미세 조정 된 모션에 대해 이것은 우리가 당신을 격려하기를 희망하는 유형의 예입니다 짓다 작은 스 니크 엿보기로 우리는 알파 3에있을거야, 여러 상태를 지원할거야 순전히에서 여러 상태와 상호 작용할 수 있습니다 접촉 그래서 이것은 하나의 MotionLayout입니다

그러나 실제로, 그것은 공백에서 세 전환 사이의 전환 처리 페이지를 스 와이프하여 스 와이프하는 방법 더 모두 하나의 페이지이고, 하나의 MotionLayout이 만들어 낼 수 있습니다 꽤 sphistticated 사용자 정의보기 이 터치 동작, 끝에서 0 그것 뿐이다

선언적 [박수와 환호성] 정말 대단합니다 시원한 그래서, 오늘은 애니메이션 API에서 가이드 투어를 해 주셨습니다 우리의 목표는 그들이 무엇인지 더 잘 이해하도록하는 것이 었습니다

잘하고 무엇이 그렇게 좋지 않은지 그래서 나는하려고 노력할 것입니다 그것을 테이크 아웃으로 요약합니다 복잡한 조정 레이아웃 제스처와 애니메이션 사이의 멋진 핸드 오프를 위해, 실제로 MotionLayout을 확인하십시오 인터럽트 가능 애니메이션을 제작해야하거나 속도 추적과 제스처, 물리학 레이아웃 시스템 필요한 경우 공유 전환, 전환이 당신을위한 것입니다

벡터 작업을 수행해야하는 경우 벡터 드로잉 작업을 수행하십시오 창 애니메이션을해야하는 경우 원본 SDK 1 뷰 애니메이션 시스템을 사용해야합니다 뷰의 속성을 애니메이션화해야하는 경우 속성 애니메이터보기 당신이 할 필요가 있으면, 관례 애니메이션보기 또는 애니메이션에 의해 구동 맥박, 애니메이터를보세요 Animator가 기본값으로 돌아갑니다

범용 애니메이션 용 다음 번에 빌드해야합니다 무언가를 선택하면 마비가되지 않을 것입니다 다른 애니메이션 API 그래서, 나는 당신에게 매우 감사합니다

우리와 밖에있을거야 매우 감사합니다 [박수]여보세요? 이제, 이제는 약 2 분 동안 지속될 완전히 다른 세션 긴 우리는 여기서 하루를 마감하고 있습니다 나는 개인적으로 호기심이 있든 없든간에

얼마나 많은 사람들이 좋아 했나요? dev 산 정상? [박수 갈채] 얼마나 많은 사람들이 개발 회의가 마음에 들지 않았고 당신은 무엇입니까? 둘째 날이 끝나고 아직도 여기서하고 있니? [웃음] 그래서 아마도 효과가 있었을 것입니다 그럴거야 차갑다 내 팀과 Google의 사람들이 좋아한다고 생각합니다 어떻게 된 거예요

귀하와 귀하의 지역 사회 청문회 콘텐츠를 전달할 수 있습니다 잘하면 우리는 개최합니다 다시 바라기를 3 년 조금 못가 겠어 다음 번에

우리는 수표를 쓰는 사람들에게 확신시켜야합니다 저기 이번 주에 봤던 것들 중 좋아하는 것들? 다만 소리 질러? 어색하게하지 마십시오 MotionLayout 좋습니다 또 뭐야? 환경 설정 좋은

모든 권리 그래, 툴킷에서 나오는 작은 새 지역 LiveData, 네 아주 멋지다 낮은 대기 시간의 오디오

예 5 분간 번개로 C ++를 라이브 코딩합니다 앱 번들, 네 코 틀린 네이티브 괜찮아 매우 흥미로운 오는 온라인

또 뭐야? 나는 paraside를 들었다 채팅, 그건 아니야 – 노변 전, 그 얘기 들었어 사실은, 오늘 정말 재미있었습니다 채팅 하는게 좋았 니? 좋은 굉장해

사용할 수있는 모든 것이 있습니다 지금, 거의 온라인으로 이미 첫날이 이미 게시되었습니다 YouTube 그 날 2 명이 살아있을 예정이라고 들었어

일찍 8시 또는 오늘 밤 9시 호텔이나 집으로 돌아 가기 그것을 보아라 또한, 당신은 설문 조사, 지금은받은 편지함에있는 것일 수 있습니다 작성하십시오 우리는 실제로이 물건을 읽고 아주 세심한주의를 기울입니다

그것 우리에게 무엇이 효과가 있었는지 알려주십시오 당신이 우리가하고있는 이유이기 때문에 당신을위한 것들 이 어디 보자 다른 건 없니? 나는 그게다고 생각해

나는 또 다른 일을 고대하고있다 이 중 하나 2021 년에 만나기를 바랍니다 그 동안에 – [웃음] 일어난 모든 일을 놓친 경우에 대비하여 90 초 후에 그것을 포착하십시오 2018 Android에 오신 것을 환영합니다

개발 회의 개발자를위한 이벤트입니다 20 억 개가 넘는 장치로 3/4 분기 매년 다운로드되는 앱 Android 개발자 커뮤니티 성장 성장 따라서 Android 앱 번들 훨씬 더 간단 해집니다

추가 개발자 작업 없음 앱 번들을 사용하면 앱이 평균 8 % 더 작아집니다 장치를 다운로드하십시오 우리는 단순히 이것을 할 수 없었다 너 없이는 고마워 [박수와 환호] Dave가 말한대로, 감사합니다

와줘서 고마워

UI testing with Espresso – Android Testing Patterns #2

[음악 재생] 좋은 시험을 치르는 것은 어려울 수 있습니다 그리고 신뢰할 수있는 UI 테스트를 작성하면 어려운

사용자 인터페이스는 비동기식이며, 이벤트, 전환 및 데이터에 의해 유도 백그라운드 스레드에서로드 UI 테스트의 도움없이이를 코딩합니다 프레임 워크는 많은 상용구와 핸들링을 필요로합니다 가장자리 경우의 반면에 샘플 앱이있는 전화를드립니다

앱의 기능을 테스트 해 보라고하세요 방금 구현했습니다 예를 들어, 새 메모 저장 내 메모 작성 앱에서 작동합니다 너는 무엇을 할 것이냐? 글쎄, 나는 당신이 Save 버튼을 찾을 것이라고 확신한다 일단 당신이 그것을 발견했다면, 당신은 그것에 두 드릴 것입니다

그 메모가 목록에 있는지 확인하십시오 저장된 메모의 실제로 UI 테스트를위한 꽤 좋은 시나리오이지만, 사람을 이해하는 것은 간단합니다 그러나 어떻게 코드로 표현할 것인가? Espresso 프레임 워크가 구체적으로 만들어졌습니다 이 목적을 위해서 – 개발자를 가능하게하는 것 간결하고 안정적이며 사용하기 쉬운 UI 테스트를 작성하는 방법 유창한 API 그리고 가장 중요한 것은 에스프레소가 동기화를 담당한다는 것입니다

모든 UI 이벤트로, 대부분의 경우, 보기 상태 전환에 대해 걱정할 필요가 없습니다 구현 세부 사항 방금 정의한 간단한 UI 테스트를 되돌아 보면, 우리는 에스프레소를 사용할 때의 기본 흐름을 볼 수 있습니다 실제 시나리오와 정확히 동일합니다 먼저 일치하는 규칙을 사용하여보기를 찾습니다

그런 다음 작업을 수행하십시오 마지막으로 결과 상태를 확인하십시오 내가 더 멀리 가서 실제 테스트 코드를 작성하기 전에, Android 테스트가 runner 및 Espresso 종속성은 buildgradle에서 구성됩니다 의존성을 추가하고 러너를 설정합니다

Android Studio 버전을 사용하는 경우 테스트 이슈를 선택할 수 있습니다 Android 계측으로 전환하는 것을 잊지 마세요 Build Variants에서 테스트하십시오 Android Studio 20을 사용하고 있습니다

로컬 및 계측 모두에 대한 통합보기가 있습니다 테스트 그래서 이미 내 프로젝트 관점에서 볼 수 있습니다 계측 테스트는 Android 테스트 소스 세트에서 수행됩니다 여기에서는 샘플 테스트 클래스를 만들겠습니다

NotesScreenTest로 이름을 지정하십시오 테스트 클래스에 주석을 추가하여 지정해야합니다 나는 Junit 4 테스트를 쓰고있을거야 Android Junit 4 러너로 실행합니다 앱의 메모 화면이 포함되어 있습니다

notes 활동에서 활동 테스트 규칙을 추가하면 어떤 시험 전에 주자에게 활동을 시작하라고 말함 그들이 끝나면 그것을 끄십시오 이 모든 것이이 라인에서 처리됩니다 이제 설명이 포함 된 새로운 메소드를 추가하겠습니다 실제 시험의 이름과 기본 구조로 시작하십시오

나는 전에 설명했다 onView는 실제로 Espresso 클래스의 메서드입니다 하지만 내 테스트 코드에서 정적 인 import를 사용할 것이다 보다 간결한 방법으로 테스트를 표현할 수 있습니다 괜찮아

다음에 논점을 살펴 보겠습니다 현재보기에서보기를 찾으려면 정규 표현식이 필요합니다 계층 에스프레소에는 일련의 내장 matchers가 함께 제공됩니다 ID가있는 경우, 텍스트가있는 경우, Is Checked 및 기타 여러 가지가 있습니다

우리는 간단한 치트 시트를 제공하므로 매번 문서를 파고 들지 않아도됩니다 내 경우에는 플로팅 액션 버튼을 찾고 싶습니다 다행히도 화면에는 ID가있는 유일한 항목입니다 fab_add_notes 이제는 matchers를 사용하여 필요한 뷰를 격리했습니다

뷰 액션을 적용 할 시간입니다 또는 다른 말로하면, 사용자 상호 작용 그것은 에스프레소에 의해 시뮬레이션 될 것입니다 FAB을 클릭하기 만하면됩니다 그러나 다시 한 번 타이핑과 같은 더 많은 내장 동작이 있습니다 심지어 손가락을 쓸어 넘기고, 내가보기와 상호 작용하는 데 사용할 수 있습니다

그리고 마지막으로, 나는 나의 행동의 결과를 확인한다 뷰 어설 션을 사용하여 입력 필드가 표시되는지 확인하고 싶습니다 팹을 누른 후 화면에, 나는이 코드 블록을 여기로 옮길 것이다 그리고 뷰 일치를 허용하는 일치 어설 션을 사용합니다

그래서 우리가 지금까지 가지고있는 것을 요약하면, 첫 번째 문은 부동 작업 단추와 일치합니다 클릭하면 메모 추가 화면이 나타납니다 두 번째 명령문은 편집 텍스트를 찾습니다 사용자가 메모 제목을 입력 할 수있게 해주는 그것을 사용하여 표시되는지 확인합니다 일치 뷰 어설 션 사이에 아무 코드도 쓸 필요가 없다는 것을 주목하십시오

이전 행사가 끝날 때까지 기다리는 것, 에스프레소 이미 저를 위해 저를 돌보아줍니다 테스트를 실행하려면 테스트 클래스를 마우스 오른쪽 버튼으로 클릭하십시오 실행을 선택하십시오 계기 테스트이기 때문에, 에뮬레이터 또는 물리적 장치가 필요합니다 실행되는 화면에서 동작을 볼 수 있습니다

다음은 약간 더 긴 테스트입니다 에는 메모 추가 화면에 입력하고 메모를 저장하는 작업, 모두 에스프레소를 사용합니다 엔드 투 엔드 테스트를 작성하지 않는 한, 시험을 작고 범위를 유지해야합니다 그들을 더 신뢰할 수있게 할 것입니다 추가 및 실행을 연습하려는 경우 나만의 UI 테스트, 체크 아웃하는 것이 좋습니다

우리의 안드로이드 테스팅 코드 랩 (Androl Testing Codelab) 다운로드 가능한 프로젝트가 포함되어 있습니다 시작하기위한 단계별 지침을 제공합니다 Android 테스팅의 다음 에피소드에 참여해주세요 테스트에서 어댑터보기를 처리하는 방법을 배우는 패턴

행운과 행복 테스트 [음악 재생]

What's New in Kotlin on Android, 2 Years In (Google I/O'19)

[음악 재생] JEFFREY VAN GOGH : 안녕하세요 나는 Jeffrey van Gogh입니다

저는 Android Studio의 기술 책임자입니다 그리고 나는 프로그래밍 언어를 책임지고있다 및 컴파일러 하디 해리 : 그리고 저는 하디, 개발자 옹호자입니다 JetBrains에서

[치어 리더] JEFFREY VAN GOGH : 그래서 2 년이 지났습니다 구글이 안드로이드에 대한 코 틀린의 지원을 발표 한 이후 그리고 어제 Google은 Kotlin-first를 발표했습니다 그래서 우리는 당신에게 이것을 배경으로 줄 알았습니다 그리고 물론, 우리는 2 년 전에 시작하지 않았습니다

우리는 물건을 얻기 위해 상당한 시간이 걸렸습니다 안드로이드에서 Kotlin에 대한 준비 그리고 우리는 3 년, 3 년, 1 년 반 전에 결정했습니다 Google에는 수많은 언어 괴짜가있었습니다 나도 코 틀린과 놀기 시작 했어

헤이, 이것은 실제로 아주 멋지다 물론 Android Studio는 IntelliJ를 기반으로합니다 그리고 IntelliJ는 Kotlin을 오래된 코드베이스로 사용하기 시작했습니다 그래서 우리는 점점 더 코 틀린을 보게되었습니다 Android Studio에서 사용 중입니다

그리고 동시에, 우리는 고객 권고에서 많은 고객 피드백 게시판, 설문 조사 및 임시 토론 이 같은 회의에서 사람들은 Kotlin을 정말 좋아합니다 그리고 그들은 정말로 Google이 그것을 지원하기를 바라고 있습니다 왜냐하면 그들의 회사는 그렇지 않으면 Kotlin을 채택하지 않기 때문입니다 물론, 그런 새로운 언어를 사용합니다 큰 일이다

그래서 우리는 이사들에게 이것이 투자 할 가치가있는 무언가 우리가 발견 한 가장 좋은 방법은 우리 이사들에게 코드를 작성하게 Kotlin에서 며칠 동안 그 후에 그들은 팔렸다 I / O 2017 이전에 몇 달 전에, 우리는 그것을하기로 결정했습니다 이것은 많은 회의가이 모든 것을 설정하는 것을 의미했습니다

테크니컬 리드 나 매니저로서, 당신은 더 이상 코딩 할 시간이 충분하지 않습니다 기초를 설정하십시오 따라서 Google I / O 2017 이전의 모든 준비가 완료되었습니다 Android Dev 하위 레딧에이 큰 스레드가있었습니다 구글이 결코 Kotlin을 받아들이지 않을 것입니다

물론 우리는 무슨 일이 일어날 지 알고있었습니다 하지만 그 스레드에 회신을 보내는 것은 너무 어려웠습니다 그래, 2 년 전 Steph는 무대에 올랐어 코 틀린 지원 발표 나는 그것이 개발자의 가장 큰 박수라고 생각한다

기조 그것은 훌륭했다 물론, 우리 모두는 JetBrains과 Google 모두에서 알고있었습니다 그건 우리가 많은 일을했다는 것을 의미했다 우리 앞에 Kotlin이 잘 작동했는지 확인하십시오

Android 및 일반적으로 그리고 오늘, 우리는 우리가 지난 2 년 동안해온 일의 하디가 무슨 일이 일어 났는지 얘기 할거야 지난 몇 년 동안 코 틀린에게 그리고 나서 다시 가져 가겠 어 안드로이드 측에서 우리가 한 일에 대해서 이야기하겠습니다

하리 하리 : 고마워 시작하려면 먼저 언급하고 싶습니다 코 틀린 재단 (Kotlin Foundation) Google에서 공식 지원을 발표 한 시점을 기억한다면 몇 년 전에 Kotlin을 위해, 우리는 또한 간략하게 언급했다 우리가 창안 된 기초가 될 것입니다 JetBrains와 Google이 보호, 홍보 및 홍보 언어 Kotlin

재단은 이사회의 통제를받습니다 JetBrains의 두 대표, 두 구글, 및 1 명의 독립적 인 일원 그리고 당신에게 약간의 아이디어를주기 위해서입니다 기초의 범위가 무엇인지, 직업 중 하나 현재 언어 리드 디자이너를 임명하는 것이고, 물론 Andrey Breslav가 있습니다 변화를 막기위한 언어위원회

그리고이 점을 이해하는 것이 매우 중요합니다 범위면에서 제한적입니다 따라서 변경 사항을 깨는 것입니다 Kotlin은 지금도 열려 있기 때문에 계속 개발되고 있으며, GitHub에 우리는 여전히 KEEP을 가지고 있는데 이것은 Kotlin Evolution 개선 프로세스

그러나 언어위원회는 대부분 언어에 일어날 수있는 변화를 깨고 또한 상표 소위원회가 있습니다 그것은 Kotlin의 상표를 보호하는 것입니다 Kotlin을 홍보하고 사용하는 데 도움이되는 커뮤니티와 협력 공정한 방법으로 Kotlin 그리고 당신이 기초에 관하여 더 많은 것을 발견하고 싶은 경우에, 당신은 KotlinLang 웹 사이트에 갈 수 있습니다 세부 정보뿐만 아니라 더 많은 정보를 얻을 수 있습니다

Kotlin과 상표 등을 어떻게 사용할 수 있는지에 관한 정보 그리고 그걸로 데모로 넘어 갑시다 그리고 나는 언어로 당신에게 몇 가지 것을 보여줄 것입니다 이것은 내가 다른 사람의 기계를 사용하고있는 곳이다 이것이 어떻게 진행되는지 봅시다

ID가 맞다고 생각해 예 그래서 저는 언어에 대해 몇 가지 것을 보여 드리겠습니다 아마 가장 근본적이고 가장 중요한 것입니다 우리가 한 짓은 아주 취한 것입니다

오랫동안, 당신이 코 틀린을 쓰는 것에 익숙하다면 응용 프로그램을 사용하면 주된 진입 점이 있습니다 그래서 우리는 실제로 그것을 만들었으므로 매개 변수가 없습니다 그게 전부입니다 고맙습니다 제프리, 네가 원하니? 오

[웃음] 우린 2 년이 걸렸어 아니 그래서 우리는 우리가 가지고있는 작은 것들 중 일부부터 시작할 것입니다 언어 자체로 완성되었습니다 예를 들어, when 문을 사용하면 변수의 값을 캡처해야합니다

그 변수를 검사해야합니다 너는 너의 실제 내부에서만 그것을 사용하고있어 when 문 그래서 우리는 이것을 조금 더 멋지게 만들었습니다 본질적으로 변수를 때 문 자체

따라서 범위 밖에서 참조 할 필요가 없습니다 그리고 이것은 당신에게 당신의 언어로 의미를 부여합니다 사람들은 이것이 실제로 제한되어 있음을 이해합니다 조건부로 하지만 조금 더 얘기하자

우리가 소개 한 멋진 기능들 그것들은 좋지 않았다 나는 우리가 도입 한 더 멋진 기능을 말하고 있습니다 예를 들어 응용 프로그램이 있다고 가정 해 봅시다 클래스를 만들고 싶습니다

그리고 수업을 만들겠습니다 MicroserviceAPI라고 불릴 것입니다 그래서 저는 마이크로 서비스 API의 인스턴스를 만들 수 있습니다 마이크로 서비스 API를 말할 것입니다 우리는 거기에 갈

이제,이 마이크로 서비스가 필요한지는 모르겠습니다 마지막으로 갈거야 단지 유행 일 수 있습니다 그래서 내가하고 싶은 것은 사람들에게 이게이게 친절한 사람들이야 실험적인 기능과 같습니다

우리가 할 수있는 일은 우리가 실제로 할 수있는 것입니다 주석 클래스를 만든다 예를 들어, 이것이 새로운 API라고 말할 수 있습니다 그 주석 클래스에 주석을 달아라 Experimental이라는 다른 클래스와 함께 이제 새로운 실험적 주석을 사용할 수 있습니다

나는 내가 실험적으로 생각하는 어떤 것에도 창조했다 내 API에서 그래서 여기에이 새로운 API를 추가 할 수 있습니다 그리고 내가 그렇게하면, 이것이 빨간색으로 변하고 있음을 알 수 있습니다 그래서 그것은 나에게 컴파일러 오류를주고있다

당신이 이것을 사용할 수 없다는 말입니다 이것은 실험적인 기능이기 때문입니다 그 위에 마우스를 올려 놓으면 실험적이라고 말하는 것입니다 사실, 우리는 그것을 바꿀 수 있습니다 우리는 그것이 오류가 아니라, 실제로 경고로 정의 할 수 있습니다

그래서 여기에 경고가 될 수 있습니다 그리고 지금 막 가고 있습니다 경고로 표시됩니다 그래서 이것을 사용하기 위해서, 개발자 기본적으로이 기능을 선택해야합니다 내가 할 수있는 것은 Alt-Enter입니다

이제는 함수 호출에 새 API를 추가합니다 그래서 내가 어디에서 이것을 사용하는지, 이것은 실험적인 기능이라고합니다 이것은 사람들에게 당신이 지금 생각할 수있는 아이디어를줍니다 실험적이고 비슷한 종류의 API를 만들 수 있습니다 나는 아무것도 보증하지 않을거야

내일 우리가 뭔가를 바꾸고 싶다면 괜찮아 니가 경고 했어 Alt-Enter를 누르십시오 당신이 Alt-Enter를 봤다는 것을 알았습니다 괜찮아

너 자신의 잘못이야 그리고 우리가 실제로이 일을 한 것 중 하나는 우리는이 계약 개념을 도입 했습니까? 따라서 약간의 코드 계약에 익숙하다면, 우리는 이것을 Kotlin의 실험적 기능으로 소개했습니다 게다가 그래서 나는 어떤 함수가 있다고 가정 해 봅시다 예 : printLength

그리고 이것은 nullable 인 문자열을 취할 것이고, 그리고 string이 null이 아닌 경우, 나는 println 길이 할거야 이제이 방법이 효과가 있으며 스마트 캐스트가 완료되었습니다 문자열, null이 아닌 문자열, 내가 이미 그걸 발견했기 때문에 이것이 nullable이 아니라는 것을 알아 냈습니다 그래서 나는이 똑똑한 던지기를 할 수있다 그러나 내가 이것을 취해야한다면, 그리고 널 (null)이 아닌 대신에, 나는 무언가를한다, 아니다, 나는 앞으로 나아가고 창조한다

내 함수, 그래서 내 함수를 만드는 가정 해 봅시다 String이고 notNull 인 경우 부울을 반환합니다 그런 다음 반환 값이 null이 아니라고 말합니다 그 효과가 없다는 것을 알 수 있습니다 컴파일러가 실제로 그것이 not-nullable

컴파일러에게 알려주는 것이 좋을 것입니다 이 기능은 특정 계약을 준수해야합니다 그리고 Kotlin에서 이것을 정의 할 수 있습니다 계약 람다를 사용하여 계약 함수 계약이다 그리고 그것이 수입이라고 말할 수 있습니다

그리고 나는 진정한 의미의 반환을 말할 수 있습니다 이 @ notNull이 null이 아님을 나타냅니다 이제 오류가 발생합니다 무시해 아니, 농담이야

이 오류가 발생하는 이유 이것은 위에서 언급했듯이 실험적인 기능이기 때문입니다 두 가지 방법이 있습니다 첫 번째 것을 보여주었습니다 주석을 추가 할 수있었습니다 그러나 주석을 추가하면 그 주석이 전파되지 않습니다

그래서 뭔가가 그 API를 사용하고 있다면, 또한 주석을 추가해야합니다 전파 주석을 추가 할 수 있습니다 이것,이 형식입니다, 그리고 지금 나는 그렇게하지 않아도됩니다 그 통지를 추가하자마자, 지금 자동으로 다시 null이 허용되지 않는 문자열로 변환됩니다 따라서 실제로 계약을 맺고 함수에 대한 당신의 주장 특정 조건을 충족시킵니다

그리고 그것은 기본적으로 특정 수준의 코드 정확성 실제 코드에서 그럼 우리가 뭘하고 있는거야? 글쎄, 우리는 이것을 직렬화라고 부릅니다 멀티 플랫폼 인 직렬화 라이브러리입니다 JVM, JavaScript, Kotlin / Native, iOS, macOS, 리눅스, 윈도우, 임베디드 나는 태양 아래 모든 것을 언급했다고 생각한다

그리고 이것은 다중 플랫폼 라이브러리입니다 어떤 종류의 반성도 요구하지 않는, 일부 제품의 일부입니다 우리가 언어와 생태계의 일부로하고있는 일 그것 주위 그래서 여기에서는 클래스, 전형적인 데이터 클래스, 그리고이 serializable 어노테이션을 추가했다 이 라이브러리는 Kotlin 직렬화 라이브러리의 일부이며, 그런 다음 고객이 있으며 고객 목록이 있습니다

그래서 저는 println과 같은 것을 할 수 있습니다 그리고 나서 여기에서 나는 Json을 할 것입니다 stringify, Customer, 사용하고 싶은 시리얼 화자를 표시 한 다음 실제 고객을 전달하십시오 그리고 나는 똑같은 일을 고객 명단에서 할 수 있습니다 그래서 여기에 목록을 작성한 다음 고객 목록을 전달할 수 있습니다

그리고 이것을 실행한다면, 기본적으로 무엇을 할 것인가? JSON에서 해당 데이터 클래스로 출력됩니다 우리는 JSON을 지원합니다 Protobuf에 대한 지원이 있습니다 그리고 다른 것들이 작동합니다 그리고 우리는 분명히 그 반대를 할 수 있습니다

예를 들어, 여기에 JSON이 있다고 가정 해보십시오 이제 JSON을 만들어 보겠습니다 그래서 우리는 id가 1과 같을 것이고, 그 다음에 이름이 나와 같습니다 이메일은 you@mecom과 같습니다

나는 너무 독창적이다 이제 println을 할 수 있습니다이 경우, 저는 Json을 할 것입니다 parse, serializer를 다시 통과 시키십시오 그리고 내가 전달하고자하는 실제 JSON

그리고 이것이 할 일은 본질적으로 나에 대한 실제 데이터 클래스 객체 그리고 당신은 그것이 또한 – 나를 위해 데이터 객체를 반대로 만듭니다 내가 뭘 한거지? 이메일, 이름, 이메일 관객 : [INAUDIBLE] 하리 할리 : 필드 소스가 필요합니까? 아니, 그렇지 않아 관객 : [INAUDIBLE] 하리 할리 : 아니

그건 사실 맞아 어쨌든, 그렇게 일하고있었습니다

[웃음] 제프리예요 그는 뭔가를했습니다 제프리 반 고글 : 어 – 허 [박수 갈채] HADI HARIRI : 나는 사람들이 박수를 치기를 정말 좋아합니다 그래서 나는 그곳에서 무슨 일이 일어나고 있는지 모른다

그러나 그것은 라이브 데모에 대한 좋은 점입니다 뭔가 잘못 됐는지 확인하고 싶습니다 나는 사실 그것을 실제로했다 그래서 저는 그것을 운동으로했습니다 나중에 사무실 시간에 나에게 와서 그게 뭐가 잘못 됐는지 말해 줄거야

계속 나아 갑시다 내가 너에게 보여주고 싶은 다음 주석 클래스에 대한 간략한 개요입니다 여기에 지원을위한 몇 가지 추가 사항이 추가되었습니다 열거 형 예를 들어, 주석에 enum을 가질 수 있습니다

중첩 된 주석을 가질 수 있습니다 내 동반자 개체의 일부로 속성을 가질 수 있습니다 다시 말하지만, 이것은 나에게 더 많은 표현력을줍니다 실제 주석을 사용할 때 이제 우리가 작업 해 온 또 다른 것이 있습니다

당신이 들었을지도 모르는 멀티 플랫폼 프로그래밍입니다 그리고 멀티 플랫폼 프로그래밍의 아이디어는, 한 입 가득, 그 아이디어는 바로 지금 Kotlin입니다 다른 유형의 플랫폼을 타겟팅 할 수 있습니다 그래서 JVM을 대상으로 할 수 있습니다 자바 스크립트를 타겟팅 할 수 있습니다

네이티브 등을 타겟팅 할 수 있습니다 이제 이것에 대한 위대한 것들 중 하나 코드를 공유 할 수있는 능력, 왜냐하면 내가 공유하기를 원하는 많은 코드가 있기 때문입니다 권리? 비즈니스 로직, 검증 로직 등이 있습니다 내가 공유를 끝내고 싶다 그러면 우리는 어떻게 이런 일을 할 수 있습니까? 이것이 우리가 멀티 플랫폼의 개념을 도입 한 곳입니다

프로그램 작성 그리고 그 결과로, 당신은 지금 이 다중 플랫폼 프로젝트를 가질 생각이 들었습니다 그래서 당신은 내가 IDE에서이 프로젝트를 가지고 있다는 것을 알 수 있습니다 다른 플랫폼을 타겟팅하고 있습니다 그래서 나는 macOS를 가지고 있고, JVM을 가지고 있으며 JavaScript를 가지고있다

그런 다음 일련의 공통 코드가 있습니다 이것은 보통이라고 불린다 그리고 여기 안에는 몇 가지 코드가 있습니다 그래서 여기에 hello라는이 함수가 있습니다 즉, platform

name에서 인사하는 것입니다 그리고 platformname은 object의 속성입니다 그러나 차이점은이 객체 기대라고하는이 단어가 앞에 있습니다 이것이 말하는 것은 이것이 약간의 코드라는 것입니다

내 공통 코드에서 참조 할 수있는 구현은 실제로 여기에 제공되지 않습니다 구현이 제공 될 것입니다 다른 유형의 플랫폼에서 다른 방식으로, 이는 플랫폼에 따라 다를 수 있기 때문입니다 그래서이 귀여운 것을 볼 수 있습니다 여기 모퉁이에 작은

Alt Enter를 누르면 선언에 들어가라고 말하면서, 어떤 플랫폼 선언을보고 싶은지 묻습니다 따라서 JVM이라고하면 JVM으로 연결됩니다 내가 돌아가서 macOS에서 실제 선언문으로 간다면, 그것은 나를 macOS에 데려 갈 것이다 권리? 그래서 다른 플랫폼에서 다른 구현을 할 수 있습니다 그럼에도 공통 코드에서 해당 코드를 참조 할 수 있습니다

내 공유 코드 기반의 일부로 사용하십시오 그리고 시원한 것은 그렇게 생각해

생각해라 인터페이스와 조금 닮았습니다 그러한 인터페이스의 구현 그리고 멋진 점은 정적 컴파일 시간을 얻는다는 것입니다 확인, 말하자면 그래서 내가 이것을 주석으로 달아서 여기로 돌아 가면, 당신은 그것이 저에게 오류를주는 것을 볼 수 있습니다, 실제 플랫폼 중 하나 구현이 누락되었습니다

이제이 작업을 통해 공통 코드를 공유 할 수있는 다중 플랫폼 프로젝트 기초를두고 특정 구현을 기반으로한다 실제 목표에 약간 다르게 적용됩니다 그리고 그것은 멀티 플랫폼 프로젝트의 일부입니다 우리가 코 틀린과 함께 나아갈 것을 제안하고있다 예를 들어 Android와 공통 코드 기반을 공유하는 Android 애플리케이션, iOS 등

슬라이드로 다시 전환 할 수 있다면 내가 너에게 약간 얘기 할거야 우리가 가져온 다른 것들 Kotlin에게 언어 우리는 더 많은 표준 라이브러리 API를 가지고 있습니다 우리는 여전히 메소드의 API 번호를 유지하고 있습니다 조금 낮추지 만 더 많은 기능을 추가하고 있습니다

그 지역에 부호없는 정수 지원 – 아무도? 아니? 예 [박수 갈채] 나는 누군가를 항상 알고 있기 때문에 그것을 추가했다 그것에 대해 두드림 분명히 우리는 2018 년 패킷 KotlinConf를 발표했습니다

Kotlin 네이티브가 베타를 친다 툴링면에서 우리는 향상된 성능을 제공했습니다 Gradle 프로젝트를위한 고속, 병렬 빌드, KAPT를 사용한 점진적 주석 처리 Google에서 Ivan Garvrilovic에게 큰 소리 치십시오 우리를 돕기 위해

새로운 유형의 추론 엔진 상호 운용성의 많은 경우에, 특히 RX 주변에서 일하는 경우, 뿐만 아니라 언어를 조금 더 빌더를 사용할 때 간결하게, 등등 그리고 우리는이 프로그레시브 모드를 도입했습니다 본질적으로 당신이 코 틀린을 시험해 볼 수있게 해줍니다 새로운 기능을 사용해보십시오 일부 코드를 어기십시오

이제는 할 수있는 깃발입니다 Kotlin과 함께 좀 더 살기 가능하게하다 가장자리에 그리고 그걸로 제프리에게 건네 주겠어 그게 우리가했던 다른 것들을 보여줄거야

특히 안드로이드에서하고 있습니다 JEFFREY VAN GOGH : 고마워, 하디 데모를 잊어 버린 기능이 하나 있다고 생각합니다 HADI HARIRI : 당신이 무슨 말을하는지 전혀 모르겠습니다 JEFFREY VAN GOGH : 괜찮습니다

내 데모에 보여 줄게 HADI HARIRI : 당신이 아마 그것을 망 쳤어 [웃음] 제프리 반 고글 : 좋아 이제 Android 측에서 수행 한 작업을 살펴 ​​보겠습니다 Kotlin을 지원합니다

먼저 OS로 시작합시다 물론 OS는 바이트 코드로 작동합니다 따라서 Kotlin을 지원하기 위해해야 ​​할 일이별로 없습니다 그러나 우리는 정확성을 추가했는지 확인했습니다 성능 테스트를 통해 코 틀린 패턴을 깨지 않게했습니다

우리는 몇 가지 구체적인 성능을 구현했습니다 이러한 테스트를 기반으로 한 최적화, 루프 최적화에 특히 적합합니다 그리고 나서 우리는 OS 측면에서 큰 일을했습니다 디버깅 지원이 향상되었습니다 Kotlin은 몇 가지 구조를 가지고 있습니다

당신이 다른 언어로 가지고 있지 않은 인라인 함수처럼 Android의 새로운 버전 이제 더 나은 디버깅을 지원합니다 그런 다음 안드로이드 프레임 워크, 거기에서 일어나는 일이 많습니다 중요한 것은 API 주석을 추가 한 것입니다 아직 완성되지 않았습니다

그러나 새로운 API는 이제 nullness와 기본 매개 변수를 갖습니다 기본 값 주석이 있으므로 Kotlin에서 온 사람들을 사용할 수 있습니다 기존 API를 통해 작업하고 있습니다 뿐만 아니라 주석을 달 수 있습니다 그런 다음 Kotlin 확장 API를 추가했습니다

그래서 이것들은 여러분이 프로젝트에 다음을 제공하십시오 확장 메소드를 통한 추가 API Kotlin 코드를 더 관용적으로 만드십시오 그런 다음 우리는 전체 묶음에 대해 코 루틴 지원을 추가합니다 Jetpack 라이브러리 [박수 갈채] 따라서 비동기 코드를 작성할 수 있습니다

좀 더 절차적인 방법으로 그리고 물론, 어제 우리는 Jetpack Compose를 발표했습니다 그것은 모두 코 틀린입니다 이제 데모를 살펴 봅시다 좋아요 그래서 여기에 작은 앱을 만들면, 쇼 목록을 다운로드합니다

개조를 사용하여 서버에서 사용할 수 있습니다 그런 다음 로컬 SQL 데이터베이스를 검사합니다 방 API를 사용하여이 쇼들을 봤다 면요 그래서 여기에, 내가 정의한 것을 볼 수 있습니다 API를 사용하여 둘 다 RX 자바를 사용하여 쇼의 목록을 얻을, Kotlin 코딩 비동기 기능을 사용할 수도 있습니다

그리고 API는 거의 동일하다는 것을 알 수 있습니다 같은, 조금 다른 반환 유형 그리고 방 쪽 – 오, 미안 (QUIETLY) 내 코드는 어디에 있습니까? 좋습니다, API는 건너 뜁니다 꽤 많이 있습니다

오, 여기 있습니다 죄송합니다 그래서 당신은 똑같은 것을 봅니다 나는 쇼를 봤어? Java의 RX는 매우 유사합니다 여기 Flowable이 있습니다

[무관심]이 있습니다 따라서 API는 꽤 유사합니다 이제 전화하는 방식을 살펴 보겠습니다 RX와 Java 사이의 코드 – RX와 coroutines 그래서 RX에서는 쇼를 진행하기 위해 많은 운영자를 사용합니다

모든 비동기 호출로 우리의 흐름을 수행하십시오 그리고 이것들은 꽤 복잡해 질 수 있습니다 그리고이 코드는 노란색으로 강조 표시되어 있습니다 그게 내가 아는 뭔가가 있다는 뜻이야 반환 유형으로 수행

따라서 구독 할 때, 당신은 구독을 처리합니다 물론 RX는 Java에 뛰어난 표현력을 제공했습니다 그리고 RX의 발명가들은 똑똑했습니다 그들은 그들이 무엇을 만들고 있는지 알았습니다 그러나 그들은 언어에 의해 제한되었습니다

Kotlin에서 우리는 이제 coroutines를 가지고 있습니다 우리는 실제로 이것을 훨씬 더 멋지게 할 수 있습니다 그래서 코 루틴을 사용하는 동일한 코드가 있습니다 먼저 서버에서 프로그램 목록을 가져옵니다 우리는 이것을 대기 함수라고 부릅니다

신원이 알려줍니다 이봐 요 여기서 비동기적인 일이 일어나고 있습니다 그런 다음 우리는 for for 루프를 사용할 수 있습니다 그리고 그것은 반환 쇼 동안의 [INAUDIBLE]입니다

그리고 우리는 우리의 비동기 내가 로컬 데이터베이스에 쇼를 본 적이 있는지 알아보기 위해 호출하십시오 그리고 거기에서 계속됩니다 그리고 나서, 여기에, 당신은이 발사 호출을 봅니다 이 전화 해 데이터 세트가 변경되었음을 알리는 지 확인하십시오

UI 스레드에서 그리고 여기서 좋은 점은 절차 적으로 보입니다 디버깅을 할 때 – 나는 지금 시작해야한다 물론 작동하지 않습니다 오! 우리는 거기에 갈

이미 실행 중입니다 그래서 내가 실제로 볼 수 있다는 것을 알 수 있습니다 전체 방법으로부터의 변수들에서, 특정 운영자 만이 아닙니다 그래서 인생이 훨씬 쉬워집니다 비동기 코드를 디버깅 할 때 이제 슬라이드로 다시 전환하십시오

다음은 Android Tooling입니다 Android Studio에서 많은 작업을 수행했습니다 Kotlin이 잘 지원되는지 확인하십시오 우리가 한 첫 번째 일은 Kotlin 플러그인이 Android Studio에 포함되어 있음 우리가 그것을 공개하기 전에 우리는 그것을 잘 테스트 할 수 있습니다 JetBrains와 긴밀하게 협력했습니다

그들이 Kotlin 플러그인을 업데이트 할 때마다, 공개하기 전에 테스트를 통해 확실하게 확인합니다 Android Studio와 Kotlin은 잘 작동합니다 다음으로 Android 리팩토링 지원을 추가했습니다 IDE에는 많은 작업이 있습니다 Android 관련 리팩토링입니다

우리는 지원을 추가하기 위해 노력하고 있습니다 코 틀린에있는 모든 사람들에게 린트쪽에는 린트가 거의 있습니다 완전히 다시 작성되었습니다 자바 언어에 대해 [INAUDIBLE] 점검을 작성하는 데 사용되었습니다

이제는 UAST라고 불리는 것을 사용합니다 한 번 같은 린트 체크를 쓸 수 있습니다 그리고 Kotlin과 Java 코드를 모두 분석 할 수 있습니다 제품 템플릿을 추가하여 당신은 새로운 단편이나 새로운 활동을 만들고 있습니다 당신은 Kotlin 코드를 처음부터 가지고 있습니다

당신은 그것을 변환 할 필요가 없습니다 이제 컴파일러 측면에서, 우리의 새로운 Shrinker R8 Kotlin 특정 최적화가 많이있다 그것으로, 당신이 만드는 이익을 얻을 수 있도록 가능한 한 작은 코드 물론 IDE는 이제 Jetpack을 지원합니다 구성된 프레임 워크

문서 및 샘플 사이트에서, developerandroidcom을 보면, 모든 API 참조에는 이제 Kotlin 및 Java 구문이 모두 있습니다 유효한 Kotlin 관련 문서 포털이 있습니다

Kotlin을 시작하는 방법, 사용법을 알려줄 것입니다 호출자 루틴 등 또한 많은 샘플과 스 니펫 이제 Kotlin을 사용할 수 있습니다 양쪽 측면, GitHub 샘플입니다 올해 Google I / O를 살펴볼 수있을뿐만 아니라, Androids의 프레젠테이션 대부분을 볼 수 있습니다

그들의 샘플을 Kotlin에서해라 당신도 볼 수있는 몇 가지 애플 리케이션이 있습니다 Google I / O 앱은 물론이 새로운 Android 해바라기 앱 Kotlin을 사용하여 처음부터 구축되었습니다 우리는 종종 헤이 (hey)를 요청 받는다 너희들이 코 틀린을 추천하고있다

하지만 너 혼자 사용하고 있니? 물론 그것은 매우 공정한 질문입니다 현재 Google에는 많은 사내 개발자 도구가 있습니다 그래서 Kotlin 지원을 추가하는 데는 시간이 걸렸습니다 Google 직원을위한 내부 앱으로 시작했습니다 예를 들어 내부 앱이 있습니다

지도와 사무실 위치를 보여줍니다 그래서 우리는 그 사실로부터 많은 것을 배웠습니다 그 이후로 우리는 실제로 일부 공개 Google Apps에서 Kotlin을 사용하기 시작했습니다 여기에 몇 가지 앱이 있습니다 오늘 Kotlin 코드를 휴대 전화에 보냅니다

그리고 더 많은 것을 기대할 수 있습니다 Kotlin을 채택하는 것에 대해 말하면, 전체 생태계를 살펴보고, 우리는 활발한 개발에서 – 적극적인 개발은 지난 6 개월 동안 Play 스토어에 업로드했습니다 우리는 애플 리케이션의 16 %가 지금 Kotlin을 사용하고있는 것을 본다 그리고 앱이 개발 될 수 있음을 명심하십시오 하나의 버그 수정 또는 하나의 자산 변경이 있기 때문입니다

그래서 16 %는 꽤 인상적입니다 지난 I / O 이후로 5 배나 성장했습니다 그리고 당신이 최고 천개의 앱을 본다면, 그것은 실제로 이미 훨씬 더 커졌습니다 우리가 Kotlin을 사용하여 볼 수있는 애플 리케이션의 44 % 그래서 우리를 코 틀린으로 데려옵니다

어제 발표했습니다 그래서 왜 우리가 왜했는지에 대한 더 많은 개요를 알려 드리고자합니다 그것은 무엇을 의미할까요? 그렇다면 왜 코 틀린을 발표할까요? 우리는 코 틀린을 사용하는 사람들의 강한 입양을보고 있습니다 우리는 지역 사회에 큰 흥분을 안겨줍니다 사람들이 Kotlin을 사용할 때

실제로 사람들이 설문 조사에서 질문을받을 때 그들이 얼마나 Kotlin을 더 행복하게 사용하는지, 실제로 사람들보다 25 % 높은 점수를받습니다 누가 Kotlin을 사용하지 않고있다 업계 전반 및 Google 내부의 많은 앱 지금 Kotlin을 사용 중입니다 우리는 많은 고객에게 다가갔습니다 고객 자문위원회 (Customer Advisory Board)를 포함하여 그리고 Kotlin에 대한 투자에 집중하십시오

그럼 그게 무슨 뜻 이죠? 물론, 우리는 자바 프로그래밍을 계속 지원할 것입니다 많은 측면에서 언어 플랫폼, Android Studio 지원, 보풀, 안드로이드 X와 같은 Docs가 사라지지 않을 것입니다 하지만 다른 노력들을 보면 우리의 온라인 교육, 샘플처럼 우리는 먼저 Kotlin, 그리고 나서 자바 외국어가 최선의 노력이 될 것입니다 그리고 물론, 몇 가지 기능이 있습니다

다중 플랫폼 프로젝트와 Jetpack Compose 그것들은 단지 Kotlin에서 제공 될 것입니다 지금 당연히, 우리가 사람들에게서 들리는 다음 질문은, 그게 내가 전환해야한다는 뜻인가? 제발 Kotlin을 먼저 가져 가지 마세요 모든 Java 코드를 가져 와서 Kotlin에서 다시 작성해야합니다 그건 우리가 네가하고 싶지 않은거야 Android Studio를 확인하십시오

그것은 많은 수십만 줄의 코드입니다 지금은 Android Studio의 약 10 % Kotlin입니다 특정 코드 그리고 우리가하는 일은 새로운 기능 만 사용한다는 것입니다 코 틀린에 써라

그리고 그것은 Kotlin 자바와 좋은 상호 운용성을 가지고있다 Kotlin에서 단일 클래스를 작성할 수 있습니다 나머지는 Java로 유지하십시오 또는 Kotlin에서 코드의 99 % Java에서 남은 부분 만 남았습니다 물론, 당신의 현재 상태는 중요합니다

프로젝트 및 팀의 당신이 당신의 방출을 발송하는 것으로부터 1 주일 떨어져 있다면, 아마도 Kotlin으로 전환하기에 가장 좋은시기는 아닙니다 그러나 새로운 개발주기를 시작한다면, 니가 코 틀린을 데려 갈 수있을거야 물론 팀에 따라 다릅니다 그들은 Kotlin에 관심이 있습니까? 이것들을 안전하게 지니고 있습니까? 우리는 또한 많은 사람들이 실제로 모집에서 언급 한 Kotlin을 사용합니다 그들은 더 많은 후보자를 얻을 수 있습니다

고려해야 할 사항 물론, 기술적 측면에서, 고려해야 할 트레이드 오프가 있습니다 Kotlin은 뛰어난 기능, 더 많은 생산성, 그리고 만족 그러나 당신은 학습 곡선에 대해 생각해야합니다 사람들이 배우는 데는 시간이 걸립니다 관용적 인 코 틀린을 쓰기

우리는 Kotlin을 쓰는 대부분의 사람들이 첫번째 주, 그들은 정말로 Kotlin에 자바를 쓰고있다 그리고 3 개월에서 6 개월이 걸립니다 실제로 관용적 인 코 틀린을 쓰기 시작합니다 괜찮아 내 말은, 당신은 여전히 ​​코 틀린의 모든 이익을 얻습니다

nullness, et cetera에 대해 경고합니다 그럼 빌드 속도가 있습니다 Kotlin은 Java 컴파일러보다 느립니다 그것은 당신을 위해 더 많은 일을하고 있습니다 그리고 그것은 더 어린 컴파일러입니다

우리는 그것을 더 빨리 만들기 위해 열심히 노력하고 있습니다 그리고 물론, 유의하십시오 예, 느립니다 하지만 앱을 만들면 빌드가 줄어들 수 밖에 없습니다 가능성이 가장 높습니다

APK 크기도 있습니다 응용 프로그램은 표준 라이브러리를 사용하며, 약간의 공간이 필요합니다 그러나 R8과 같은 것들은 그것을 줄일 수 있습니다 진행중인 Kotlin 작업은 Google에서 계속 진행되고 있습니다 물론, Jetpack Compose가 가장 큰 것입니다

항상 새로운 KDX API를 계속 추가하고 있습니다 컴파일러 쪽에서 우리는 많은 작업을하고 있습니다 빨리하기 Kotlin 10330과 마찬가지로 증분 처리기 그리고 훨씬 더 많은 것이 있습니다

더 향상된 도구 및 더 많은 문서와 샘플을 볼 수 있습니다 Kotlin을 사용합니다 Kotlin 사용에 관심이 있다면, 하지만 어디서부터 시작해야할지 모르겠다 우리는 Kotlin Everywhere를 발표하고 있습니다 두 Google이 주최하는 일련의 교육입니다

및 JetBrains 그리고 지금과 KotlinConf 사이에서 일어나고 있습니다 올해 말 12 월 그것에 관심이 있다면, 참여하거나이 사이트를 호스팅하는 것을 돕고,이 링크로 이동하십시오 가입하십시오

따라서 새로운 Kotlin 첫 번째 로드맵을 통해, 안드로이드 용 Kotlin에 대한 투자 단지 더 커질 것입니다 아직 코 틀린을 사용해 보지 않은 여러분 모두를 초대하고 싶습니다 최근에 그것을 사용하지 않았거나 오늘 앱에서 사용해보십시오 Kotlin과 비슷한 경험을 해 주셨으면합니다 좀 더 예측적이고 코딩이 더 재미있을 것입니다

고맙습니다 [음악 재생]

Android Q beta 2, Cloud Healthcare API beta, & ML Kit for Natural Language Processing

토드 케펠 만 : 안녕 저는 Developer Show의 Todd Kerpelman입니다

가장 멋진 개발자의 주간 업데이트입니다 Google의 뉴스 안드로이드 Q 베타 2 – 헤이, 그 운은 – 지금 갱신 된 SDK 이 릴리스에는 개인 정보 보호 기능이 포함되어 있습니다 테스트 및 피드백, 새로운 방법 거품, foldables 에뮬레이터 등으로 멀티 태스킹을 할 수 있습니다

자세한 내용과 스크린 샷을 보려면, 게시물을 봐 Lustre 오픈 소스 병렬 파일 시스템 많은 양의 데이터에 액세스 할 수 있습니다 매우 빠른 속도와 낮은 대기 시간 그러나 그것을 구성하는 것은 기술적으로 도전적이고 시간 소모적 인 작업입니다 그래서 우리는 배포하기 쉬운 스크립트를 발표했습니다

Lustre 스토리지 클러스터 – 오, 그것도 운율이 – Google Cloud Deployment를 사용하는 Google Compute Engine에서 매니저 시작하려면 게시물로 넘어갑니다 Cloud Healthcare API는 관리 솔루션을 제공합니다 Google 클라우드에서 의료 데이터를 저장하고 액세스하는 방법 플랫폼, 기존 치료 간 중요한 연결 고리 제공 Google Cloud에서 호스팅되는 시스템 및 응용 프로그램 이제 베타 버전으로 제공됩니다 시작하려면 링크가 게시물에 있습니다

최적의 VM 및 메모리 최적화 된 VM 계산 Google Compute Engine에서 사용할 수 있습니다 두 제품 모두 2 세대 Intel Xeon 확장 가능한 프로세서 게시물에 일찍 접속할 수있는 링크가 있습니다 언어 식별 및 스마트 회신 이제 ML Kit에 사용할 수 있습니다 예제 코드와 문서 링크 당신은 그것을 추측했습니다

좋아요, 구독하고 공유하는 것을 잊지 마십시오 Todd Kerpelman이 "개발자 쇼"입니다 보고 주셔서 감사 드리며 다음 주에 다시 보겠습니다 하, 나는 무언가를 얻은 것처럼 미소 지을거야 나는 흥분한다

안드로이드 코딩 습관 #2 – 안드로이드 UI를 쉽게 구성해볼까요!

UI는 종이에 사진을 올리고 글을 쓰듯이 만든다는 거죠 안녕하세요 코딩 습관의 코딩 메이트 디모 입니다 지난 시간에 저희는 주소록을 만들기 위해 어떤 화면이 필요한지 생각해 봤습니다 이번 시간에는 이 화면들을 구성 해 볼텐데요 이런 화면 구성을 뭐라고 부를까요 바로 UI 라고 부릅니다 많이 들어는 보셨을 텐데 정확히 아시나요 UI 란 유저 인터페이스, 즉 사용자가 프로그램과 의사소통 하기 위한 매개체입니다 쉽게 말해 컴퓨터에게 사람의 말과 행동으로 입출력하게 해준다는 말입니다 그럼 본격적으로 UI 들을 구성해 보겠습니다 먼저 상세화면 부터 구성 해볼까요 주요기능은 한 사람의 입력된 정보를 모두 보여주는 화면입니다 구성 요소로 이름, 사진, 전화번호, 이메일, 인스타그램, 메모 정도를 사용 하도록 하죠 여기서 잠깐! 그런데 대체 UI는 어떻게 만드는 걸까요? 안드로이드는 각각의 UI 를 모듈 형태로 제공하고 있습니다

프로그램으로 끼워 맞추고 조작하면 됩니다 쉽게 말하면 종이에 사진을 올리고 를 쓰듯이 안된다는 거죠 여기서 빈 종이에 역할을 하는 것을 레이아웃이라고 합니다 내부에 여러 요소를 놓을 수 있죠 레이아웃에 놓을 요소들은 뷰가 담당합니다 안드로이드는 여러가지 형태의 뷰를 구현하여 제공하고 있습니다 그럼 다시 상세화면 구성으로 돌아와 봅시다 레이아웃의 프로필 사진, 별칭과 이름, 전 화번호, 인스타그램, 이메일, 메모 순으로 뷰를 놓아 보죠

왜 이렇게 배치 했을까요 UI은 사람이 인지하는 순서대로 중요한 요소를 배치해야 합니다 읽어야 하는 요소들은 책을 읽을 때처럼 좌측 상단에서 우측 하단 순으로 배치하는 것이 편합니다 그럼 방금 상세 화면을 구성하는 데는 어떤 뷰들이 사용된 지 알아볼까요 이미지 파일을 표시하는 ImageView, 그리고 글자를 표시하는 TextView를 사용했습니다 다음은 입력화면을 구성해 봅시다 입력하면 은 상세 화면에서 각 항목을 입력으로 바꿔주면 됩니다 한번 바꿔 볼까요 프로필 사진, 별칭과 이름, 전화번호, 인스타그램, 이메일, 메모까지 입력 창 으로 변경합니다

사진 위치에 대체될 카메라 아이콘은 사진을 선택하는 버튼으로 사용할 겁니다 입력 화면에서 글자를 입력하기 위한 뷰가 추가된 것을 보셨죠 글자를 입력하는 뷰를 EditText 라고 합니다 마지막은 목록 화면을 구성 해야겠죠 목록화면은 결과부터 확인해 볼까요 앞서 입력했던 내용을 명함 형태로 만들어서 레이아웃에 차례로 배치해봅니다 참쉽죠 앞서 종이 역할을 레이아웃이 한다고 설명 드렸죠 여기서 사용되는 레이아웃은 앞선 두 화면 과는 다릅니다 그건 바로 동일한 형태의 레이아웃을 목록 형태로 여러개 늘어놓는 점입니다 앞선 두 화면처럼 자유롭게 배치하는 경우에는 RelativeLayout을 목록화면처럼 반복적으로 뷰을 배치하는 경우에는 RecyclerView를 사용합니다 그럼 처음부터 다시 목록 화면을 만들어 볼까요

먼저 명함역할의 빈 RelativeLayout을 준비합니다 사진 이름 전화번호 인스타그램 이메일 정도로 요약하면 되겠죠 다음은 RecyclerView에 명함을 차례로 배치 해봅시다 이렇게 입력화면, 상세화면, 목록화면이 모두 완성되었습니다 오늘의 키포인트는 3가지! 종이의 역할을 하는 것은 Layout 요소의 역할을 하는 것은 View 라고 한다는 점

레이아웃에 뷰를 마음대로 배치하고 싶을때는 RelativeLayout 반복적으로 배치하고 싶을 때는 RecyclerView를 사용한다는 점 그리고 오늘 사용한 뷰는 ImageView, TextView, EditText가 있었다는 점을 기억하세요 다음 시간에는 pc에 안드로이드 를 개발하는 개발 도구를 설치하는 방법을 같이 알아보도록 하겠습니다 구독과 좋아요 부탁드릴게요

GOTO 2016 • Exploring RxJava 2 for Android • Jake Wharton

(음악) 좋아요, 일단 시작하기에 앞서서 이 질문을 던져보죠, 얼마나 많은 사람들이 RxJava이 무엇인지 대해 알고 있을까요? 또, 얼마나 많은 사람들이 그들의 앱에 RxJava를 적용하고 있을까요? 좋아요 Android에서 왜 reactive 가 중요해지고 있는지에 대해 얘기하면서 시작해보려고 합니다

그리고 왜 reactive적으로 생각하는 것이 중요한지에 대해서 얘기할 것이고, 그리고 나서 RxJava에 대해 본격적으로 얘기해볼거에요 또, RxJava가 어떻게 우리들의 앱에 도움이 되는지 알아보도록 하죠 한달 내로 출시될 예정인 RxJava 2를 적용한 명확한 예제들을 좀 보여드릴거에요 좋아요, 일단 왜 갑자기 Reactive라는 것이 화두가 되고 있을까요? 아마도 여러분은 사람들이 Reactive에 대해 말하는 것을 들은 적이 있거나, 혹은 실제로 적용하는 사람도 본적이 있을 것입니다 일단, 여러분들은 앱을 개발할 때 전체 시스템을 동기적으로 모델링하지 않는 한, 그저 단 하나의 비동기 코드 때문에 우리가 흔히 사용하는 전통적인 명령형 스타일 프로그래밍의 장점들이 완전히 부숴져버리는 것을 경험한 적이 있을 것입니다

부숴져버린다는 의미는, 앱이 동작하지 않게 된다는 의미는 아니고 시스템이 복잡해질 수 있다는 의미입니다 이렇게 되면, 명령형 프로그래밍의 좋은 장점들을 잃어버리게 됩니다 제가 생각하기에 이게 왜 정말 큰 문제가 될 수 있는지를 예제를 통해 보여드릴게요 사용자의 정보를 취해 User 객체를 반환하는 간단한 클래스로 시작해보죠 우리가 살고 있는 동기적인 세계 즉, 단일 스레드의 세상에서는 이 코드는 모든 것이 잘 작동합니다

우리가 기대한 대로 잘 작동할 겁니다 인스턴스를 만들고, 유저를 출력하고, 일부 프로퍼티를 변경하고, 다시 유저를 출력하고 우리가 기대했던 대로 잘 작동하죠 문제가 되는 부분은 비동기적인 방법으로 모델링할 때입니다 우리는 이 프로퍼티들을 변경할 때마다 프로퍼티의 변경사항을 서버에 반영할 필요가 있습니다 이제 여기 보이는 아래의 두 메소드는 비동기적일 필요가 있겠죠

이제 변경사항을 서버에 반영하려면, 어떻게 코드를 고쳐야 할까요? 이 상태에서 할 수 있는 것은 아무것도 없습니다 대부분의 사람들은 기본적으로 비동기 호출을 통해 서버에 정상적으로 변경사항을 반영하고 나면, 변경사항을 로컬하게(locally*) 만들 수 있을 것이라고 가정하곤 합니다 그리고 User 객체를 출력할 때에는 변경사항은 이미 즉각적으로 서버에 반영된 상태라고 생각하는 것이죠 물론, 이건 별로 좋은 생각이 아닙니다 네트워크라는 것은 신뢰할 수 없는데다가, 서버쪽에서는 에러를 반환할 수도 있습니다

그리고 지금 여러분은 User의 상태를 로컬하게 처리해야 하는 상황입니다 우리가 생각해볼 수 있는 한가지 방법은, 비동기 호출이 정상적으로 호출될 때마다 호출되는 Runnable 객체를 도입하는 것입니다 그리고 이제 우리는 보다 reactive적이게 되었습니다 데이터를 변경하면, 출력된 User의 정보를 통해 정상적으로 데이터가 변경되었음을 알 수 있게 되었습니다 하지만, 우리는 예기치않게 발생할 수 있는 문제들은 고려하지 않은 상태입니다

네트워크 연결이 실패한다거나 그런것 말이죠 따라서, 리스너를 도입할 수 있을 것입니다 에러가 발생하면 그에 따라 에러 처리를 할 수 있게 되었습니다 사용자에게 알려줄 수 있을 것이고, 다시 네트워크에 연결 시도를 할 수도 있겠죠 이 방식은 동작하는 데다가, 보통 대부분의 사람들이 비동기 코드를 안드로이드의 메인스레드인 단일 스레드에 동기적인 코드와 섞어 쓰는 방식이기도 합니다

그러나 생각해볼 수 있는 문제는 리스너에서 무언가 더 추가적으로 해야할 때, 예를 들어 User의 상태를 더 변경하는 등 추가적인 작업을 해야할 때입니다 앱의 입력 폼을 채울 여러 프로퍼티들이 있거나 또는 비동기 호출이 연계적으로 호출될 때가 있습니다(역: 콜백지옥*) 이 경우, 첫번째 콜백이 성공하면, 반드시 두번째 비동기 호출을 하게 되어 있습니다 두번째 호출은 성공 또는 실패일 수 있겠죠 여기서, 여러분은 현재 안드로이드 컨텍스트 내에 있음을 기억해야합니다

따라서 여러 추가적인 고려사항이 남아 있습니다 이 예제에서는 첫번째 콜백이 성공하면, 직접 UI에 대고 변경사항을 반영하고 있습니다 하지만, 아 죄송합니다 여기서 문제점은, 안드로이드의 액티비티는 언제라도 사라질 수 있다는 것입니다 앱이 강제종료됬거나, 전화를 받았거나 사용자가 홈버튼을 눌렀거나, 뒤로가기 버튼을 눌렀거나 그래서 만약 비동기 호출이 UI가 이미 소멸된 후에야 리턴하게 된다면, 다시 문제가 발생합니다 이 문제를 명령적인 방법으로 해결해보죠 뷰를 변경시키기 전에 상태를 검사해보는 것이죠, 나쁘지 않아 보입니다

우리는 또한 익명 타입 객체를 만들고 있는데, 이것은 결국 어느정도 짧은 메모리 누수를 일으킵니다 액티비티에 대한 참조를 보유하고 있기 때문에 액티비티가 사라졌을 때에도 백그라운드에서는 여전히 비동기 호출이 일어나는 것입니다 왜 이것이 정말 큰 문제인지 궁금하시면, 오늘 나중에 Pierre가 이 메모리 릭에 대해서 다룰 것입니다 가서 들어보실 것을 추천해드립니다 마지막으로 우리가 아직 다루지 않은 것은 이 콜백이 어떤 스레드에서 동작하냐 하는 것입니다

백그라운드 스레드로 돌아왔을 때, 명령적인 코드를 작성해야하는 것이 이제 우리가 해야할 일입니다 스레드로부터 메인스레드로 넘어가는 코드를 작성하는 것이죠 정말이지 어지러운 액티비티가 되었습니다 코드의 의도와는 정말 무관하게도 굉장히 부가적인 코드가 많이 있습니다 우리는 비동기 작업을 하는 간단한 코드와 그 비동기 결과를 핸들링하는 작업으로 시작했습니다

그저 비동기 호출을 하기 위해서 이 코드는 온갖 설정들로 가득차있습니다 우리는 단지 비동기 호출을 위해서, 폼, 버튼 등을 핸들링하고 싶지는 않았습니다 (역 :폼을 disable해둔다거나) 그러나 여기서 고작 이 작업을 위해 만들어진 코드를 보세요 그리고 실제 배포될 앱을 생각해보시면, 모든 이런 문제들은 더욱 복잡해질 것이고, 액티비티에서는 굉장히 많은 상태값들을 관리하고 검사해야할 것입니다 이 그림이 왜 리액티브적으로 생각해야하는 지를 보여줍니다

왜냐하면 여기의 모든 것은 근본적으로 어떤 방식으로든 비동기이기 때문입니다 네트워크가 있고, 우리는 요청을 보냅니다 그리고 충분히 많은 시간이 지나야 누군가의 응답이 도착합니다 이러한 이유로 메인 스레드를 블럭시켜버릴 수는 없습니다 그래서 이 과정은 백그라운드 스레드에서 일어나야 합니다

마찬가지로 파일 시스템도 그렇고, 스토리지에 값을 쓰기 위해 데이터베이스 또한 그렇고 심지어 SharedPreferences도 그렇습니다 우리는 메인스레드를 블럭시킬 수는 없기 때문에 이 작업들을 백그라운드 스레드에서 해야 합니다 "사용자" 자체 또한 비동기적입니다 우리는 UI에 데이타를 밀어 넣어 사용자에 보여주고, 사용자들은 버튼을 클릭해 그에 반응합니다 또는 텍스트 필드에 값을 변경하는 등 이러한 것들이 비동기적으로 일어납니다

사용자로부터 데이터를 빼내오는 것이 아니라 사용자가 데이터를 제공하기까지 기다리는 것이죠 이 그림은 근본적인 "UI"에 대해 생각해보게 합니다 많은 사람들은 메인 스레드인 단일 스레드만으로 모든 것을 할 수 있다고 생각하곤 합니다 하지만 실제로 UI 또한 비동기적으로 취급되어야 합니다 심지어 데이터 컴포넌트나 네트워크 컴포넌트를 가지고 있지 않을지라도, 사용자 자체는 비동기적입니다

우리는 사용자들의 입력에 대해 적절한 방식으로 반응해야 합니다 이 예제는 앱 전반에서 사용되는 데이터들이 실제로는 전혀 동기적으로 발생되지 않음을 보여줍니다 이러한 것들은 네트워크, 디스크, 사용자가 클릭버튼을 누르는 시간에 따라 발생됩니다 데이터들은 각기 다른 시간에 발생되어 앱 전반을 돌아다닙니다 그리고 앱은 반드시 그 데이터들을 받아들이고 적절하게 반응해야 하죠

따라서, 메인스레드를 블럭시키거나 또는 데이터가 비동기적으로 온다는 사실을 인지하지 못하고 작업하게 되면 앱은 데이터를 제대로 반영하지 못하거나 크래시를 일으킵니다 이 그림은, 우리의 코드가 이 모든 것들을 관리해야할 책임이 있음을 보여줍니다 하지만 그 책임을 위한 작업은 무척 복잡합니다 우리는 이 모든 상태를 액티비티, 프래그먼트 등에 갖고 있어야할 뿐만 아니라, 여러 데이터들이 비동기적으로 발생된다는 것을 감안하는 동시에 각각이 데이터를 생산하고 소비해가는 시간이 서로 다름도 인지하고 있어야 합니다 방금 전 그림은 안드로이드 자체는 고려하지 않았습니다만 안드로이드도 근본적으로 비동기적 플랫폼입니다

푸시 알림도 비동기적이며 시스템 도처에 브로드캐스트들도 그러하며 심지어 설정 변경 또한 그렇습니다, 사용자는 안드로이드 장치를 언제라도 회전시킬 수 있습니다 여러분의 코드가 "모든것은 비동기적이다"라는 사실을 인지하지 못한다면 앱이 크래쉬(crash)되거나, 앱이 오동작하기 시작하면서 일부 상태들이 앱을 완전히 멈추는 상황도 일어날 수 있습니다 다시 요점으로 돌아가보도록 하죠 이제는 하나의 비동기 소스가 결국에는 명령형 프로그래밍을 부숴버린다고 이야기할 수 있습니다 네트워크 요청을 가지고 있지 않은 앱은 찾기 어렵습니다

앱은 네트워크 요청들을 가지고 있으며 그 말은 즉슨, 안드로이드가 근본적으로 비동기적이라는 것입니다 디스크를 가지고 있으며 데이터베이스를 가지며, UI 또한 비동기적인 것이라고 간주되어야 합니다 그래서 기본적으로 안드로이드의 모든 것은 이미 비동기적입니다 따라서, 전통적인 명령형 프로그래밍과 여러 상태 관리 테크닉을 계속해서 추구하는 것은 여러분 자신을 힘들게 만들 겁니다 우리가 해야할 것은, 우리의 코드가 중간에 위치해 "상태"를 주재하며 비동기적인 모든 것들을 조정해야 함을 보여주는 이 모델 대신 비동기적인 것들을 직접 엮어야 하는 이 책임에서 벗어나는 방법을 택해야한다는 것입니다

그러면, UI가 직접 데이터베이스를 구독하도록 만들 수 있습니다 그리고 데이터베이스의 변경에 반응할 수도 있겠죠 데이터베이스의 데이터 변경과 네트워크 호출이 그저 사용자의 버튼 클릭에 반응하여 일어나도록 할 수 있습니다 유사하게, 네트워크 응답도 그렇습니다 데이터가 정상적으로 업데이트 되었다면, 데이터가 업데이트되었음을 알고 UI는 자동적으로 자신을 업데이트했으면 합니다

그래야 우리는 앞서 언급한 책임들을 제거하게 됩니다 장치가 회전하고, 브로드 캐스트를 보내는 등의 안드로이드 자체가 비동기적으로 뭔가를 한다면, UI는 자동적으로 반영하며, 백그라운드 잡은 시작 또는 중지되는 등 자동적으로 반응하게 될 수 있으면 좋을 것 같습니다 이렇게 되면, 우리는 어떤 상태들을 보유하기 위해 작성했던 많은 코드들을 제거할 수 있게 됩니다 우리는 여전히 코드를 작성하고 있으며 우리가 해야할 전부는 그저 각각의 비동기적인 것들을 합리적인 방식으로 연결하는 것 뿐입니다 그것들을 위한 상태 관리를 위해 애쓰지 않으며, 그저 이벤트를 발생하거나 소비하는 방식으로요

이제, RxJava에 대해 얘기해보겠습니다 이것은 사실상 안드로이드를 위한 리액티브 라이브러리가 되었는데 포괄적으로 자바에서도 이용가능했기 때문입니다 그리고 RxJava2도 마찬가지인데 왜냐하면 안드로이드에서 필요한 자바의 구버전을 지원하고 있기 때문입니다 (역: RxJava는 Java6 이상을 지원하고, 안드로이드는 Java7 까지 지원한다) RxJava는 세가지 중요한 것들을 제공합니다

첫번째로, 데이터의 소스들을 표현하는 타입들의 집합입니다 두번째로, 그 데이터를 구독해서 변경을 리스닝하는 타입들 집합입니다 마지막으로 가장 중요한 것은, 그 데이터들을 병합하고, 구성하고, 변형하는 메소드들인데 그 메소드들은, 서로 다른 데이터 소스들 사이를 연결하는 링크를 만들어서 구독해서 보여주기 원하는 최종 형태로 만들어줍니다 자, 이제 API는 어떤 모습인지 살펴보도록 하죠 데이터의 소스들은 자신이 구독되었을 때에 어떤 작업을 시작하거나 중지합니다

소스는 응답을 리스닝하기 전까지는 시작(fire)되지 않는 네트워크 요청처럼 생각하시면 됩니다 그리고 만약 데이터의 소스가 완료되기 전에 구독 해지되었다면, 네트워크 요청을 취소하는 등의 작업을 할 수 있습니다 소스는 동기적이거나 비동기적이 될 수도 있습니다 그래서 블럭킹되지만 백그라운드 스레드에서 동작하는 네트워크 요청같은 것을 모델링할 수도 있을 것입니다 또는 비동기적이 될 수 있는데 예를 들어, 안드로이드(API*)를 호출해서 액티비티에서 그 결과를 받아볼 수 있습니다

또는 UI에서 일어난 클릭 또한 비동기로 간주될 수 있습니다 여러분은 클릭을 기다리면서 블럭킹되지 않고 그저 클릭이 발생되었다는 사실에만 반응하면 됩니다 보통 단일 아이템을 생산할 수 있지만 많은 아이템들을 생산할 수도 있습니다 단일 요청에서 네트워크 응답은 하나의 아이템과 같지만, 버튼 클릭의 스트림 같은 경우에는 UI가 존재하는 한 무한할 수 있습니다 비록 단일 버튼을 구독했지만 말이에요

또한 아이템이 없을 수도 있습니다 예를 들어 오직 성공이냐 실패냐가 중요해서 실제로 아무런 아이템을 갖지 않는 경우 말이죠 즉, 데이터베이스나 파일 시스템에 값을 쓰는 경우를 생각해볼 수 있겠죠 실제로 아무런 응답이 필요 없습니다 아무런 아이템을 갖지 않고도 결과를 반환해줄 수 있습니다

그 결과는 성공이냐 실패냐를 나타낼 것입니다 성공이냐 실패냐에 대한 관점은 실제로 RxJava에 종료 이벤트라 부르는 것과 함께 데이터 소스에 모델링되어 있습니다 그 소스는 성공적으로 완료하거나 에러를 나타내고 종료될 수 있습니다 메소드가 정상적으로 리턴하거나 예외를 내며 리턴하는 경우를 떠올리시면 됩니다 전혀 종료되지 않을 수도 있습니다

다시 버튼 클릭 예제로 돌아가 생각하면, 버튼 클릭을 데이터의 소스로서 모델링해봅시다 UI가 사라지기 전까지는 전혀 끝나지 않는 버튼 클릭말이죠 UI가 사라졌을 때에는 여러분은 그 버튼클릭 소스로부터 구독을 해지할텐데 그럼 소스는 실제로 완료되지 않게 됩니다 실제로, 이 모든 부분들이 전통적인 옵저버 패턴의 구현이라고 볼 수 있습니다 우리는 데이터를 생산하는 생산자를 가지고 있으며, 우리는 데이터가 어떤 모습을 지니는 지 알고 있는 상태에서 생산자를 관찰하기 원합니다

따라서 우리는 생산자에 리스너를 등록합니다 그리고 생산자가 데이터를 생산하면 우리는 통지받습니다 소스를 나타내는 두 개의 주요 타입이 RxJava2에서는 Observable과 Flowable입니다 사실, 두 소스는 같은 종류의 데이터를 모델링합니다 소스는 0 나 N개의 아이템이 될 수 있으며 비어있을 수도 있고 물론 1개의 아이템이 될 수도 있습니다

물론 그보다 많을 수도 있습니다 그리고 성공적으로 종료할 수도 있고 에러가 발생해 종료할 수도 있습니다 왜 이 두 가지 타입이 같은 구조의 데이터를 나타내야 할까요? 여기서 너무 깊게 가고 싶지는 않지만, 배압(backpressure)이라는 것에 대해 얘기해봐야 합니다 복잡한 주제이기 때문에 배압이 무엇인지에 대해 차이점을 보여드리는 예제로 설명하겠습니다 배압은, 데이터 소스의 속도를 늦추도록 하는 것을 말합니다

여러분도 알겠지만, 우리는 제한된 자원을 갖는 시스템 하에 살고 있기 때문에 충분한 시간을 두고서 어떤 처리를 수행합니다 배압은 기본적으로 데이터를 보내는 쪽에게 너가 보내는 데이터가 너무 빨라서 더 이상 처리할 수 없으니 천천히 보내라고 얘기하는 것이라고 생각하면 됩니다 RxJava1은 배압을 갖고 있었지만 API 프로세스를 따르다보니 그 구현은 늦게 만들어졌습니다 그리고 시스템의 모든 타입은 배압을 갖고 있었습니다 대신에 RxJava2 에서는 두 가지 타입을 가집니다

이렇게 된 배경에는 당시에는 모든 타입이 배압을 갖고 있는 것처럼 보였기 때문에 모든 소스들이 실제로 배압을 구현한 것은 아니었음에도 배압이 가능할 것이라는 생각이 깔려있었기 때문이었습니다 그래서 결국 앱은 런타임에 크래쉬될 수밖에 없었습니다 배압은 미리 시간을 투자하여 상속처럼 실제로 설계가 되어야 하는 것이지, 나중으로 미뤄두었다가 믹스인될 수 있는 그런 것이 아니기 때문입니다 그래서 왜 RxJava2에서는 두가지 타입을 가져야하는 지 설명드리겠습니다 사용자는 타입 시스템을 통해서 배압이 지원되는지 아닌지 알 수 있어야 합니다

즉, 배압이 지원되지 않는다는 그 사실 자체는 그렇다 치더라도 사용자가 "API를 통해" 배압이 지원되지 않는다는 그 사실을 알 수 있도록 해야 합니다 이에 대해 예제를 하나 들어보자면, 터치이벤트와 같은 데이터 소스가 있다고 해봅시다 사용자는 손가락을 스크린에 대고 드래그할 것입니다 그리고 터치이벤트들을 발생시킵니다 여기서, 터치이벤트는 우리가 배압으로 속도를 제어할 수 있는 것이 아닙니다

실제로 사용자를 제어할 수는 없습니다 "곡선을 절반 정도로 그리고 내가 다 캐치할 때까지 기다려" "그리고나서 계속해서 나머지 커브를 그려" 이렇게 사용자를 제어할 수는 없습니다 하지만 다른 방식으로는 가능합니다 버튼을 클릭하지 못하도록 하거나 일단 다른 UI를 띄워서 데이터의 속도를 늦추는 것등입니다 그러나 데이터의 소스 자체는 그 데이터를 늦출 수 있는 대상은 아닌겁니다

여러 이벤트를 발생시키며 그려진 곡선이 이미 존재한다면, 시스템에게 그 데이터를 보내는 속도를 늦추라고 할 수는 없는 것이죠 데이터베이스를 예로 들어보겠습니다 우리는 많은 양의 데이터 결과 집합을 가지고 있고 우리는 한 순간에 특정 몇 행들만 가져오길 원합니다 "나는 첫 4개의 행만 원해" "알겠어" "이제 3개의 행을 더 줘" "알겠어" "이제 5개의 행을 더 줘" 데이터베이스는 이를 실제로 잘 모델링합니다 왜냐하면 커서라는 개념을 가지고 있기 때문입니다

하지만 터치 이벤트들의 스트림은 이를 전혀 모델링하지 못합니다 왜냐하면 이벤트를 미루거나 사용자의 손가락을 늦출 수는 없기 때문입니다 RxJava1에서는 두 가지 타입이 모두 Observable로 구현되었습니다 그래서 아마도 런타임에 배압을 적용해보려고 하다가 결국에는 예외발생으로 인해 앱이 크래쉬된 적이 있을 겁니다 그래서 RxJava2에서는 두가지타입으로 이를 모델링했습니다

하나는 배압을 지원하고 다른 하나는 그렇지 않죠 기본적으로 배압이 어떻게 동작할 지에 대한 전략을 적용하는 방법으로 이 두 가지를 서로 변환하는 방법들이 있습니다 하지만 여기서는 그 얘기를 하지는 않을겁니다 이들은 두 가지 서로 다른 타입이기 때문에 어떤 방법으로든 배압을 지원함을 드러내야합니다 하지만 이들은 모두 같은 종류의 데이터를 모델링하기 때문에 이들은 데이터가 어떻게 콜백에 푸시될 지에 관한 방법을 가지고 있어야 합니다

두 인터페이스는 소스로부터 이벤트를 듣는데 꽤 유사해보입니다 첫 번째 메소드는 onNext입니다 그리고 이것은 아이템을 전달받는 메소드이며 Observable 또는 Flowable에 의해 생산되는 아이템이 남아있는 한 이 메소드는 각각의 아이템이 적절하게 처리될 수 있도록 하기위해 매번 호출될 것입니다 이것은 또한 무한하게 호출될 수 있습니다 버튼 클릭과 같은 무한 Observable을 얘기했었습니다

만약 여러분들이 버튼 클릭을 구독한다면 이 메소드는 기본적으로 클릭이 일어날 때마다 호출될 것입니다 유한한 소스, 즉 실제로 끝이 있는 소스들을 위한 두가지의 종료 이벤트가 있습니다 둘 모두 완료될 수 있습니다 성공을 나타내는 완료와 에러를 나타내는 완료말이죠 에러는, onNext 콜백을 처리하는 도중 예외가 던져졌다는 뜻입니다

또는 데이터의 소스에서 이벤트를 구독하고 있다가 어떤 문제가 발생해 에러가 발생했다는 뜻입니다 onComplete와 onError는 모두 종료 이벤트라고 불립니다 즉, 이 둘 중 하나가 호출된다면, 더 이상 또 다른 콜백이 호출되지 않는다는 겁니다 마지막 메소드는 서로 다른데, onSubscribe입니다 RxJava1을 해보셨다면, 이 메소드는 처음 보실 겁니다

이는, 기본적으로 여러분이 Observable이나 Flowable을 구독했을 때 여러분은 실제로 어떤 리소스를 만들게 되는데 그리고 이 리소스들은 사용을 끝냈다면 종종 정리되어야 합니다 그리고 이 onSubscribe 콜백은 여러분이 Observable이나 Flowable을 구독했을 때 즉시 호출됩니다 그리고 파라미터로 어떤 타입을 전달해줍니다 Observable에서는 Disposable타입인데 이는 여러분으로 하여금 dispose 메서드를 호출해서, 자원을 모두 사용했다고 알리고 더 이상 콜백이 호출되는 걸 원치 않는다 말할 수 있도록 합니다 네트워크 요청을 생각해보면 이는 네트워크 요청을 취소하는 것이 될 수 있습니다

버튼 클릭의 무한 스트림을 리스닝 하고 있다면 이는 기본적으로 더 이상 버튼 클릭 이벤트를 받지 않는다고 말하는 것이며 그리고 이는 뷰에서 리스너를 제거하는 것이 됩니다 Flowable에 대해서도 마찬가지 입니다 다른 이름을 지녔지만 사용법은 같습니다 cancel메서드는 기본적으로 Disposable의 dispose와 같습니다 차이점이라면 Flowable은 request라는 또 다른 메소드를 가지고 있다는 것입니다

배압을 가지고 있다는 의미이죠 이 메소드는 얼마나 많은 아이템을 원하는지 Flowable에 명시하는데 사용합니다 서로 어떤 관계가 있는지 보여주는 간단한 차트를 보겠습니다 기본적으로 어떤 종류던지 간에 이벤트를 발생하는 것이면 모두 나타낼 수 있습니다 소스의 데이터는 0이거나 하나, 그 이상이거나, 그저 완료 또는 에러 가 될 수도 있습니다

이 두가지의 유일한 차이점은 배압을 가지느냐 아니냐입니다 빠르게, 왜 Disposable과 Subscription 타입 자체와 그들의 메소드가 서로 다른 이름을 갖는지 설명해보자면, 하나는 dispose, 다른것은 cancel인데 왜 어떤 하나가 다른 하나를 상속하게 해서 그냥 request 메소드를 추가시키지 않고 구별해 만들었을까요? 그 이유는 리액티브 스트림 명세라고 불리는 것이 존재하기 때문입니다 이것은 기본적으로 많은 벤더들의 저마다의 구현을 하나로 통합시키기 위한 것입니다, 말하자면, "자바에서 리액티브 라이브러리를 위한 인터페이스의 표준 집합을 만들어보자" "그리고 그걸 4개의 인터페이스로 만들어보자" 처럼 말이죠 Subscriber 타입이 보일겁니다 그리고 Subscription 타입도 중간에 보이고요

이들은 실제로 명세에 있는 부분입니다 그런데 아까 하나는 Disposable 타입이며 다른 하나는 Observer 타입인 것과는 이름이 다른데 여기 있는 이것들은 표준에 있는 부분이기 때문입니다 우리는 실제로 표준을 바꿀 수는 없었습니다 (역: 번역이 이상한 점 양해바랍니다) 그렇다 하더라도 이것은 표준이기 때문에 안드로이드에서는 빈번히 일어나는 일은 아니지만 만약 스트림을 위해 두 종류의 라이브러리를 사용해야 한다면 그리고 그 라이브러리들이 표준을 구현했다면, 매끄럽게 서로를 변환할 수 있게 해줍니다 이제 리액티브 스트림 명세를 구현한 실제 타입이 되도록 만들기 위해 왼쪽 컬럼을 바꿔보겠습니다

이제 이 타입은 배합을 지원함을 의미하게 되었습니다 그리고 오른쪽의 타입은 배합을 지원하지 않음을 나타냅니다 이제 다시 UserManager로 돌아가보면, 전까지는, 우리는 이 클래스 외부에서 User를 pull해갔습니다 그리고 그것을 출력했죠 그 때는 그게 적절해보였습니다

이제는 User의 Observable을 사용해 다시 모델링해보죠 이는 User객체의 소스를 의미합니다 User가 변경될 때마다 그 변경사항을 통지받습니다 그리고 그에 반응해 출력할 수 있습니다 적절한 시간이 되었는지 예측할 필요없이 시스템에서 발생한 다른 이벤트를 고려하지 않아도 됩니다

RxJava에는 특수한 소스들이 있습니다 그리고 이는 기본적으로 Observable의 서브셋입니다 그 중에는 세가지가 있는데, 첫번째로 Single입니다 단일 아이템을 가지거나 에러를 가집니다 따라서 스트림이라고 보기는 좀 그렇고 단일 아이템의 비동기 소스라고 보는 것이 적절합니다

그리고 배압을 갖지 않습니다 Scaler을 떠올리시면 좋습니다 메소드를 호출하면 값을 리턴하거나 예외를 던집니다 근본적으로 Single은 이 개념을 모델링합니다 Single을 구독하면 하나의 아이템을 내주거나 에러를 내줍니다

scaler와의 차이점은 리액티브적이라는 것입니다 Completable은 void 리턴타입의 메소드와 유사합니다 데이타 없이 완료하거나 예외를 던집니다 이를 reactive적인 Runnable로 생각하시면 좋습니다 성공적으로 완료되거나 실패하는 코드들을 가질테죠

RxJava2에서 새로 나온 타입인 Maybe입니다 아이템이 없거나 하나이며, 또는 에러를 가질 수 있습니다 Optional같은 것이라고 생각하시면 좋습니다 Optional 값을 리턴하는 메소드는 언제나 무언가를 리턴하지만 예외를 던지지 않았으면 Optional은 값을 가질 수도 아닐 수도 있습니다 잠시 후에 이게 사용되는 것을 보이겠습니다

리액티브적인 것만 제외한다면 Optional 개념과 유사합니다 RxJava2에는 실제 리액티브 스트림인 모델타입은 없습니다 리액티브 스트림들은 Observable이면서 배압이 없는 것으로 모델링 되었기 때문입니다 만약 우리의 setName과 setAge 호출이 비동기라면, 성공하던 실패하던, 아무런 데이터도 리턴하지 않을 것이고 그래서 반환형은 Completable 모델이 될 것입니다 이제 조금 빨리 살펴보도록 하겠습니다

어떻게 소스가 만들어지는지와 어떻게 리액티브 소스로 래핑할 수 있는지 보겠습니다 모든 타입들은 스칼라값들을 가지고 소스를 만드는 정적 메소드를 가집니다 또한 이렇게 배열을 가지고도 만들 수 있으며, 반복가능한 것이라면 뭐든지 가능합니다 제가 생각하기에, 동기 또는 비동기적으로 메소드와 그 메소드의 행위를 어댑트할 용도로 이상적으로 사용될 만한 두가지 경우가 있습니다 첫번째는 fromCallable입니다

fromCallable는 근본적으로 단일 값을 반환하는 동기적 행동을 모델링합니다 이 경우, 가상의 getName 메소드에 위임하는 모습인데요 fromCallable이 좋은 점은 callable에서 자바의 표준 예외를 던지는 것이 허용되기 때문에, Checked 예외를 사용해 실패하는 모델을 만들 수 있다는 점입니다 예를 들어 I/O 예외를 던질 가능성이 있는 HTTP 요청을 가지고 있다고 합시다, 우리는 이제 그 HTTP 요청 호출을 fromCallable에 넣을 수 있고 구독하게 되면, 반환된 Observable은 그 요청을 실행할 것입니다 만약 요청이 예외를 던졌다면 에러를 보게 될 것이며, 요청이 성공했다면 응답인 onNext를 받게 될 것입니다

fromCallable는 이 5개의 모든 타입에서 이용 가능합니다 이들은 데이터 단일 조각의 동기적 소스를 모델링하기 위한 것들입니다 명령적 세계에서는 리턴값을 반환하는 메소드가 될 것이며 리액티브 세계에서, fromCallable는 바로 그것을 모델링하기 위해 사용되는 것입니다 Maybe와 Completable에는 두 개의 추가적인 메소드가 있는데, 이들은 값을 리턴하지 않는 모델을 만들 수 있게 해줍니다 기본적으로 리액티브적인 Runnable이라고 생각하면 별 차이는 없습니다

Observable을 만드는 가장 강력한 메소드는 create입니다 RxJava1을 사용해봤다면 이 메소드를 알겠지만 RxJava1에서 절대 사용해서는 안될 무지 끔찍한 메소드입니다 이 점은 RxJava2에서는 수정되었고, 따라서 create 메소드는 정말 유용한 메소드들 중 하나가 되었습니다 그리고 소스들을 래핑할 때 사용되어져야 합니다 우리는 콜백과 함께 이 소스를 만들었습니다

이 콜백은 새로운 구독자가 생길 때마다 호출되는데, 그리고 Emitter라고 부르는 것을 제공받는데, Emitter는 기본적으로 구독하고 있는 쪽을 의미합니다 우리는 데이터를 취해서 Emitter에게 데이터를 보내줄 수 있습니다 이 예제에서 제가 하고 있는 것은, 데이터의 조각을 동기적으로 보내고 그리고나서 스트림을 완료하는 것입니다 이제 이를 람다로 변환해서 보일러플레이트들을 제거해보겠습니다 데이터 조각을 하나 더 보낼 수 있습니다

fromCallable과는 달리, 여러번 호출할 수 있습니다 Oh no! 또 다른 이점은, 우리는 이제 비동기적인 데이터 조각들을 모델링할 수 있다는 것입니다 만약 HTTP 요청들을 가지고 있고 동기적으로 실행시키는 것이 아니고, 비동기적으로 실행시킨다면, HTTP 콜백에서 Emitter의 onNext를 호출할 수 있습니다 create 메소드의 또 다른 이점은 구독이 해지되었을 때 뭔가를 할 수 있도록 한다는 점입니다 예를 들어 누군가 HTTP 요청을 구독하는 것을 취소한다면, 계속 요청이 실행될 필요는 없습니다

우리는 이제 HTTP 요청을 취소하고 리소스를 정리하는 취소 액션을 추가할 수 있습니다 이는 안드로이드에서 정말 유용한데, 왜냐하면 이것이 UI와의 상호작용을 모델링하는 방법이기 때문입니다 Observable을 구독할 때 버튼 클릭을 리스닝하도록 할 수 있으며 구독을 취소했다면 해당 리스너를 제거할 수 있습니다 그래야 뷰에 대한 레퍼런스를 누수하는 일이 없습니다 이 Emitter를 이용하는 Observable을 만드는 것은 다섯 개의 모든 타입에서 동작합니다

소스를 리스닝하는 것을 빠르게 봅시다 앞서 이 두개의 인터페이스를 보였습니다 그리고 이 네번째 메소드도 보였습니다 이 네번째 메소드는 새롭지만 조금 요상합니다 subscribe 메소드를 사용해서 리스닝을 시작하여 Observable을 구독할 때에는 앞서 말한 그 두 인터페이스들을 직접 사용하지는 마세요

이 4번째 메소드 때문에, 여러분은 다음처럼 헤맬 수 있습니다 "음, 이 객체를 가지고 뭘해야되는거지?" "그리고 어떻게 구독을 취소하는거지?" 대신에, DisposableObserver타입을 사용하면 이것이 자동으로 4번째 메소드를 핸들링할 것이고 여러분이 Observable로부터 통지되는 것에만 관심을 가지면 되도록 해줍니다 하지만, 여기에서 어떻게 dispose 할까요? 콜백을 더 이상 가지고 있지 않다면, 어떻게 구독을 해지할까요? 어떻게 리소스가 정리되도록 할 수 있을까요? 한가지 방법은 DisposableObserver에 대한 참조를 가지고 있는 것입니다 실제로 이 타입은 Disposable을 구현하고 있어서, dispose 메소드를 호출 할 수 있고 따라서 여러분이 제어할 수 있도록 해줍니다 하지만 RxJava2에는 subscribeWith라는 새로운 메소드가 있습니다

이는 여러분이 RxJava1에서 사용했던 방식과 유사한 방식으로 사용하게 해주는데 dispose를 호출할 수 있는 타입을 반환합니다 RxJava1에서는 이를 Subscription이라고 불렀습니다 Flowable 에서도 Subscription으로 부릅니다만 Observable에서는 Disposable이라고 부릅니다 CompositeSubscription이 있었던 것처럼 CompositeDisposable이 있습니다 이것은 기본적으로, 여러분으로 하여금 복수 개의 스트림을 구독해서 그것들의 Disposable을 반환받도록 하는데, 이는 내부적으로 Disposable을 리스트형태로 가지고 있습니다

따라서 여러분은 단박에 복수 개의 스트림을 구독 취소할 수 있습니다 이는 안드로이드에서 자주보게 될겁니다 하나의 CompositeDisposable만 가지고 있어도 액티비티, 프래그먼트, 뭐가 됬건 onDestroy같은 적절한 라이프사이클 콜백 메소드에서 복수 개의 스트림을 한번에 구독을 취소시키므로 유용하기 때문입니다 옵저버를 사용하는 그러나 배압은 지원되지 않는 4개의 타입이 보이고요, 여기에는 하나의 Flowable이 보입니다 Flowable은 Disposable을 사용하지 않고 Subscription 콜백을 사용할지라도, RxJava2에서 제공하는 타입들은 여전히 같은 방식으로 사용할 수 있게 해줍니다

아무튼, 여러분은 이 모든 5개의 타입으로부터 Disposable을 반환받을 수 있습니다, 비록 Flowable은 조금 종류가 다른 것으로 취급되더라도요 이렇게 생각해보세요, 여러분은 파일이나 데이터베이스의 커서같은 어떤 자원을 가지고 있다고요 여러분은 파일 리소스를 정리할 방법이 없는 채로 파일을 오픈하지는 않을 겁니다 마찬가지로, 데이터베이스의 커서를 닫을 방법이 없는 채로 데이터베이스의 커서를 오픈하지는 않을 겁니다 즉, 구독을 해지시키는데 사용되는 Disposable을 관리하지 않을 생각이라면 절대 Observable을 구독하지 마세요

좋아요, 이제 정말 정말 빠르게 살펴봅시다 데이터를 구성하고 변경하는데 사용되는 방금 봤던 타입들의 메소드를 살펴봅시다 이 메소드들을 오퍼레이터라고 부르며, 기본적으로 세가지 일을 합니다 데이터를 병합하거나 조작하며, 스레딩 시멘틱(threading semantics)을 바꾸거나 방출을 시작하거나 중단합니다 처음 두개만 살펴보려고 합니다

지금까지, 동기적 메소드 호출과 같은 명령적인 것으로부터 리액티브적인 것으로 변모해가는 모습을 살펴본 것처럼, 오퍼레이터에 대한 설명도 마찬가지로 할 수 있습니다 이 접근법을 문자열에 적용해보면 여기 새로운 문자열을 반환해줍니다 (역: 동기적이라는 뜻) 리액티브 세상에서는, 역시 Observable을 사용할 것입니다 오퍼레이터를 사용해서 그 접근법을 적용해봅시다 이 경우에, map이 오퍼레이터입니다 이 오퍼레이터는 방출된 데이터를 우리로 하여금 그 접근법을 적용시켜서 새로운 유형의 데이터를 만들도록 해줍니다 이건 그냥 지나갈게요

우리가 처음에 정의했던 User 객체를 떠올려보시면, 콜백은 백그라운드 스레드에서 수행되고 그리고 메인스레드로 돌아와야 했습니다 그렇게 하기 위한 내장 연산자가 있습니다 이것은 여러분으로 하여금 그 일을 보다 선언적으로 하게 해줍니다 예를 들어 저는, Observable의 아이템 방출을 어떤 다른 스레드에서 관찰하고 싶습니다 따라서 저는, 이 user로부터 반환되는 것은 백그라운드 스레드에 있게 되지만, mainThreadUser로부터 반환되는 것은 메인스레드에 있게 만들고 싶습니다

observeOn 오퍼레이터가 바로 그 일을 하게 해줍니다 스레드를 바꾸는 것이기 때문에 이들 오퍼레이터의 순서가 중요해지게 됩니다 observeOn과 유사하게, 옵저버블이 작동하는 지점을 바꿀 수 있습니다 저희가 네트워크 요청을 하는 경우를 생각해보죠, 그 네트워크 요청은 여전히 동기적으로 되고 있다고 합시다 하지만 그 요청이 메인스레드에서 수행되도록 하고 싶지는 않습니다

따라서, 우리는 이 오퍼레이터를 적용해서 옵저버블을 구독하는 지점을 바꾸도록 하면 됩니다 네트워크 요청은 완전히 그 바꾼 지점에서 일어나게 됩니다 따라서 우리가 backgroundResponse를 구독하기 시작하면 백그라운드 스레드로 바꾸게 됩니다io()는 여러분이 사용할 수 있는 스레드풀입니다

따라서 이 스레드풀에서 동작하게 될 것입니다 그리고나면 구독하고 있던 쪽에게 통지해줄겁니다 subscribeOn 오퍼레이터가 동작지점을 바꾸는 역할을 합니다 이게 좋은 이유는, 이것들은 새로운 옵저버블을 리턴하고 그리고 이 모든 메소드들은 옵저버블에 존재하기 때문에 그것들을 서로 구성하고 체이닝할 수 있기 때문입니다 이렇게 되면 보통, 이러한 작업을 위해 중간에 두어야 하는 임시적인 변수가 보시다시피 필요없게 됩니다

우리는 그저 오퍼레이터들을 특정 순서에 맞게 적용시켰을 뿐이죠 우리는 Response를 원아 죄송합니다, 우리는 백그라운드 스레드에서 요청이 실행되기를 원합니다 그리고 메인 스레드에서 요청의 결과가 관찰되기를 원하죠

그리고 응답을 보시다시피 이렇게 문자열로 바꿀 수 있죠 하지만 다시, 여기서 오퍼레이터의 순서가 중요합니다 map 오퍼레이터를 observeOn 이후에 배치했기 때문에 이는 안드로이드의 메인 스레드에서 동작하게 됩니다 우리는 메인스레드에서 HTTP 응답을 읽어오는 것을 원하지 않습니다 우리는 메인스레드로 바뀌기 이전에 응답을 읽어오기 원합니다

따라서, 요청을 보내고 나면, 옵저버블 체인을 따라 응답을 방출하고, 결과 문자열로 매핑하고, 그리고나서 메인스레드로 스레드를 바꾸고 결과를 UI에 보여줄 수 있게 됩니다 또 다른 오퍼레이터가 보이는데, flatMap은 생략하겠습니다 몇가지 다른 유형의 오퍼레이터를 보겠습니다, 여기 보이는 것들은 모두 Observable입니다 Observable을 취해서 다른 유형의 Observable로 반환해주는 오퍼레이터들이 있습니다 예를 들어 first 같은 오퍼레이터는 스트림에서 방출된 첫번째 엘리먼트를 취해서 반환해줄 것입니다

RxJava1에서는 첫번째 아이템을 방출한 옵저버블을 반환했습니다 (역: 그리고 하나의 아이템만 갖는다) 좀 이상해보입니다, 왜냐하면 만약 아이템의 리스트를 가지고 있는 상태에서 첫번째 아이템을 얻기 위해 get을 호출한다면 하나의 아이템을 갖는 리스트를 내주지 않기 때문입니다 반환되는 것은 하나의 요소 입니다 reactive 세상에서는 하나의 요소를 반환하도록 모델링하는 타입이 있습니다 그래서 RxJava2에서는 first 오퍼레이터를 호출하면 오직 하나의 요소만을 반환함을 보장하며 Single을 얻게 됩니다

만약 옵저버블이 비어있다면 예외를 발생시킬 것입니다 왜냐하면 Single은 에러 또는 하나의 아이템만을 가져야 하기 때문입니다 그리고 firstElement 오퍼레이터는 Maybe를 리턴합니다 옵저버블이 비어 있을 때, Maybe는 에러 없이 완료되는 경우를 모델링할 수 있습니다 만약 엘리먼트들은 무시하기를 원하고 그저 완료 또는 실패인지에만 관심이 있다면 Completable을 사용할 수 있는데, 이 오퍼레이터는 Completable을 리턴합니다

이것이 바로 Completable 모델입니다 이 모든 것들은 Flowable에도 존재합니다 따라서, 모두 같은 오퍼레이터를 가지며 모두 같은 특수한 타입들을 반환합니다 이 차트는 일부 오퍼레이터들의 종류별로 보여주는데, 윗 부분 오른쪽 구석을 보면 이쪽은 기본적으로 "좁은 타입"들입니다 따라서 여기 있는 것들을 호출하면, 예를 들어 스트림에서 아이템들의 수를 센다던지하면, 수치값은 언제나 Single이기 때문에 Single과 같은 좁은 타입을 얻게 됩니다

이 반대쪽에 있는 오퍼레이터를 보면, 어떤 타입을 받아서 그것을 좀더 넓게 만드는 타입들이 있습니다 예를 들어 Single을 취해서 Observable로 만드는것들 말입니다 좋습니다, 다시 기존 예제로 돌아가보겠습니다 이젠 리액티브적으로 할 수 있게 되었습니다 user를 구독하고, 메인 스레드에서 통지받기를 원하게 해놓고 그리고나서 UI에 밀어넣어 user를 보여줄 수 있습니다

언제든 user에 변경이 생기더라도 이 코드는 제대로 동작합니다 그리고 자동으로 업데이트되는 것도 볼 수 있습니다 더 이상 상태를 관리하느라 걱정하지 않아도 됩니다 그러나, 반환되는 Disposable을 관리해야함을 잊어서는 안됩니다 왜냐하면 안드로이드에서는, 액티비티가 사라졌을 때 이 코드 또한 멈추게 만들어야 하기 때문입니다

따라서 onDestroy에서 Disposable의 dispose를 호출해야 합니다 마찬가지로, 데이터를 변경하기 위해 비동기 요청을 만들 때에도 그 동작은 백그라운드에서 일어나기를 원하고, 결과는 메인스레드에서 관찰되기를 원합니다, 성공했던 실패했던 성공을 나타내는 콜백에서는 텍스트박스를 다시 입력가능하게 해놓는다던지 할 수 있습니다 다시 말하면, 여러분은 파일을 닫지 않을 거라면 파일을 열지 않을 것이기 때문에 Disposable을 관리할 수 없다면, 구독 또한 해서는 안됩니다 따라서 Disposable을 Disposable 리스트에 가지고 있도록 해야 합니다 시간이 별로 없기 때문에 좀 생략하겠습니다

하지만, RxJava1와 비교해 RxJava2에서 좋은 점은 근본적인 구조 변경이 있었다는 것입니다 이를 통해 특히 안드로이드에서 스트림을 만들 때 사용하게 되는 임시변수들의 수를 줄일 수 있게 되었습니다 호출하는 모든 오퍼레이터들은 각자의 행동을 구현하는 옵저버블을 리턴해야 합니다 map을 호출할 때는 어떤 함수를 적용시키고 새로운 데이터를 방출하는 옵저버블을 가지게 됩니다 이 때 수많은 객체들이 필요할 수 있습니다

스트림을 모델링하기 위해서 쓰이는 임시변수들 말이죠 RxJava2는 이렇게 만들어지는 임시 변수를 줄일 수 있도록 그 방식을 바꾸었습니다 Oops, I wanted to 스트림을 만들기 위해 오퍼레이터를 호출하기 위한 할당이 덜 일어나게 됩니다 각각은 하나씩 덜 오브젝트를 생성하므로 스트림을 구독할 때 오버헤드도 적게 되었습니다

동작하기 위한 메서드 디스패치도 줄었기에 가비지 컬렉션은 줄고 속도는 더 빨라졌습니다 따라서 API의 어떤 절충도 없이 라이브러리의 가바지 컬렉션도 줄게 되었습니다 따라서, RxJava2는 기본적으로 다음과 같은 아이디어를 갖고 있습니다 안드로이드에서는 근본적으로 비동기적인 것으로 간주되는 네트워크나 안드로이드 그 자체, 데이터베이스, 심지어 UI까지, 비동기 소스로서 모델링되는 것들을 취해서 이 소스들의 변경에 반응하는 코드를 작성하는 것입니다 그것들을 위한 상태를 관리하거나 변경을 처리할 필요가 없이 말이죠

현재 RxJava2는 개발자 프리뷰 릴리즈버전에 있고, API를 마무리해가고 있는 중입니다 한달내로 마지막 릴리즈가 나올 것입니다 그 때에는 이용가능해질 것입니다 즉, 이미 여러분의 앱에서 이용할 수는 있습니다 하지만 API가 바뀔 수는 있습니다, 그리고 파이널 릴리즈는 API를 더 강화합니다

그래야 라이브러리들이 이것을 사용할 수 있을 것이고 이 타입들을 노출시키기 시작할 것입니다 RxJava1을 사용하고 계신다면, 서로 변환할 수 있는 프로젝트가 실제로 있습니다 그리고 이것이 여러분의 앱을 점진적으로 업데이트하도록 해줄 것입니다 혹시 관심을 갖고 계신다면, 여기 링크를 참고하세요 gradle 디펜던시는 이와 같이 될 것입니다

마지막으로 하고 싶은 얘기는, RxJava2는 전혀 새로운 것이 아니라는 것입니다 리액티브 프로그래밍 또한 새로운 것이 아닙니다 하지만 안드로이드 그 자체로는, 어떤 이유에서건 매우 리액티브적인 세상입니다 우리는 꽤나 명령적이고 상태 중심적인 방식으로 모델링해왔고 이 비동기적인 것들을 관리하기 위해 많은 노력을 해왔습니다 그리고

리액티브 프로그래밍과 RxJava는 일반적으로 우리로 하여금 이러한 것들, 즉, 비동기적인 것들을 적절한 방식으로 다룰 수 있게 해주며, 상태들을 관리하느라 애쓸 필요가 없게 해주며 비동기적인 것들을 포용하고 함께 구성할 수 있도록 해줍니다 그러한 것으로서 우리의 앱은 진짜 리액티브적이게 됩니다 그리고 지금, 우리가 정말 관심을 가져야 할 것은 화살표가 어떻게 만들어지는지 인것이지, (역: 오퍼레이터들의 그래프들) 시스템 전반을 흐르는 데이터의 상태를 어떻게 관리할 것인지가 아니라는 것입니다 여기까지입니다 참석해주신 분들 모두 감사드립니다 (박수소리)