20210514のAndroidに関する記事は3件です。

Jetpack Compose のアルファ版で作成したサンプルを1.0.0-beta06にマイグレーションした

はじめに 2020のアドベントカレンダーではJetpack ComposeのAlpha版を使ってQiitaビューアをサンプルアプリとして作ってみました。 現在はJetpack ComposeもBetaとしてバージョンを重ね、正式版のリリースも近づいて来ていると感じられます。 そこで、前回の記事のアルファ版からベータ版にマイグレーションをし、ここに至るまでAPIにどの様な変更が入り、開発者が注意すべき点がどの様なところにあるかをさらっと共有させていただきます。 主な対応内容 Jetpack Compose を2021/4時点で最新である1.0.0-beta06に対応する。 APIコールなどをこのバージョンの仕様に合わせる 通信やシリアライザを同一モジュール内に移す Android StudioについてArctic Fox Canary 15に対応する。 その他諸々 また、このコメントの対応も入れています。 差分について 前回と今回の差分は以下から見ることができます。 https://github.com/etctaro-tech/SampleComposeQiitaViewer/compare/v0.1-compose-alpha07...v0.2-compose-beta06 では、差分について細かく見ていきます。 関連ライブラリ類のアーティファクト変更、新規追加 app/build.gradleについて、以下の通り変更を入れています。 dependencies { ... - implementation "androidx.ui:ui-tooling:$compose_version" + implementation "androidx.compose.ui:ui-tooling:$compose_version" + implementation 'androidx.activity:activity-compose:1.3.0-alpha07' - androidTestImplementation("androidx.ui:ui-test:$compose_version") + androidTestImplementation("androidx.compose.ui:ui-test-junit4:$compose_version") } (なぜか最後だけgroovy的じゃなくなっているのは内緒・・・) ポイントとしては、以下の通り。 compose用のuiについてはandroidx.compose.ui:ui-*というアーティファクトに移行した。 ActivityとJetpack Composeを結び付けるためのAPIがactivity-composeという新しいアーティファクトに移行した。(setContentはここに含まれています。) setContentのパッケージ変更 MainActivity.kt + import androidx.activity.compose.setContent - import androidx.compose.ui.platform.setContent ... class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { ... なんと長らく使われてきたsetContentが含まれるパッケージが変わってしまいました。 前述の通り、activity-composeに含まれているので、dependenciesの修正も必要です。 ContextAmbientはLocalContextに。 MainActiviyt.kt - val context: Context = ContextAmbient.current + val context: Context = LocalContext.current これもなかなか変更が激しいですが、Contextを取得する際に使っていたContextAmbientがAmbientContext→LocalContextという感じの歴史を辿ってクラス名が変わりました。 Ambientと名の付くAPIが全体的に変わっていました。 パラメータ名の変更対応 MainActivity.kt - icon = { Icon(asset = Icons.Filled.Refresh) }, - modifier = Modifier.semantics { accessibilityLabel = "Refresh Button" } + icon = { Icon(imageVector = Icons.Filled.Refresh, contentDescription = null) }, + modifier = Modifier.semantics { contentDescription = "Refresh Button" } 上記の様に、若干パラメータ名が変わっています。 また、IconはcontentDescriptionが必須のパラメータとなっています。(若干微妙。必要ないなら省略したい。) アクセシビリティを考慮しなくて良い、装飾用のアイコンについてはnullにしてね、とのことです。 contentDescriptionについては、下記の通り、テスト用のAPIも合わせて変更が入っています。 - composeTestRule.onNodeWithLabel("Refresh Button").performClick() + composeTestRule.onNodeWithContentDescription("Refresh Button").performClick() ScrollableColumnのRemove、LazyColumn推奨 MainActivity.kt - ScrollableColumn( - modifier = Modifier.semantics { accessibilityLabel = "Item List" }) { - for (item in items) { + LazyColumn( + modifier = Modifier.semantics { contentDescription = "Item List" }) { + items(items) { item -> QiitaItem(title = item.title, url = item.url) Divider(color = Color.Black) } 楽にスクロール可能なリストが作れる!と短絡的に使っていたScrollableColumnですが、ガッツリ削除されました。 代わりにLazyColumnが推奨されていました。 確かに、リソースの効率を考慮するとそちらの方が良いですが、まさか消えるとは。 これに伴い、なんとなく書いたUIテストもどきのコード(と言っても、取得してリストに含まれる件数を取得するだけですが。)も変更を余儀なくされました。 LazyColumnはすでに記載した通り、必要になったら追加で要素を表示するというものになります。 例えば、リストの要素として、通信の結果20件が取得できるとします。この時に、画面には10件しか表示できない時、 LazyColumnが保持しているのは10件となります。(ScrollableColumnの場合は、見えなくても20件持っていることになっていました。) 画面をスクロールしてさらに後続の要素を表示しようとすると、残りの10件が表示される様になります。 このため、UIテストもどきのコードは、件数が一致しなくなるため失敗するようになります。 良い対処法がすぐには思いつかなかったのですが、 beta06でリストの特定indexのところまでスクロールするAPIが追加されたので、それを使ってみました。 composeTestRule.onNodeWithContentDescription("Item List").performScrollToIndex(19) kotinx.serializationがいい感じに修正された serializationをJetpack Composeを含んだモジュールに入れて利用すると、ビルドが終わらないという問題が、Kotlin 1.4.21-2で修正されました。 ということで、1.4系最終(であると思われる)のKotlin 1.4.32にすることで、 kotlinx.serializationの問題も解決され、無事ビルドができる様になりました。 なお、Jetpack Composeのbeta01の時は、Kotlin 1.4.20でなければバージョンが合わずにビルドできなかったりしました。 こちらも1.0.0-beta06では無事解消されており、ビルドできるようになっています。 その他 Arctic Foxのcanary 15に対応できるようにプラグインなどのバージョンを変えました。 また、Arctic FoxにEmbededされてるJDK(11系)を使うようにしました。 そして、もう一つ。JCenterからMavenCentralへの移行周りの対応をしました。 こちらは割とすんなりとうまく行けました。 まとめ そんなわけでJetpack ComposeをAlphaからBetaに上げたときの諸々を対応してみました。 まあ、新規にJetpack Composeを利用する時はもうBetaや、リリースされればRC、Stableから利用されると思いますので、 こんなマイグレーションをする人は少ないですかね。 ソースコード GitHubのこちらのタグをご参照ください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Android] RxJava + RetrofitでAPIをポーリング(状態変化を検出)したい。

