Celeste Engineer

Androidとか自転車とか

potatotips #29 Android まとめ

potatotips の 29 回目に参加してきました。今回は初めてブログまとめ枠として参加しているので、Android の発表をまとめます。

発表内容

1. yamacraft - Multi-Window上での「共有」について

qiita.com

ウィンドウ間でのドラッグアンドドロップについてのお話でした。興味深かったのは、片方のウィンドウから別のウィンドウでアプリを起動するときの設定で、Activity の launchMode が関連してくるというところ。

タスク管理上、launchMode が singleTask な Activity はひとつのタスクでかならずひとつの Activity のインスタンスになることをうまく使って、既に起動しているアプリを片方のウィンドウから情報を飛ばして連携しているように見せることが出来るようになる感じですね。

お互いのアプリがドラッグアンドドロップ機能を実装していればそれに従えばよいですが、ブラウザのように、View のドラッグアンドドロップというわけには行かないパターンもあるので、そんな時はこの方法でドラッグアンドドロップと同等のことができるようになりそうです。

2. tsuyoyo - Tips to learn "DI"

DI の学習には Spring Boot がよいぞ、というお話でした。

オブジェクトを外から差し込むことで、ユニットテストがしやすくなったり、設計がクリアになったりするよ、というのが DI のプラクティスですが、そのプラクティスは言語によっても温度差があるので、そのギャップを埋めるのに Spring Boot は程よい教材となっているようです。

3. shihochan - New Layout Editor with ConstraintLayout

Google I/O 2016 で発表された、新しいレイアウトです。本格的に、GUI のみでレイアウトを組むことが出来るようになる日も近いのかなと感じます。 マテリアルデザインがトレンドになっているため、これに準拠したレイアウトを自動で組んでくれるそうです。

これまでのレイアウトでは、配置の方法に応じて RelativeLayout や LinearLayout などを様々に組み合わせてきましたが、ConstraintLayout を使えばある程度はこれまでの使い分けを気にせずに使えると思います。ただ、どの程度柔軟性があるのか未知数な部分もおおいので、ConstraintLayout の得手不得手は今後も見極めないといけないのかなと思います。

個人的には Swing でもひどい目に合ったので、xml サイコーと思っていましたが、GUI でシンプルに完結するのであれば、待ち遠しさがあります。

4. shaunkawano - Delightful Android DB Development

memo: - Android の DB の実装 - SQL がベタ書き - ボイラプレートだらけ - 型安全とは何だったのか - SQLDelight provided by Square, Inc. - SQL チェックできる。Java から分離できる、モデルが勝手に作られる - IDE プラグイン構文解析 - SQL は .sq ファイルを作る - .sq ファイルはモデルを作りたいパッケージと同じ構造のディレクトリにいれる - SQLDelight + AutoValue + Retrolambda = super short code

AndroidSQLite を使う時のボイラプレートを減らすお話でした。

SQLite をつかってデータベースを作るときには、たいていどの入門書でもStringSQL をベタ書きにしたものをサンプルとして提示していますが、実運用する上では、Java のコードのなかに突然 SQL が現れたり、頑張って文字列結合で SQL を構築したりしていて、「型安全とは…」とか、ミスタイプの恐怖がつきものでした。

そこで GitHub - square/sqldelight: Generates Java models from CREATE TABLE statements. を使うことで、SQL を独立したファイルで管理し、プラグインで入力を補完、さらに自動で対応するモデルクラスまで作ってくれるという画期的な仕組みが導入できるとのこと。非常に嬉しいですね!モデルクラスの生成時にどこまでモデルクラスが責務を負っているかが気になりますが、単純なデータ構造を表すものならば、SQLDelight はその名の通り Delightful なライブラリとして使い勝手良く利用できそうです。

5. hydrakecat - 5 RxJava Tips You Might Not Know

RxJava における実践的な使い方の事例集でした。

Subscriptionの管理はよくCompositeSubscriptionを使っていますが、それ以外にもSubscriptions.empty()もあるということ、またSubscriptionのライフサイクル管理として、SerialSubscriptionを使うことで、新しいSubscriptionをセットすることで都度以前に持っていたものが自動で unsubscribe されるというのはなるほど便利なものがある!という感じでした。この他にも、concat().first() で、複数の Observable を組み合わせ(合成)、はじめに条件にマッチしたものから値を取り出すというロジックが書けるのはとてもうれしい気がします。

各アプリで仕様も異なるため、一概にこれだという解はなかなか出なさそうですが、似たようなことをしようとした時にどんなやり方があるかをリファレンス出来る物があるとすごく嬉しいと思います。組み合わせ次第で無限に出来ることがあるので、何をどう組み合わせるとよいのか、あるいはよくないのか、別の方法ではどうか、などがまとまったものがあるといいなと思っています。

6. woshidan - メモリリークに関するウワサの今昔(仮)

昔語られたメモリリーク対策は今も有効に働くか、というお話でした。

Android における Context の問題は今も昔も変わらず悩ましい問題です。どの Context を使うか、と言う話は、定期的に盛り上がっていますのでそちらを参考にしてください。

ytrino.hatenablog.com

Context, What Context? - by Dave Smith of Double Encore

Yukiの枝折: Android:引数はthisか?getApplicationContextか?ActivityとApplicationの違い

リークという観点では、どの Context を使うか、という以外にも、staticでないインナークラスの取り扱いも問題になります。 内部的に WeakReference で参照を持っていてくれればよいのですが、そうではない場面も多々あります。

Android Framework では、addXXXに対応するremoveXXXや、registerXXXに対応するunregisterXXXといったようなメソッド名の命名によって、使用者側の責任で参照を管理するよう要求している API もあります。コレクションで複数のコールバックインタフェースを管理する場面でよくみられるようですので、この辺りを気にして見てみるとよいかもしれません。

7. OE_uia - Android BLEのつらみ予防

BLE はチップセットに依存して安定度が変わるので、そこを気にして作りを考えよう、と言うお話でした。

そもそもそれは BLE でやるべきなのか、と言うところから(こまめに接続・切断を繰り返し続けるのは、それはそれでコストになる)、このバージョンの Android ではサポート状況が不完全、などなど。あまり BLE には馴染みがなかったですが、今後自分で触る機会があったら気をつけようと思いました。

まとめ

写真とるの忘れました😩