Continuity is The Father of Success

Androidアプリとかゲームとか。毎日続けてるものについて。

Android Architecture Components Pagingを推したくて

Kotlin愛好会で談義してきた。

love-kotlin.connpass.com

speakerdeck.com

Kotlin愛好会にはサーバーサイドエンジニアの方も多く参加される & Paging自体があまり導入例を聞かないので、Paging紹介:Kotlinな話=7:3ぐらいにしてみました。

Pagingライブラリ

developer.android.com

Pagingライブラリは、大量のデータを読み込んでリスト表示したいときに利用するライブラリです。 「大量のデータ」は多くの場合API経由で読み込むサーバー上に保存されているデータになりますが、端末内のストレージに保存したデータでも構いません。

本業ではタイムラインの読み込みから導入して、今ではいろいろな追加読み込み処理を任せるようになっています。 大変便利。

tech.studyplus.co.jp

Pagingを導入すると何が嬉しいのか

RecyclerViewへ渡すデータ量の調整ができることはもちろん嬉しいのですが、Pagingを導入することによる最大のメリットは「RecyclerViewのスクロールリスナーを用意しなくて良くなる」ことだと思っています。 Pagingライブラリを利用するということは、ほぼ PagedListPagedListAdapter を利用したコードを書くことです。

developer.android.com

developer.android.com

PagedListAdapterPagedList を受け取り、PagedList の更新通知を RecyclerView へ渡す仕組みを持っています。 そして PagedListAdapterRecyclerView のスクロールにより追加読み込みが必要になったとき、追加読み込み処理を PagedList へ伝える仕組みも持っています。 このことにより ViewModelRepositoryRecyclerView.OnScrollListener を組み合わせるコードを、個々の開発者が書く必要がなくなります。 素早くスクロールしたケース、データの終点までスクロールしたときに追加読み込みをどうループさせないか、などの細かな実装を避けられるため、思っている以上に開発コストが下がるのが感じられるのでは、といったところです。

Paging導入の障害(?)

architecture-components-samplesの実装例を見ながら、そこそこ試行錯誤しながら書く必要があるのが大変かなーと思います。

github.com

PagingWithNetworkSample を時間をかけて読み込むことをお勧めします。 (DIがされていないサンプルになるため、LocatorとViewModelの接続がわかりにくいのですが、Dagger2などが導入済みプロジェクトであればもっと簡単に記述できます)

これといった必要条件もないのですが、参照できる実装例が少ないのが導入を妨げているのかなーと思っています。 または GroupieEpoxy をすでに導入しているプロジェクトにおいて、Pagingを追加する実例が少ないのもあるのかなと思います。 こちらについては、DroidKaigiにプロポーザルを出して落選してしまったので、ブログかRejectConあたりで整理できればな、と思っています。

おわりに

取り止めなく書いてしまいましたが、今の率直な気持ちとしては「どんどんPagingを利用する人が増えて、機能開発やバグ修正(あるのか?)がされるようになれば!」という感じです。 Pagingは2.1.0リリースの後、長期間の(かつ大規模な)Kotlinを利用した開発に入っているので、もっともっと「利用したい!」という声が上がるようになればいいなー……!

なんてことを考えていたら、たるさんに誘われて技術書博2に寄稿することになりました。

内容はPagingライブラリv3.0.0(開発中)で取り組まれているKotlin化と、Kotlin化したことによりより便利になった箇所の解説になります。 しっかりと探したわけではありませんが、Pagingについてandroidx-maste-devをそこそこ読んで解説しようとしているのは、他にないのではーと思っています。

興味が惹かれるようでしたら、是非お手に取ってみてください。

個人開発が滞りがちなので小さいアプリを作った話

思い立ってFlutterで簡単なアプリを作ってみました。 はてなブックマークの状態を閲覧する(監視する)アプリです。

github.com

開発経緯

ここのところを振り返って考えてみたところ、個人でアプリを作れていませんでした。作っても小さなライブラリっぽいもの程度。 本業の中でKotlinによるAndroidアプリ開発はそこそこやっているので、KotlinではなくSwiftやFlutterで作らねば、とも。

