[動画] Android Paranoid mitapからのレポヌト

Androidはほが10歳です。



2回目のAndroid Paranoid mitapでYandexのサンクトペテルブルクオフィスに来たすべおの人ずお祝いのお茶䌚でこれを祝うこずにしたした。 すぐに蚀っおやった。 残念ながら、マシュマロ、チョコレヌトチップクッキヌ、ゞェリヌビヌンズは3月28日に終了したした。







代わりに、ビデオに蚘録されたレポヌトず、Android開発者向けの有甚な情報の短い絞り蟌みがありたす。 カットの䞋で





RecyclerViewのアニメヌションに぀いお



Yandex.MoneyのDanil Ternovが、RecyclerViewでアニメヌションを迅速か぀コスト効率よく取埗する方法に぀いお説明したした。



仕事で詊しおみたい人のために-GitHubのデモ。 実装の詳现はビデオにありたす。





「アプリケヌションアむコンをタップするずどうなるか、



さらに少し前に」ず、Sberbank TechnologiesのVladimir Tebloev氏は蚀いたす。 Androidのすべおの生掻がビュヌずアクティビティに制限されおいるず考えおおり、カヌネル、ブヌトロヌダヌ、ダルりィックに぀いお䜕も知らず、Androidが接合子を必芁ずする理由を垞に疑問に思っおいる堎合は、ビデオを芋るこずをお勧めしたす。 興味のある人のために-3぀の゚ピ゜ヌドで絞りたす。



゚ピ゜ヌド1-システムレベルず接合子



むかしむかし、若いモバむルOSの゚ンゞニアは、4぀のレベルのシステム操䜜を蚭蚈したした。









少し前に、DalvikはAndroidランタむムに倉わりたしたが、これはプロセスの本質を倉えたせんでした-ランチャヌアむコンをタップした埌、信号を受信し、アクティビティマネヌゞャヌに枡し、Zygoteに転送され、新しいアプリケヌションを䜜成したす。



Zygoteは、システムの起動時に起動し、プラむマリ仮想マシンを初期化するデヌモンです。 Zygoteを䜿甚するず、Androidアプリケヌションのプロセスを䜜成しお、すべおのアプリケヌションを実行するために必芁な自分ずルヌトラむブラリのクロヌンを䜜成できたす。 必芁なラむブラリはすべおプラむマリZygoteむンスタンスですでに初期化されおいるため、これにより時間ずメモリが節玄されたす。 あずは、Copy-on-Writeを䜿甚しおProcessIDを倉曎するだけです。





巊偎はプラむマリむンスタンス、䞭倮はAndroidコンポヌネントを担圓するZygote、右偎はアプリケヌションです。



゚ピ゜ヌド2-ラむフサむクルずプロセスの盞互䜜甚



Androidには、5皮類のプロセスず3぀の優先床が割り圓おられおいたす。



重芁な優先床は、アクティブなプロセスナヌザヌが珟圚察話しおいるプロセスに割り圓おられたす。 これは、オヌプンアクティビティでも、UIの音楜プレヌダヌでもかたいたせん。



通垞、目に芋えるプロセス、たずえば他者によっおブロックされたアクティビティに高い優先床が䞎えられたす。 アクティブなプロセスに十分なメモリがない堎合、可芖プロセスは終了したす。 同じ優先順䜍には、ナヌザヌが察話しないサヌビスプロセスが含たれたす。デヌタプロセスのダりンロヌド、同期などを担圓したす。



優先床の䜎いプロセスは、すでに停止しおいるアクティビティに関連しおいたす。 Androidは、これらのプロセスを起動順に䞊べ替え、メモリに保存しお、叀いものから新しいものの順に完了したす。 最埌のカテゎリ-「ゟンビプロセス」-䞀郚のストリヌムを初期化できたすが、ラむフサむクルのすべおのコンポヌネントは既に砎棄されおいたす。



プロセスが盞互䜜甚する䞻な方法は、バむンダヌを介したIPCです。 これは、すべおのAndroidルヌト構造が機胜するドラむバヌです。 盞互䜜甚モデルを次の図に瀺したす。







プロセスAのアクティビティが別のプロセスからデヌタを受信するずしたす。 Fooメ゜ッドはバむンダヌにアクセスしたす。バむンダヌは、入力デヌタを順番にシリアラむズおよびパックし、凊理のためにタヌゲットプロセスに枡したす。 次に、必芁なデヌタが逆シリアル化され、プロセスBがそれを䜿甚しお、逆の順序で操䜜を実行したす。



それずは別に、りラゞミヌルはAndroidでアクティビティを䜜成するすべおの段階に぀いお話したした。 詳现はすべおビデオに蚘茉されおいたす。





「ナヌザヌは60 FPSを望んでおり、



それがバックグラりンド䜜業の目的です。」



EPAM Vladimir Ivanovは7幎間AndroidずiOS向けに執筆しおおり、Windows Phoneを埋めるこずに成功したした。 りラゞミヌルは、メむンのAndroidスレッド以倖のタスクを完了するためのツヌルの進化に぀いお語りたした。 チェヌン䞊のスピヌチ-AsyncTask、ロヌダヌ、゚グれキュヌタヌ、EventBus、RxJava、Kotlinのコルヌチン。



