サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ドラクエ3
satoshun.github.io
fitsSystemWindowsの話をつらつらと Created at Sun, Jan 26, 2020 fitsSystemWindowsについてマスターしつつあるので、つらつらと学んだことをまとめておきます。 SystemUiVisibilityの詳細な設定については説明を割愛するのでご了承ください。 そもそもfitsSystemWindowsとは? Android端末には、status bar、navigation barなどのSystem UIと総称されるViewがあります。 デフォルトでは、System UIにコンテンツの要素が被ることはありません。そこには制約があります。 しかし、SystemUiVisibilityの設定を変えることで、コンテンツの要素をSystem UIの裏側描くことが可能になります。 右の図がSystemUiVisibilityの設定を変更したものです
FragmentでViewの参照を持つとメモリリークする話と実装 Updated at Sat, Jan 18, 2020 View Bindingのドキュメントが更新され、onDestroyViewのタイミングで保持しているBindingの参照を解放する節が追記されました。 Use view binding in fragments Fragment自体のライフサイクルのほうが、FragmentのViewのライフサイクルより長いので、FragmentでBindingの参照を保持するとリークしてしまうためです。 この記事では、メモリリークをしないために、どのような実装が考えられるかを紹介していきます。 1. onDestoryViewで解放する 公式ドキュメントに載っている方法です。 // onCreatedViewで初期化 private var _binding: ResultProf
ViewModelとKotlin Coroutinesの書き方あれこれ Updated at Wed, Dec 18, 2019 ViewModel + Kotlin Coroutineを使う場合、どんな感じでViewModelでCoroutineを表現するかについてあれこれ書いてみました。 MVVM + Repositoryを想定しており、UIに反映する部分はLiveDataを考えています。 環境はandroidx.lifecycle:lifecycle-viewmodel-ktxは2.2.0-rc03、Coroutineは1.3.3です。 この記事は次の順序で進んでいきます。 viewModelScopeとは? suspend関数をコールするとき Flowをコール/購読するとき viewModelScopeとは? androidx.lifecycle:lifecycle-viewmod
Android マルチモジュール: Gradle周りで便利だと思う設定 Created at Mon, Nov 11, 2019 マルチモジュールなアプリを作ることをテーマにブログを書いていこうの、2本目です。 1本目はこちらになります。 Android マルチモジュール: ライブラリのバージョン管理について 今回は、マルチモジュール環境における、Gradle周りの便利であろう設定について、次の4つを紹介します。 モジュール内のリソース名にルールを持たせる BuildConfigを作らない モジュール内でProGuard/R8の設定をする Rファイルを小さく保つ モジュール内のリソース名にルールを持たせる resourcePrefixは、リソース名のプレフィックスにルールを設けるプロパティです。 例えば、次のように書くと、このモジュール内のリソース(レイアウト、Drawable、Strin
Android Studio: Firebaseなどのクラッシュログから関数ジャンプできるようにする Created at Tue, Oct 29, 2019 Android Studio: Debugging Tips n’ Tricks (Android Dev Summit ‘19)で、便利な機能があったので、それの紹介です。 テキスト形式のクラッシュログを、Android Studio上で関数ジャンプ出来るようになります。 Firebaseのクラッシュログを例にして説明してきます。 まず、 Firebaseからクラッシュログをコピーします。 次に、Android StudioのAnalyze Stack Trace or Thread Dumpを使い、さきほどコピーしたクラッシュログをペーストします。 そうすると、Android Studio上で、関数ジャンプが出来るようになります
RxJava 3.xの開発が本格的に始まりました Updated at Tue, Jun 25, 2019 現状での差異をまとめておきます。 RxJava2との差異 READMEから README.md RxJava2 との差分は以下のようになっています。 fixed API mistakes and many limits of RxJava 2 RxJava2のいくつかのAPIのミス、制限を直している intended to be a replacement for RxJava 2 with relatively few binary incompatible changes APIに多少の変更があり、バイナリ互換がない test and diagnostic support via test schedulers, test consumers and plugin hooks テ
Dagger2: 2.23に入ったHasAndroidInjectorについて Updated at Sun, Jun 2, 2019 Dagger 2.23に新しく、HasAndroidInjectorインターフェースが入りました。 これは、従来のHasActivityInjectorやHasFragmentInjectorなどを置き換えるために作られました。 この記事では、どのように置き換えるかを説明していきたいと思います。 また、DaggerApplicationやDaggerActivityなどの基底クラスは使っていないものとします。 置き換えていく AppComponent AndroidSupportInjectionModuleを使っているなら、AndroidInjectionModuleに置き換えます。 今後は、AndroidSupportInjectionModuleを使
ViewModel SavedState + Dagger Created at Sat, May 25, 2019 ViewModel + SavedStateでDaggerを使う方法を考えてみました。 前提知識・課題 SavedStateを使う場合、ViewModelにSavedStateHandleインスタンスを渡さなければいけません。 class MyViewModel( private val state: SavedStateHandle ) : ViewModel() { ... } SavedStateHandleインスタンスを作るために、SavedStateVMFactoryもしくは、AbstractSavedStateVMFactoryを使う必要があります。 生成したいViewModelのコンストラクタの引数がSavedStateHandleのみなら、SavedStat
Data Binding 3.5と3.6のまとめ/感想 Created at Thu, May 16, 2019 Google I/O 2019でDataBindingについて少し話されていたので感想とまとめを。 動画だとここらへんになります。 改善系 ビルドの高速化! 20%くらいビルドが早くなった distributed build cache対応 Incremental annotation processing対応 android.databinding.incremental=true を設定にすると使えます Android Studioとの連携強化!! Live Class Generation XMLを変更したら、コンパイルせずともクラス、フィールドにアクセスすることが出来る リファクタリング系 フィールド名の変更リファクタリングなどをしたときに、XML、コードの両方に反映さ
DataBindingとActivityのコンストラクタ Layout Id指定を一緒に使う Created at Thu, Apr 4, 2019 JetpackのActivityとFragmentのコンストラクタに、Layout Idが指定できるようになりました。 Activity Version 1.0.0-alpha06 Fragment Version 1.1.0-alpha06 これは、次のように使うことが出来ます。 class MainActivity : AppCompatActivity(R.layout.main_act) class MainFragment : Fragment(R.layout.main_frag) Activityの場合は、setConentViewが。Fragmentの場合はonCreateViewがそれぞれ省略することが出来ます。 ここからが
OkHttp: Java to KotlinのPRを見て勉強する Created at Sun, Mar 24, 2019 OkHttpがKotlin化をするというISSUEが立てられました。 Upgrade OkHttp 3 to Kotlin and call it OkHttp 4 これの是非についてはさておき。現状、いくつかのJavaコードがKotlinへと置き換わっているので、それらのレビューで気になったこと、知らなかったこと、忘れがちなことを勉強がてらまとめたいと思います。 checkNotNullを使うかどうか could also be code no preference myself Kotlinの標準ライブラリに、checkNotNullがあります。 これは、値がnullならIllegalStateException例外を投げるものです。 以下のコードは同じ意味を持ち
FragmentとgetViewLifecycleの話 Created at Fri, Dec 21, 2018 この記事ではFragmentでLiveDataにObserverを登録するときはFragment#getViewLifecycleを使うと良いという話をします。 まず、Fragmentのおおまかなライフサイクルは次のようになっています。 onAttach onCreate onCreateView onViewCreated … onDestoryView onDestroy onDetach ここで重要なのは、onDestroyが呼ばれることなく、複数回onCreateViewが呼ばれる可能性がある点です。 例えば、次のコードは間違っている可能性があります。 class MainFragment: Fragment() { ... override fun onViewCre
でかいappモジュールがあるときに、中間モジュールを入れることで差分ビルドを上手く効かせる Updated at Mon, Feb 11, 2019 マルチモジュール構成のメリットに差分ビルドの効率化というものがあります。しかし、モノシリックなappモジュールから、マルチモジュール構成に変更していく過程ではappモジュールがでかいままなので、差分ビルドによる恩恵が受けにくいという問題があります。(最終段階まで進めばappモジュールは十分に小さくなるので、差分ビルドの恩恵を受けられます) 例えば、以下のモジュール構成を考えます。 頑張って2つのモジュールを切り出しました。ただし、これではどこのモジュールを変更してもかなりのビルド時間がかかります。なぜなら、Gradleでは依存関係にあるモジュールが変更されたときに、自分自身も(ある程度?)再ビルドされるためです。なので、上記のモジュール構成だ
マルチモジュールの遷移について考える Part1 Created at Mon, Dec 31, 2018 Androidのトレンドの1つにマルチモジュール構成があります。 マルチモジュールによるメリットとして、 ビルド時間の短縮 依存関係を各モジュールに閉じ込めることでコードをクリーンに保つことが期待できる などがあります。大規模なプロジェクトでは上記のメリットは大きいため、マルチモジュールに移行していくことになると思います。 この記事は、マルチモジュールにした際のActivity間の遷移について考えたいと思います。目指すゴールとしては、 型安全にしたい、もしくはコンパイル時にチェックする機構が欲しい コード量を減らしたい Part1では、遷移専用のモジュールを作る方法を考えてみます。 サンプルコード: satoshun-android-example/MultiActivityRout
R8/Proguard: JarファイルからProGuard設定ファイルを読み込んでくれるようになりました Updated at Mon, Jan 28, 2019 AGP3.3.0ProGuardはAGP3.3.0、R8は導入されたAGP3.2.0から、JarファイルのProGuard設定ファイルを組み込めるようになりました。その機能紹介です。 今まで、aarではconsumerProguardFilesで、ライブラリのProGuard設定を指定できました。それのJar、Javaバージョンとなります。 ライブラリ開発者側の設定 RetrofitなどのSquare社のライブラリでは、早くもこの機能に対応しているので、それを例にして説明します。 まず、resources/META-INF/prougardディレクトリの中にProGuardの設定ファイルを置きます。 square/retrof
R8/Proguard: Daggerの生成コードがR8でどのように変わるかを見る Created at Sun, Jan 20, 2019 コードの最適化の話です。この記事では実践に寄せて、Daggerの生成コードがR8によってどのように変化するかを見ます。 まずはサンプルコードです。 @Component( modules = [ AppModule1::class, AppModule2::class ] ) interface AppComponent { @Component.Builder interface Builder { fun build(): AppComponent } fun inject(activity: MainActivity) } @Module class AppModule1 { @Provides fun provideService(): Ap
Dagger + ViewModelの基本編 + 実例編 Updated at Fri, Jan 18, 2019 この記事はDaggerとJetpackのViewModelをある程度知っている前提で進んでいきます😃 基本編 一緒にDagger + ViewModelを使うのはツラミがあります。それは、ViewModelのインスタンス生成はViewModelProviderを介して行う必要があるためです。 例えば、次のコードは間違っています。 class MainViewModel @Inject constructor(...): ViewModel() class MainActivity { @Inject lateinit var viewModel: MainViewModel ... } class MainViewModel(...): ViewModel() @Modul
Coroutine + AutoDisposeを作ってみた Created at Sun, Dec 23, 2018 Coroutine + AutoDisposeの実装について考えてみました。結論から言うと、ContinuationInterceptorを使えば上手くいきそうです。 ContinuationInterceptorとは? ContinuationInterceptorは次のようなインターフェースです。 /** * Marks coroutine context element that intercepts coroutine continuations. * The coroutines framework uses [ContinuationInterceptor.Key] to retrieve the interceptor and * intercepts all
GradleのMatching repositories to dependenciesを使ってライブラリのダウンロード先を指定する Updated at Fri, Dec 14, 2018 JitPackからライブラリをインストールしたかったところ、JCenterからライブラリをインストールしてしまう事件がありました。 詳しくは次のリンクを参照してください。A Confusing Dependency 従来のGradle4系ではおそらく、上記の問題を解決することは出来ない、もしくは非常に困難でした。しかし新しくGradle5.1に Matching repositories to dependencies が導入され、上記の問題を解決できます。(Gradle5.1はまだrcです) まず最初に従来の書き方を説明して、次に新機能を使った書き方を紹介します。今回は例として、cloudflare
class AuthInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { var request = chain.request() val invocation = request.tag(Invocation::class.java) val authAnnotation = invocation?.method()?.getAnnotation(RequireAuth::class.java) if (authAnnotation != null) { request = request .newBuilder() .addHeader("Authorization", "Basic AAAAA").build() } return chain.proceed(
Activity、Fragment、Viewにコンストラクタインジェクションする Created at Fri, Nov 16, 2018 Daggerライブラリを使い、Androidフレームワークが提供するActivityなどのクラスにコンストラクタインジェクションしたい、 そんな夢をみたAndroidエンジニアは数多くいると思います。 この記事ではそんな夢を叶える方法を紹介します。 サンプルコードはここにあります。 FragmentFactory Fragmentに依存関係を注入する時、普通にやると以下のコードになると思います。 class MainFragment : Fragment() { @Inject lateinit var userHandler: UserHandler ... }
RxAndroidのasyncパラメータを試してみた Created at Tue, Aug 21, 2018 RxAndroid 2.1.0で新しくasyncパラメータが追加されました。これはMessage#setAsynchronousを使うことで、UIのパフォーマンス向上を狙った機能です。 下のリンクに詳細な内容が書かれています。 RxAndroid’s New Async API この記事では、asyncがfalseの場合とtrueの場合でどれくらいの差が出るかを検証してみました。 検証に使用したサンプルプロジェクトは以下になります。 https://github.com/satoshun-android-example/RxAndroidExample サンプルプロジェクトをかいつまんで説明します。 まず2つのスケジューラを作成し、 private val mainSchedul
DroidKaigi2018で「なんとなく動いているProguardから脱出するために」というテーマで発表しました Created at Fri, Feb 9, 2018 DroidKaigi2018でセッションが採択されたので発表しました。 https://goo.gl/S95MJs 正直、Proguardは目新しいトピックでないのでそんなに聞きに来てくれないだろうなと思っていました。 しかし、Room3という広い部屋が割り当てられて、さらに当日はかなりの人が聞きに来てくれました。本当に聞きに来てくれた人ありがとうございます😊😊😊 Twitterの反応を見る限りだと、分かりやすいと言っている人が多くいたので嬉しかったです。 Proguardは苦手意識を持っている人が多いと思っていて、なのでstep by stepで順序良く聞けるような発表を心掛けたのでその効果が少しは出たのかなと思
Android: Navigationのsafeargs Gradle pluginだけを使ってもいいかもしれない Created at Sun, May 20, 2018 Google I/O 2018でJetpackが登場し、新たにNavigationライブラリが導入されました。 ざっくりと説明すると、画面の遷移の実装を助けるライブラリになっています。実装的には、FragmentTransactionを直接いじることがなくなるといったメリットがあります。 このライブラリの機能に、safeargsというものがあります。これが便利で、最初はこの機能だけを使うのもいいのでは? と思っているのでその紹介です。 safeargsを使ってみる 一般的にFragmentに適当な値を渡すときはBundleを通して渡します。 // 呼び出し側 val bundle = Bundle() bundle.p
Android: Data Bindingを使っていると本当のエラーログが出ない話 + 対処法 Created at Thu, Apr 12, 2018 問題 Android開発でData Bindingを使っていて、さらにDaggerなどのkaptを必要とするライブラリを使っていると、エラーログが非常に見にくい or エラーログに本当の問題が出てこないことがあります。 理由としては、Data Bindingの生成が失敗すると、MainActivityBindingみたいなクラスが生成されないので、いたるところでBinding クラスの参照エラーが出ます。 デフォルトではエラーを100行?しか出さないようになっているため、参照エラーだけでデフォルトのエラー行数を超えてしまい、本当のエラーが出力されないケースがあります。(大規模なプロジェクトだと起こりがちだと思います) 解決法 全てのエラー
Android: ViewがどのFragmentに属しているかをViewから取得する Created at Sun, Jan 28, 2018 ViewがどのFragmentに属しているかを取得する方法の紹介になります。 前々からtag、id以外の仕組みで取得出来ないかなと考えていたら、GlideでViewからFragmentを取得するコードがありました。 @Nullable private Fragment findSupportFragment(@NonNull View target, @NonNull FragmentActivity activity) { tempViewToSupportFragment.clear(); findAllSupportFragmentsWithViews( activity.getSupportFragmentManager().getFrag
Android: MVP, Dagger2, Retrofitなどなどでアプリを作りました Created at Sun, Sep 6, 2015 イベントを検索するAndroidアプリを作成したので, 使った技術のまとめです. アプリの技術的機能, 特徴は以下になります. HTTPを介してイベントのデータを取得する 検索対象のサーバは複数あるため(今回は3つ), どこかでそれらのレスポンスデータを同期する必要がある それら複数のサーバーはJSONを返すが, 微妙にJSONの構造が異なる Data-Bindingライブラリを使う MVP(Model-View-Presenter)パターンを使う Activity(Fragment)に機能が集中しないようにしたい! 上記を中心にどのように実装をしたかを説明をしていきます. フルソースコードはここにあります. https://github.co
Android: Dagger2でDIをする. 基本編 Part1 Created at Fri, May 8, 2015 概要 この記事では, 最初にDIとは何かについて説明します. DIを理解した後にDagger2の基本的な使い方を紹介します. Dagger2はDI(Dependency Injection)をするライブラリです. DIとは? DIとはDependency Injectionの略で, 訳すと「依存性の注入」です. ここでいう依存とは クラス同士の依存関係のことを表します. クラス同士の依存関係は, 委譲パターンの時に現れます. 例えば, 以下のコードがあったとします. class Blogger { public Blogger() { } public void post(String title) { // 何かメインの処理 // ... // fileにlogを取
このページを最初にブックマークしてみませんか?
『satoshun.github.io』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く