そんなわけで11月頭に「3ヶ月間で3つ(なんでもいいから)アプリを作る」ことを目標にしました。 今回は1つ目のFlutterアプリになります。

やったこと

開発要件

この半年ほどの挫折の原因を考えてみると、大抵が「ログイン処理」でした。 Googleアカウントによるログインにしたい、けれどGoogleログインにするためにはアプリ開発者の情報を……匿名アカウントで代用……匿名アカウントからメールアドレスへの昇格が……めんどい……みたいな感じで取りやめてしまうことがしばしば。 このため「ログイン処理」が不要であることを第1の条件に、合わせて今時っぽく公開されているAPIを利用したアプリにすることを第2の条件にして開発することに。

そんな中、はてなブックマークドキュメントを眺めていたところ「はてなブックマークエントリー情報取得API」がに気づきました。

developer.hatena.ne.jp

developer.hatena.ne.jp

これなら「ログイン不要」でユーザーに任意のURLを入力してもらうことで「はてなブックマーク情報取得API」のデータを表示できます。 合わせて、ユーザーの入力したURLをローカルDBに保存するなど、ネイティブアプリらしいリッチさも多少取り込めそうでした。 そんなわけで、「URLを入力するとはてなブックマーク情報を表示する」アプリの開発を行った次第です。

機能紹介

  • URL入力によりはてなブックマークエントリー情報(lite版)を取得
    • 取得した情報内のScreenShotをキャッシュしながら読み込み
      • (ただ、どの画像をとってもno_imageのような……?)
  • 入力されたURLは端末内DBに保存
    • Android/iOS共に対応するようSQLiteによる簡易な実装に
    • アクセスした日時によるソート
    • Swipeによる削除

学び

  • AndroidのRoomでSQLiteの書き方を覚えたので割とDBはなんとかなる
  • BLoCやProviderによるロジック記述の概要を掴んだ
    • まともに作り終えていたのがWebViewCheckerだけだったので……
  • BLoCによりSteamBuilderを使ってあらかたをStatelessWidgetで組めることを実感
  • 休日とか寝る前とかに書くならやっぱりFlutter
  • BitriseでAndroidのリリースステップ書くのはやっぱり簡単

スクリプトはこちらの relase でaabを作成するところまで対応しました。

---
workflows:
  release:
    steps:
    - activate-ssh-key:
        run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
    - git-clone: {}
    - flutter-installer:
        inputs:
        - is_update: 'false'
    - flutter-build:
        inputs:
        - project_location: "$BITRISE_FLUTTER_PROJECT_LOCATION"
        - android_output_type: appbundle
        - android_output_pattern: "*build/app/outputs/bundle/*/*.aab"
        - platform: android
    - sign-apk:
        inputs:
        - android_app: "$BITRISE_AAB_PATH"
    - deploy-to-bitrise-io:
        inputs:
        - deploy_path: "$BITRISE_SIGNED_AAB_PATH"

今後

機能的にAppleの審査に通るわけもなく、またAndroidでリリースしても利用者いないと思うので(ブラウザで十分……)今回の開発は「Bitrise上でリリースステップが回せる」状態になったここで完了としようと思っています。

作成したアプリアイコンはそこそこよくできたんじゃないかな、と気に入っているのでどこかで使うかもしれません。。。

f:id:D_R_1009:20191116213842p:plain
作るのに30分ぐらいかけたアプリアイコン

次はもうちょっと機能のあるものを作ってみようと思います! アプリ開発者がんばっていくぞ!

【ネタバレ注意】JOKERをみた

wwws.warnerbros.co.jp

先日JOKERをみてきました。

そんなわけで、思ったこととか書いておきたいと思います。 ネタバレになるかはわからないけれど、見終わった感想を見ないで映画を見てもらいたい気持ちもあるので、見る予定のある人はブラウザバックしてください。

公式もこう言っている。。。

続きを読む