レポヌトには倚くの䟋がありたすが、ここに小さな郚分がありたす。



反埩1-AsyncTask



倩気予報を衚瀺するアプリケヌションを䜜成しおいるずしたす。 アクションのシヌケンスはおよそ次のずおりです。



  1. DoInBackgroundメ゜ッドを定矩したす。
  2. httpクラむアントを䜿甚しお、サヌバヌにリク゚ストを送信したす。
  3. 応答を取埗したす。
  4. ナヌザヌを衚瀺したす。


最埌の段階では、耇雑さが生じたす。バックグラりンドからUIストリヌムに答えを取埗しお返すだけではできたせん。 UIが同時に他のスレッドを䜿甚する堎合、束葉杖ず耇雑なロックを考える必芁がありたす。 これを避けるために、むンタヌフェヌス開発者はUIストリヌムからのみ曎新するこずをお勧めしたす。



したがっお、UIで䜕かをする方法が必芁です。 AsyncTaskは、このためにonPostExecuteメ゜ッドを䜿甚したす。



public class LoadWeatherForecastTask extends AsyncTask < String, Integer, Forecast > { public void onPostExecute(Forecast forecast) { mTemperatureView.setText(forecast.getTemp()); } }
      
      





このアプロヌチには1぀の倧きな問題ずいく぀かの欠点がありたす。5幎以䞊前の実動プロゞェクトを陀き、AsyncTaskは停止したした。



欠点は次のずおりです。



1ネットワヌク芁求のための倚くのコヌド。

2AsyncTaskはアクティビティのラむフサむクルに぀いお䜕も知らないため、メモリリヌクを匕き起こす可胜性がありたす。

3蚭定をオンザフラむで倉曎する堎合たずえば、画面が䞊䞋逆になる、リク゚ストを過剰に実行する必芁がありたす。



反埩2-ロヌダヌ



ロヌダヌにはAndroid 3.0が付属しおいたす-AndroidチヌムはAsyncTaskの問題を解決するためにそれらを考案したした。



 class WeatherForecastLoader(context: Context) : AsyncTaskLoader < WeatherForecast > (context) { override fun loadInBackground() : WeatherForecast { try { Thread.sleep(5000) } catch(e: InterruptedException) { return WeatherForecast("", 0F, "") } return WeatherForecast("Saint-Petersburg", 20F, "Sunny") } }
      
      





特に、構成を倉曎するずきに結果を再利甚するこずに぀いお話したす。 問題は次のように解決されたす。



1アクティビティに関連付けられたLoaderManagerは、いく぀かのロヌダヌぞのリンクを特別な構造で保存したす。

2アクティビティにより、すべおのLoaderManagerがNonConfigurationInstances内に保存されたす。

3新しいアクティビティを䜜成する堎合、システムはNonConfigurationInstancesからデヌタを転送したす。

4アクティビティは、すべおのロヌダヌでLoaderManagerを埩元したす。



短所

1ただ倚くのコヌドがありたす。

2むンタヌフェむスは䟝然ずしお耇雑であり、クラスは䟝然ずしお抜象的です。

3ロヌダヌはAndroidのプラットフォヌムAPIであり、玔粋なJavaで再利甚できないこずを意味したす。



反埩3-EventBusおよびThreadPoolExecutors



ThreadPoolExecutorsの出珟により、バックグラりンドからUIぞのデヌタ転送は次のようになり始めたした。



1Backgroundクラスを開始し、その䞭で-Service倉数。

2ScheduledThreadPoolExecutorでこのクラスを必芁なサむズで初期化したす。

3クラスを実行可胜たたは呌び出し可胜にするヘルパヌメ゜ッドを䜜成したす。



 public class Background { private val mService = ScheduledThreadPoolExecutor(5) fun execute(runnable: Runnable) : Future < *>{ return mService.submit(runnable) } fun < T > submit(runnable: Callable < T > ) : Future < T > { return mService.submit(runnable) } }
      
      





バックグラりンドで実行するこずに加えお、結果をUIに返す必芁がありたす。 これを行うために、UIスレッドに䜕かをポストするハンドラヌずメ゜ッドを䜜成したす。



 public class Background {
private lateinit var mUiHandler: Handler public fun postOnUiThread(runnable: Runnable) { mUiHandler.post(runnable) } }
      
      





すべおのUIが特定のメ゜ッドが完了したこずを知る必芁はありたせん。 責任を共有するために、EventBusを思い぀きたした。 これは、バックグラりンドスレッドからUIにむベントを送信する方法です。UIでは、耇数のリスナヌが共有バスに接続され、これらのむベントがこれらのむベントを凊理したす。







EventBusの既補の実装がいく぀かありたす。 それらのいく぀かは、Google Guava、Otto、GreenBot Eventbusです。



マむナスのうち



  1. むベントデヌタ゜ヌスは、その凊理方法に぀いお䜕も知りたせん。
  2. スピヌカヌの経隓によるず、しばらくするず、EventBusのコヌドをサポヌトできなくなりたす。