題目の通りです。 RxJava + RetrofitでAPIをポーリングしたい。 Retrofitで書いたSingleを返すgetStatusAPIがあり、 これを叩くと状態statusが取れます。 状態が変わるまで5秒間隔でポーリングしたいのですがどうすれば良い? 自己解決したので、メモのためここに書きます。 Observable.interval() で指定した間隔で購読します。 Observable.take() は一定時間経過後に購読を停止します。 Observable.takeWhile() は条件が真のあいだ購読を継続します。 キモは Observable.takeWhile() の位置。 doOnNext() より前に書くと、状態が変わったとき、doOnNext()がよばれなくなります。 hoge.java private void polling(String checkoutId, int interval, int timeout) { Disposable disposable = Observable.interval(interval, TimeUnit.SECONDS) .take(timeout, TimeUnit.SECONDS) .subscribeOn(Schedulers.io()) .flatMap(repeat -> API.getStatus(checkoutId).toObservable()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(response -> { Log.d("DBG", "repeat polling."); if (response.status.equals("COMPLETED")) { Toast.makeText(this, "Checkout COMPLETED!", Toast.LENGTH_SHORT).show(); } }) .doOnError(throwable -> { Log.d("DBG", "polling has received error."); Toast.makeText(this, "Checkout failed.", Toast.LENGTH_SHORT).show(); }) .doOnComplete(() -> { Log.d("DBG", "stopped polling."); }) .takeWhile(response -> response.status.equals("PENDING")) // subscribeの直前で購読停止を判定する .subscribe(); // compositeDisposable.add(disposable); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JAVA KeyStore 作成手順 (windows)

備忘録として記事にしました。 はじめに Androidアプリをリリースする際、KeyStoreが必要になりました。 KeyStoreの作成手順を残しておきます。 JDKのインストール ・JDKのダウンロードをします https://www.oracle.com/java/technologies/javase-downloads.html Windows x64 Installerをクリック バージョン:jdk-16.0.1 I reviewed and accept the Oracle Technology Network License Agreement for Oracle Java SE (訳:Oracle JavaSEのOracleTechnologyNetworkライセンス契約を確認して同意します) にチェックを入れてexeファイルをダウンロード exeファイルを起動させるとセットアップ画面が出てきます 次へをクリック そのまま次へ インストールが始まります 完了したら閉じます KeyStoreの作成 先ほどインストールしたJDKを確認します。 僕の場合は前のバージョンのフォルダが残っています jdk-16.0.1のフォルダができていますね keytool.exeの場所を確認します この場所をコピーします Windows → Windowsシステムツール → ファイル名を指定して実行 を開き、[cmd]を記載したら Ctrl + Shift + Enter で開きます。 そうすることで管理者として実行することができます。 通常起動で作成しようとするとエラーになります。(僕はなりました) コマンドプロンプトが開けたら、cdコマンドでKeyStoreのある場所へ移動します。 cd C:\Program Files\Java\jdk-16.0.1\bin 移動したら keytoolコマンドをします。 keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 実行するとKeyStore生成の為の質問をされます。 下記はサンプル返答になります。 キーストアのパスワード:password 姓名:name 組織単位名:personal 組織名:personal 都市名:Shinagawa 都道府県:Tokyo 2文字国コード:JP ※キーストアのパスワードは忘れてしまうと大変困ることになります。  絶対に忘れないようにしましょう。 すべて書き終わるとjksファイルが C:\Program Files\Java\jdk-16.0.1\bin のフォルダ内に作成されます。 さいごに 間違いなどございましたらご教授ください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む