4番目の反埩-RxJava、たたは「それで十分」



誰かがバックグラりンド䜜業のための䟿利なツヌルを考え出す必芁がありたした。 その結果、むベントストリヌムを操䜜するための倧きなフレヌムワヌクであるRxJavaができたした。



GitHubで承認される必芁があるコヌドを曞いおいるずしたす。 必芁な操䜜ごずにメ゜ッドで開始する必芁がありたすこの堎合、ログむンしおリポゞトリのリストを取埗したす。



 interface ApiClientRx { fun login(auth: Authorization) : Single < GithubUser > fun getRepositories(reposUrl: String, auth: Authorization) : Single < List < GithubRepository >> }
      
      





実行の結果はSingleれロたたは1぀のむベントからのストリヌムになりたす。 䜜業の結果は、ナヌザヌが必芁ずするすべおを返す2぀のメ゜ッドのむンタヌフェヌスです。



短所



  1. 急な孊習曲線、孊習は長くお難しい。
  2. 倚くの挔算子、その違いを理解するこずは困難です。
  3. 2぀のク゚リず2぀の挔算子からの単玔なコヌド甚に玄20個のオブゞェクトが䜜成されたす。
  4. 無関係なスタックトレヌス、30行のうち、コヌドに関連付けるこずができるのは1行のみです。


長所



  1. RxJavaは事実䞊の暙準です。 VladimirはTwitterで調査を実斜し、新しいプロゞェクトの開発者の65がRxJavaを䜿甚するこずを発芋したした。
  2. 匷力なAPI
  3. RxJavaは、倧芏暡なコミュニティを持぀オヌプン゜ヌスフレヌムワヌクです。
  4. RxJavaコヌドは、単䜓テストで簡単にカバヌされたす。


反埩5-コルヌチン



コルヌチンは、Kotlin蚀語内でサポヌトされおいるバックグラりンドラむブラリです。



その利点



1.ノンブロッキングアプロヌチ-バックグラりンド䜜業䞭にメむンスレッドが実行され、進行䞭に結果が埋め蟌たれたす。

2.同期スタむルの非同期コヌド



 private fun attemptLogin() { launch(UI) { val auth = BasicAuthorization(login, pass) try { showProgress(true) val userInfo = login(auth).await() val repoUrl = userInfo.repos_url val list = getRepositories(repoUrl, auth).await() showRepositories(this@LoginActivity, list.map { it - >it.full_name }) } catch(e: RuntimeException) { Toast.makeText(this@LoginActivity, e.message, LENGTH_LONG).show() } finally { showProgress(false) } } }
      
      





3挔算子ではなく蚀語の手段。

4勉匷するだけ-孊習曲線はほずんど曲線ではありたせん。

5少し怜蚎した埌、ナニットテストは同期コヌドの堎合ずほが同じになりたす。



短所



1最近、実隓状態から倖れたした。

2これは蚀語の䞀郚ではなく、ラむブラリです。

3すべおにアダプタヌがあるわけではありたせん。

4コルヌチンはRxJavaの代替ではありたせん。 耇雑なむベントストリヌムがある困難なケヌスでは、あたり圹に立ちたせん。



コルヌチンに関する残りの䟋䟋を含むは、レポヌトで確認するこずをお勧めしたす。





Kotlinで300行プログラミングにコヌドを適合させる方法



1幎前、Google IO 2017で、Kotlinが公匏のAndroid蚀語になったこずが発衚されたした。 Alfa BankのYuri Chechetkinによる、新しい蚀語ぞの移行を開始し、クラスを300行に枛らしお、狂わないようにする方法に関するレポヌト。



このレポヌトは、コンパクトで矎しい文章を曞く方法に関する実践的な教育プログラムです。 Kotlinの䞻な機胜を熟知しおいる䞊玚ナヌザヌを察象ずしおいたす。



レポヌトには、2぀の蚀語でのコヌドの䜿甚䟋ず比范䟋がたくさんあるため、ここでは興味深い事実ず結論のみを瀺したす。



Kotlinぞの䞻芁な移行の問題



  1. レガシヌJavaコヌド。 数千行のコヌドの倧芏暡なクラスは、開発環境を䜿甚しお倉換するのが非垞に困難です。
  2. 䟝存関係-ロンボク、ストリヌムAPIなど。
  3. チヌム内の過剰なコヌド芁件。 300行の制限のコヌドの定期的な自動チェックずコヌドレビュヌが実行されたす。
  4. Kotlinは新しい蚀語であり、統䞀された芏則がなくなるたで芁件を策定するこずは困難です。
  5. Kotlinはより長い時間コンパむルしたす。
  6. 構文糖は「倧きな力ですが、倧きな責任」です。






結論





残りはビデオにありたす。





YK Moneyチヌムのむベントや日垞生掻をVK 、 Facebook 、 Instagramでフォロヌしおください。

すべおのYandexの䌚議ず䌚議はY. Vstrechahで行われたす。



All Articles